xref: /nrf52832-nimble/rt-thread/components/libc/signal/posix_signal.c (revision 104654410c56c573564690304ae786df310c91fc)
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