xref: /aosp_15_r20/external/ltp/include/lapi/safe_rt_signal.h (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker /*
2*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (c) 2018 Cyril Hrubis <[email protected]>
3*49cdfc7eSAndroid Build Coastguard Worker  */
4*49cdfc7eSAndroid Build Coastguard Worker 
5*49cdfc7eSAndroid Build Coastguard Worker #ifndef SAFE_RT_SIGNAL_H__
6*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_RT_SIGNAL_H__
7*49cdfc7eSAndroid Build Coastguard Worker 
8*49cdfc7eSAndroid Build Coastguard Worker #include <signal.h>
9*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/rt_sigaction.h"
10*49cdfc7eSAndroid Build Coastguard Worker 
safe_rt_sigaction(const char * file,const int lineno,int signum,const struct sigaction * act,struct sigaction * oact,size_t sigsetsize)11*49cdfc7eSAndroid Build Coastguard Worker static inline int safe_rt_sigaction(const char *file, const int lineno,
12*49cdfc7eSAndroid Build Coastguard Worker                                     int signum, const struct sigaction *act,
13*49cdfc7eSAndroid Build Coastguard Worker                                     struct sigaction *oact, size_t sigsetsize)
14*49cdfc7eSAndroid Build Coastguard Worker {
15*49cdfc7eSAndroid Build Coastguard Worker 	int ret;
16*49cdfc7eSAndroid Build Coastguard Worker 
17*49cdfc7eSAndroid Build Coastguard Worker 	ret = ltp_rt_sigaction(signum, act, oact, sigsetsize);
18*49cdfc7eSAndroid Build Coastguard Worker 
19*49cdfc7eSAndroid Build Coastguard Worker 	if (ret == -1) {
20*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
21*49cdfc7eSAndroid Build Coastguard Worker 			"ltp_rt_sigaction(%i, %p, %p, %zu) failed",
22*49cdfc7eSAndroid Build Coastguard Worker 			signum, act, oact, sigsetsize);
23*49cdfc7eSAndroid Build Coastguard Worker 	} else if (ret) {
24*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
25*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid ltp_rt_sigaction(%i, %p, %p, %zu) return value %d",
26*49cdfc7eSAndroid Build Coastguard Worker 			signum, act, oact, sigsetsize, ret);
27*49cdfc7eSAndroid Build Coastguard Worker 	}
28*49cdfc7eSAndroid Build Coastguard Worker 
29*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
30*49cdfc7eSAndroid Build Coastguard Worker }
31*49cdfc7eSAndroid Build Coastguard Worker 
32*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_RT_SIGACTION(signum, act, oldact, sigsetsize) \
33*49cdfc7eSAndroid Build Coastguard Worker 	safe_rt_sigaction(__FILE__, __LINE__, signum, act, oldact, sigsetsize)
34*49cdfc7eSAndroid Build Coastguard Worker 
35*49cdfc7eSAndroid Build Coastguard Worker 
safe_rt_sigprocmask(const char * file,const int lineno,int how,const sigset_t * set,sigset_t * oldset,size_t sigsetsize)36*49cdfc7eSAndroid Build Coastguard Worker static inline int safe_rt_sigprocmask(const char *file, const int lineno,
37*49cdfc7eSAndroid Build Coastguard Worker                                       int how, const sigset_t *set,
38*49cdfc7eSAndroid Build Coastguard Worker                                       sigset_t *oldset, size_t sigsetsize)
39*49cdfc7eSAndroid Build Coastguard Worker {
40*49cdfc7eSAndroid Build Coastguard Worker 	int ret;
41*49cdfc7eSAndroid Build Coastguard Worker 
42*49cdfc7eSAndroid Build Coastguard Worker 	ret = tst_syscall(__NR_rt_sigprocmask, how, set, oldset, sigsetsize);
43*49cdfc7eSAndroid Build Coastguard Worker 	if (ret == -1) {
44*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
45*49cdfc7eSAndroid Build Coastguard Worker 			"rt_sigprocmask(%i, %p, %p, %zu) failed",
46*49cdfc7eSAndroid Build Coastguard Worker 			how, set, oldset, sigsetsize);
47*49cdfc7eSAndroid Build Coastguard Worker 	} else if (ret) {
48*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
49*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid rt_sigprocmask(%i, %p, %p, %zu) return value %d",
50*49cdfc7eSAndroid Build Coastguard Worker 			how, set, oldset, sigsetsize, ret);
51*49cdfc7eSAndroid Build Coastguard Worker 	}
52*49cdfc7eSAndroid Build Coastguard Worker 
53*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
54*49cdfc7eSAndroid Build Coastguard Worker }
55*49cdfc7eSAndroid Build Coastguard Worker 
56*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_RT_SIGPROCMASK(how, set, oldset, sigsetsize) \
57*49cdfc7eSAndroid Build Coastguard Worker 	safe_rt_sigprocmask(__FILE__, __LINE__, how, set, oldset, sigsetsize)
58*49cdfc7eSAndroid Build Coastguard Worker 
59*49cdfc7eSAndroid Build Coastguard Worker #endif /* SAFE_RT_SIGNAL_H__ */
60