diff options
-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!"); } |