]> git.ozlabs.org Git - ccan/blobdiff - ccan/daemonize/daemonize.c
crypto/shachain/tools: update to new rbuf API.
[ccan] / ccan / daemonize / daemonize.c
index 861b0fc79cb961d5754899c23b31f0532f8edd32..bd32ecbbaeebc866426eb212ca3811264e060d21 100644 (file)
@@ -1,8 +1,10 @@
+/* Licensed under BSD-MIT - see LICENSE file for details */
 #include <ccan/daemonize/daemonize.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <fcntl.h>
 
 /* This code is based on Stevens Advanced Programming in the UNIX
  * Environment. */
@@ -13,18 +15,30 @@ bool daemonize(void)
        /* Separate from our parent via fork, so init inherits us. */
        if ((pid = fork()) < 0)
                return false;
+       /* use _exit() to avoid triggering atexit() processing */
        if (pid != 0)
-               exit(0);
+               _exit(0);
 
        /* Don't hold files open. */
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
 
+       /* Many routines write to stderr; that can cause chaos if used
+        * for something else, so set it here. */
+       if (open("/dev/null", O_WRONLY) != 0)
+               return false;
+       if (dup2(0, STDERR_FILENO) != STDERR_FILENO)
+               return false;
+       close(0);
+
        /* Session leader so ^C doesn't whack us. */
-       setsid();
+       if (setsid() == (pid_t)-1)
+               return false;
        /* Move off any mount points we might be in. */
-       chdir("/");
+       if (chdir("/") != 0)
+               return false;
+
        /* Discard our parent's old-fashioned umask prejudices. */
        umask(0);
        return true;