X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;ds=sidebyside;f=ccan%2Fdaemonize%2Fdaemonize.c;h=bd32ecbbaeebc866426eb212ca3811264e060d21;hb=7d1f0c73e4d321561abb74f82c8be97f10d69836;hp=861b0fc79cb961d5754899c23b31f0532f8edd32;hpb=75a2f5a4b855ba9efd9e6de954eb35fda633909e;p=ccan diff --git a/ccan/daemonize/daemonize.c b/ccan/daemonize/daemonize.c index 861b0fc7..bd32ecbb 100644 --- a/ccan/daemonize/daemonize.c +++ b/ccan/daemonize/daemonize.c @@ -1,8 +1,10 @@ +/* Licensed under BSD-MIT - see LICENSE file for details */ #include #include #include #include #include +#include /* 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;