From: Roy Marples Date: Sun, 3 Feb 2008 22:35:48 +0000 (+0000) Subject: We should block and reset our signals when daemonising also. X-Git-Tag: v3.2.3~38 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0cd986e35c1b771252dc28e7b8781a7a7e38f9e7;p=thirdparty%2Fdhcpcd.git We should block and reset our signals when daemonising also. --- diff --git a/client.c b/client.c index 163e9cd6..f52886bb 100644 --- a/client.c +++ b/client.c @@ -128,20 +128,33 @@ typedef struct _state { static pid_t daemonise (int *pidfd) { pid_t pid; + sigset_t full; + sigset_t old; +#ifdef THERE_IS_NO_FORK + char **argv; + int i; +#endif + + sigfillset (&full); + sigprocmask (SIG_SETMASK, &full, &old); #ifndef THERE_IS_NO_FORK logger (LOG_DEBUG, "forking to background"); - if ((pid = fork()) == -1) { - logger (LOG_ERR, "fork: %s", strerror (errno)); - exit (EXIT_FAILURE); + switch (pid = fork()) { + case -1: + logger (LOG_ERR, "fork: %s", strerror (errno)); + exit (EXIT_FAILURE); + /* NOT REACHED */ + case 0: + setsid (); + close_fds (); + break; + default: + /* Reset our signals as we're the parent about to exit. */ + signal_reset (); + break; } - - setsid (); - close_fds (); #else - char **argv; - int i; - logger (LOG_INFO, "forking to background"); /* We need to add --daemonise to our options */ @@ -161,6 +174,8 @@ static pid_t daemonise (int *pidfd) logger (LOG_ERR, "vfork: %s", strerror (errno)); _exit (EXIT_FAILURE); case 0: + signal_reset (); + sigprocmask (SIG_SETMASK, &old, NULL); execvp (dhcpcd, argv); logger (LOG_ERR, "execl `%s': %s", dhcpcd, strerror (errno)); @@ -175,8 +190,10 @@ static pid_t daemonise (int *pidfd) writepid (*pidfd, pid); close (*pidfd); *pidfd = -1; + } + sigprocmask (SIG_SETMASK, &old, NULL); return (pid); }