8 #include <sys/signal.h>
12 #define ADD_REF(__tbl) (__tbl)->active++
13 #define SUB_REF(__tbl) --(__tbl)->active
15 #include <rpm/rpmsq.h>
19 static sigset_t rpmsqCaught;
21 typedef struct rpmsig_s * rpmsig;
23 static struct rpmsig_s {
25 rpmsqAction_t handler;
27 struct sigaction oact;
29 { SIGINT, rpmsqAction },
30 #define rpmsigTbl_sigint (&rpmsigTbl[0])
31 { SIGQUIT, rpmsqAction },
32 #define rpmsigTbl_sigquit (&rpmsigTbl[1])
33 { SIGHUP, rpmsqAction },
34 #define rpmsigTbl_sighup (&rpmsigTbl[3])
35 { SIGTERM, rpmsqAction },
36 #define rpmsigTbl_sigterm (&rpmsigTbl[4])
37 { SIGPIPE, rpmsqAction },
38 #define rpmsigTbl_sigpipe (&rpmsigTbl[5])
42 int rpmsqIsCaught(int signum)
44 return sigismember(&rpmsqCaught, signum);
48 void rpmsqAction(int signum, siginfo_t * info, void * context)
50 void rpmsqAction(int signum)
56 for (tbl = rpmsigTbl; tbl->signum >= 0; tbl++) {
57 if (tbl->signum != signum)
60 (void) sigaddset(&rpmsqCaught, signum);
66 int rpmsqEnable(int signum, rpmsqAction_t handler)
68 int tblsignum = (signum >= 0 ? signum : -signum);
73 for (tbl = rpmsigTbl; tbl->signum >= 0; tbl++) {
74 if (tblsignum != tbl->signum)
77 if (signum >= 0) { /* Enable. */
78 if (ADD_REF(tbl) <= 0) {
79 (void) sigdelset(&rpmsqCaught, tbl->signum);
81 /* XXX Don't set a signal handler if already SIG_IGN */
82 (void) sigaction(tbl->signum, NULL, &tbl->oact);
83 if (tbl->oact.sa_handler == SIG_IGN)
86 (void) sigemptyset (&sa.sa_mask);
88 sa.sa_flags = SA_SIGINFO;
92 sa.sa_sigaction = (handler != NULL ? handler : tbl->handler);
93 if (sigaction(tbl->signum, &sa, &tbl->oact) < 0) {
97 tbl->active = 1; /* XXX just in case */
99 tbl->handler = handler;
101 } else { /* Disable. */
102 if (SUB_REF(tbl) <= 0) {
103 if (sigaction(tbl->signum, &tbl->oact, NULL) < 0)
105 tbl->active = 0; /* XXX just in case */
106 tbl->handler = (handler != NULL ? handler : rpmsqAction);