diff options
author | erdgeist <> | 2013-03-02 03:08:10 +0000 |
---|---|---|
committer | erdgeist <> | 2013-03-02 03:08:10 +0000 |
commit | e4f6f5b57ffa8fd93b41829b7130ad7f46af26ba (patch) | |
tree | 354414cce31b3d8932d76da75463dca76e7ab4f4 | |
parent | 93c4554f62a1a8d9170e3acb4d7937691ea0fd58 (diff) |
Use sigaction instead of a signal handler to wait for the SIGHUP
-rw-r--r-- | jaildaemon.c | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/jaildaemon.c b/jaildaemon.c index 3ae8612..7dad058 100644 --- a/jaildaemon.c +++ b/jaildaemon.c | |||
@@ -36,7 +36,6 @@ typedef struct { | |||
36 | } daemon_task; | 36 | } daemon_task; |
37 | 37 | ||
38 | /* Forward declarations */ | 38 | /* Forward declarations */ |
39 | static void signal_handler( int signal ); | ||
40 | static void term_handler( int signal ); | 39 | static void term_handler( int signal ); |
41 | static void kill_all_probes( void ); | 40 | static void kill_all_probes( void ); |
42 | static int check_for_jail( int jid ); | 41 | static int check_for_jail( int jid ); |
@@ -49,14 +48,8 @@ static void exerr( char * message ); | |||
49 | static void warn( char * message ); | 48 | static void warn( char * message ); |
50 | static void usage( char * command ); | 49 | static void usage( char * command ); |
51 | 50 | ||
52 | /* This is the handler installed in the jailed process. It will exit with the | 51 | /* This handler ensures that we clean up our probes if asked to terminate |
53 | proper exit code to make the host system daemon recognize the process has | 52 | gracefully */ |
54 | deliberately killed itself and was not just shutdown with the jail */ | ||
55 | static void signal_handler( int signal ) { | ||
56 | if( signal == SIGHUP ) | ||
57 | _exit( MAGIC_EXIT_CODE ); | ||
58 | } | ||
59 | |||
60 | static void term_handler( int signal ) { | 53 | static void term_handler( int signal ) { |
61 | if( signal == SIGTERM ) | 54 | if( signal == SIGTERM ) |
62 | exit(0); | 55 | exit(0); |
@@ -174,28 +167,27 @@ static int check_for_jail( int jid ) { | |||
174 | } | 167 | } |
175 | 168 | ||
176 | static pid_t fork_and_jail( int jid, char * proctitle ) { | 169 | static pid_t fork_and_jail( int jid, char * proctitle ) { |
170 | int sig; | ||
177 | pid_t pid = fork(); | 171 | pid_t pid = fork(); |
178 | if( !pid ) { | 172 | if( !pid ) { |
179 | struct sigaction sa; | 173 | sigset_t sigset; |
180 | 174 | ||
181 | /* Set proctitle so that jail's pgrep -f can identify the process */ | 175 | /* Set proctitle so that jail's pgrep -f can identify the process */ |
182 | if( proctitle && *proctitle ) | 176 | if( proctitle && *proctitle ) |
183 | setproctitle( "%s", proctitle ); | 177 | setproctitle( "%s", proctitle ); |
184 | 178 | ||
185 | /* Setup signal handler for SIGHUP */ | ||
186 | sa.sa_handler = signal_handler; | ||
187 | sigemptyset(&sa.sa_mask); | ||
188 | sa.sa_flags = SA_RESTART; | ||
189 | if( sigaction(SIGHUP, &sa, NULL) == -1 ) | ||
190 | exerr( "when install signal handler" ); | ||
191 | |||
192 | /* Throw ourself into the jail */ | 179 | /* Throw ourself into the jail */ |
193 | if( jail_attach( jid ) ) | 180 | if( jail_attach( jid ) ) |
194 | exerr( "when attaching to jail" ); | 181 | exerr( "when attaching to jail" ); |
195 | 182 | ||
196 | /* Spin and wait for SIGHUP */ | 183 | /* wait for SIGHUP */ |
197 | while( 1 ) | 184 | sigemptyset(&sigset); |
198 | sleep(32); | 185 | sigaddset(&sigset, SIGHUP); |
186 | sigprocmask(SIG_BLOCK, &sigset, NULL); | ||
187 | while( !sigwait( &sigset, &sig ) ) | ||
188 | if( sig == SIGHUP ) | ||
189 | exit( MAGIC_EXIT_CODE ); | ||
190 | exit(0); | ||
199 | } | 191 | } |
200 | return pid; | 192 | return pid; |
201 | } | 193 | } |
@@ -281,7 +273,6 @@ static void fork_and_execve( int kq, daemon_task * t_in ) { | |||
281 | 273 | ||
282 | static void kill_all_probes( void ) { | 274 | static void kill_all_probes( void ) { |
283 | size_t i; | 275 | size_t i; |
284 | syslog( LOG_ERR, "KILLING PROBES" ); | ||
285 | if( g_probes ) | 276 | if( g_probes ) |
286 | for( i = 0; i < g_probes_size; ++i ) | 277 | for( i = 0; i < g_probes_size; ++i ) |
287 | if( g_probes[i] ) | 278 | if( g_probes[i] ) |