diff options
author | Mike Frysinger <vapier@gentoo.org> | 2009-08-12 21:03:02 -0400 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-08-13 17:25:30 +0200 |
commit | 499ed62dd790949c571517b54ef0e96fad26b16b (patch) | |
tree | 540ee08426ccabf4bb12b8058dc4491f9bbf7a55 | |
parent | c3e02bec3b69c386de72a2c66a63ecfaafa0db9e (diff) | |
download | mpd-499ed62dd790949c571517b54ef0e96fad26b16b.tar.gz mpd-499ed62dd790949c571517b54ef0e96fad26b16b.tar.xz mpd-499ed62dd790949c571517b54ef0e96fad26b16b.zip |
use daemon() when the C library provides it
For systems that cannot support fork() (like no-mmu Linux), use daemon() if
it is available for the daemonizing code.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/daemon.c | 24 |
2 files changed, 19 insertions, 7 deletions
diff --git a/configure.ac b/configure.ac index e828f4201..600b51df0 100644 --- a/configure.ac +++ b/configure.ac @@ -100,7 +100,7 @@ dnl dnl libc features dnl -AC_CHECK_FUNCS(syslog) +AC_CHECK_FUNCS(daemon fork syslog) if test $ac_cv_func_syslog = no; then # syslog is not in the default libraries. See if it's in some other. for lib in bsd socket inet; do diff --git a/src/daemon.c b/src/daemon.c index 5ae79e050..192fa8d37 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "config.h" #include "daemon.h" #include <glib.h> @@ -128,21 +129,28 @@ daemonize_set_user(void) static void daemonize_detach(void) { - pid_t pid; - /* flush all file handles before duplicating the buffers */ fflush(NULL); +#ifdef HAVE_DAEMON + + if (daemon(0, 1)) + g_error("daemon() failed: %s", g_strerror(errno)); + +#elif defined(HAVE_FORK) + /* detach from parent process */ - pid = fork(); - if (pid < 0) + switch (fork()) { + case -1: g_error("fork() failed: %s", g_strerror(errno)); - - if (pid > 0) + case 0: + break; + default: /* exit the parent process */ _exit(EXIT_SUCCESS); + } /* release the current working directory */ @@ -153,6 +161,10 @@ daemonize_detach(void) setsid(); +#else + g_error("no support for daemonizing"); +#endif + g_debug("daemonized!"); } |