1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date Author Notes
8*10465441SEvalZero * 2017/10/1 Bernard The first version
9*10465441SEvalZero */
10*10465441SEvalZero #include <rthw.h>
11*10465441SEvalZero #include <rtthread.h>
12*10465441SEvalZero
13*10465441SEvalZero #include <time.h>
14*10465441SEvalZero
15*10465441SEvalZero #include "posix_signal.h"
16*10465441SEvalZero #define sig_valid(sig_no) (sig_no >= 0 && sig_no < RT_SIG_MAX)
17*10465441SEvalZero
signal(int sig,void (* func)(int))18*10465441SEvalZero void (*signal(int sig, void (*func)(int))) (int)
19*10465441SEvalZero {
20*10465441SEvalZero return rt_signal_install(sig, func);
21*10465441SEvalZero }
22*10465441SEvalZero
sigprocmask(int how,const sigset_t * set,sigset_t * oset)23*10465441SEvalZero int sigprocmask (int how, const sigset_t *set, sigset_t *oset)
24*10465441SEvalZero {
25*10465441SEvalZero rt_base_t level;
26*10465441SEvalZero rt_thread_t tid;
27*10465441SEvalZero
28*10465441SEvalZero tid = rt_thread_self();
29*10465441SEvalZero
30*10465441SEvalZero level = rt_hw_interrupt_disable();
31*10465441SEvalZero if (oset) *oset = tid->sig_mask;
32*10465441SEvalZero
33*10465441SEvalZero if (set)
34*10465441SEvalZero {
35*10465441SEvalZero switch(how)
36*10465441SEvalZero {
37*10465441SEvalZero case SIG_BLOCK:
38*10465441SEvalZero tid->sig_mask |= *set;
39*10465441SEvalZero break;
40*10465441SEvalZero case SIG_UNBLOCK:
41*10465441SEvalZero tid->sig_mask &= ~*set;
42*10465441SEvalZero break;
43*10465441SEvalZero case SIG_SETMASK:
44*10465441SEvalZero tid->sig_mask = *set;
45*10465441SEvalZero break;
46*10465441SEvalZero default:
47*10465441SEvalZero break;
48*10465441SEvalZero }
49*10465441SEvalZero }
50*10465441SEvalZero rt_hw_interrupt_enable(level);
51*10465441SEvalZero
52*10465441SEvalZero return 0;
53*10465441SEvalZero }
54*10465441SEvalZero
sigaction(int signum,const struct sigaction * act,struct sigaction * oldact)55*10465441SEvalZero int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)
56*10465441SEvalZero {
57*10465441SEvalZero rt_sighandler_t old = RT_NULL;
58*10465441SEvalZero
59*10465441SEvalZero if (!sig_valid(signum)) return -RT_ERROR;
60*10465441SEvalZero
61*10465441SEvalZero if (act)
62*10465441SEvalZero old = rt_signal_install(signum, act->sa_handler);
63*10465441SEvalZero else
64*10465441SEvalZero {
65*10465441SEvalZero old = rt_signal_install(signum, RT_NULL);
66*10465441SEvalZero rt_signal_install(signum, old);
67*10465441SEvalZero }
68*10465441SEvalZero
69*10465441SEvalZero if (oldact)
70*10465441SEvalZero oldact->sa_handler = old;
71*10465441SEvalZero
72*10465441SEvalZero return 0;
73*10465441SEvalZero }
74*10465441SEvalZero
sigtimedwait(const sigset_t * set,siginfo_t * info,const struct timespec * timeout)75*10465441SEvalZero int sigtimedwait(const sigset_t *set, siginfo_t *info,
76*10465441SEvalZero const struct timespec *timeout)
77*10465441SEvalZero {
78*10465441SEvalZero int ret = 0;
79*10465441SEvalZero int tick = RT_WAITING_FOREVER;
80*10465441SEvalZero
81*10465441SEvalZero #ifdef RT_USING_PTHREADS
82*10465441SEvalZero if (timeout)
83*10465441SEvalZero {
84*10465441SEvalZero extern int clock_time_to_tick(const struct timespec *time);
85*10465441SEvalZero tick = clock_time_to_tick(timeout);
86*10465441SEvalZero }
87*10465441SEvalZero #endif
88*10465441SEvalZero
89*10465441SEvalZero ret = rt_signal_wait(set, info, tick);
90*10465441SEvalZero if (ret == 0) return 0;
91*10465441SEvalZero
92*10465441SEvalZero errno = ret;
93*10465441SEvalZero return -1;
94*10465441SEvalZero }
95*10465441SEvalZero
sigwait(const sigset_t * set,int * sig)96*10465441SEvalZero int sigwait(const sigset_t *set, int *sig)
97*10465441SEvalZero {
98*10465441SEvalZero siginfo_t si;
99*10465441SEvalZero if (sigtimedwait(set, &si, 0) < 0)
100*10465441SEvalZero return -1;
101*10465441SEvalZero
102*10465441SEvalZero *sig = si.si_signo;
103*10465441SEvalZero return 0;
104*10465441SEvalZero }
105*10465441SEvalZero
sigwaitinfo(const sigset_t * set,siginfo_t * info)106*10465441SEvalZero int sigwaitinfo(const sigset_t *set, siginfo_t *info)
107*10465441SEvalZero {
108*10465441SEvalZero return sigtimedwait(set, info, NULL);
109*10465441SEvalZero }
110*10465441SEvalZero
raise(int sig)111*10465441SEvalZero int raise(int sig)
112*10465441SEvalZero {
113*10465441SEvalZero rt_thread_kill(rt_thread_self(), sig);
114*10465441SEvalZero return 0;
115*10465441SEvalZero }
116*10465441SEvalZero
117