Branch data Line data Source code
1 : : /*
2 : : *****************************************************************************
3 : : *
4 : : * File: sig_handler.c
5 : : *
6 : : * Purpose: Signal handling dta and routines for fwknopd.
7 : : *
8 : : * Fwknop is developed primarily by the people listed in the file 'AUTHORS'.
9 : : * Copyright (C) 2009-2014 fwknop developers and contributors. For a full
10 : : * list of contributors, see the file 'CREDITS'.
11 : : *
12 : : * License (GNU General Public License):
13 : : *
14 : : * This program is free software; you can redistribute it and/or
15 : : * modify it under the terms of the GNU General Public License
16 : : * as published by the Free Software Foundation; either version 2
17 : : * of the License, or (at your option) any later version.
18 : : *
19 : : * This program is distributed in the hope that it will be useful,
20 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 : : * GNU General Public License for more details.
23 : : *
24 : : * You should have received a copy of the GNU General Public License
25 : : * along with this program; if not, write to the Free Software
26 : : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
27 : : * USA
28 : : *
29 : : *****************************************************************************
30 : : */
31 : : #include "fwknopd_common.h"
32 : : #include "log_msg.h"
33 : : #include "sig_handler.h"
34 : :
35 : : #if HAVE_SYS_WAIT_H
36 : : #include <sys/wait.h>
37 : : #endif
38 : :
39 : : sig_atomic_t got_signal = 0; /* General signal flag (break capture) */
40 : :
41 : : sig_atomic_t got_sighup = 0; /* SIGHUP flag */
42 : : sig_atomic_t got_sigint = 0; /* SIGINT flag */
43 : : sig_atomic_t got_sigterm = 0; /* SIGTERM flag */
44 : : sig_atomic_t got_sigusr1 = 0; /* SIGUSR1 flag */
45 : : sig_atomic_t got_sigusr2 = 0; /* SIGUSR2 flag */
46 : : sig_atomic_t got_sigchld = 0; /* SIGCHLD flag */
47 : :
48 : : sigset_t *csmask;
49 : :
50 : : /* SIGHUP Handler
51 : : */
52 : : void
53 : 6077 : sig_handler(int sig)
54 : : {
55 : : int o_errno;
56 : 6077 : got_signal = sig;
57 : :
58 [ - + + - : 6077 : switch(sig) {
+ + - ]
59 : : case SIGHUP:
60 : 0 : got_sighup = 1;
61 : 0 : return;
62 : : case SIGINT:
63 : 1 : got_sigint = 1;
64 : 1 : return;
65 : : case SIGTERM:
66 : 413 : got_sigterm = 1;
67 : 413 : return;
68 : : case SIGUSR1:
69 : 0 : got_sigusr1 = 1;
70 : 0 : return;
71 : : case SIGUSR2:
72 : 1 : got_sigusr2 = 1;
73 : 1 : return;
74 : : case SIGCHLD:
75 : 5662 : o_errno = errno; /* Save errno */
76 : 5662 : got_sigchld = 1;
77 : 5662 : waitpid(-1, NULL, WNOHANG);
78 : 5662 : errno = o_errno; /* restore errno (in case reset by waitpid) */
79 : 5662 : return;
80 : : }
81 : : }
82 : :
83 : : /* Setup signal handlers
84 : : */
85 : : int
86 : 443 : set_sig_handlers(void)
87 : : {
88 : 443 : int err = 0;
89 : : struct sigaction act;
90 : :
91 : : /* Clear the signal flags.
92 : : */
93 : 443 : got_signal = 0;
94 : 443 : got_sighup = 0;
95 : 443 : got_sigint = 0;
96 : 443 : got_sigterm = 0;
97 : 443 : got_sigusr1 = 0;
98 : 443 : got_sigusr2 = 0;
99 : :
100 : : /* Setup the handlers
101 : : */
102 : 443 : act.sa_handler = sig_handler;
103 : 443 : sigemptyset(&act.sa_mask);
104 : 443 : act.sa_flags = SA_RESTART;
105 : :
106 [ - + ]: 443 : if(sigaction(SIGHUP, &act, NULL) < 0)
107 : : {
108 : 0 : log_msg(LOG_ERR, "* Error setting SIGHUP handler: %s",
109 : 0 : strerror(errno));
110 : 0 : err++;
111 : : }
112 : :
113 [ - + ]: 443 : if(sigaction(SIGINT, &act, NULL) < 0)
114 : : {
115 : 0 : log_msg(LOG_ERR, "* Error setting SIGINT handler: %s",
116 : 0 : strerror(errno));
117 : 0 : err++;
118 : : }
119 : :
120 [ - + ]: 443 : if(sigaction(SIGTERM, &act, NULL) < 0)
121 : : {
122 : 0 : log_msg(LOG_ERR, "* Error setting SIGTERM handler: %s",
123 : 0 : strerror(errno));
124 : 0 : err++;
125 : : }
126 : :
127 [ - + ]: 443 : if(sigaction(SIGUSR1, &act, NULL) < 0)
128 : : {
129 : 0 : log_msg(LOG_ERR, "* Error setting SIGUSR1 handler: %s",
130 : 0 : strerror(errno));
131 : 0 : err++;
132 : : }
133 : :
134 [ - + ]: 443 : if(sigaction(SIGUSR2, &act, NULL) < 0)
135 : : {
136 : 0 : log_msg(LOG_ERR, "* Error setting SIGUSR2 handler: %s",
137 : 0 : strerror(errno));
138 : 0 : err++;
139 : : }
140 : :
141 [ - + ]: 443 : if(sigaction(SIGCHLD, &act, NULL) < 0)
142 : : {
143 : 0 : log_msg(LOG_ERR, "* Error setting SIGCHLD handler: %s",
144 : 0 : strerror(errno));
145 : 0 : err++;
146 : : }
147 : :
148 : 443 : return(err);
149 : : }
150 : :
151 : : int
152 : 20652 : sig_do_stop(void)
153 : : {
154 : : /* Any signal except USR1, USR2, and SIGCHLD mean break the loop.
155 : : */
156 [ + + ]: 20652 : if(got_signal != 0)
157 : : {
158 [ + + ][ + + ]: 1799 : if(got_sigint || got_sigterm || got_sighup)
[ + - ]
159 : : {
160 : : return 1;
161 : : }
162 [ + - ][ + + ]: 1384 : else if(got_sigusr1 || got_sigusr2)
163 : : {
164 : : /* Not doing anything with these yet.
165 : : */
166 : 1 : got_sigusr1 = got_sigusr2 = 0;
167 : 1 : got_signal = 0;
168 : : }
169 : : else
170 : 1383 : got_signal = 0;
171 : : }
172 : : return 0;
173 : : }
174 : :
175 : : /***EOF***/
|