From 499ed62dd790949c571517b54ef0e96fad26b16b Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Wed, 12 Aug 2009 21:03:02 -0400 Subject: 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 --- configure.ac | 2 +- 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 @@ -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!"); } -- cgit v1.2.3