X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=daemon.c;h=c47aa954fd8a1bfc94cd3a3c379500ddc8a22a93;hp=ffdec4e35f3e8cdbd113a780f6d6ade7faf9fcfe;hb=748d1368bc96dd7e1af879df1ea41b4d52842f7e;hpb=63aab30b55d5809704a2d0e1c4e8de20e8228d7d diff --git a/daemon.c b/daemon.c index ffdec4e3..c47aa954 100644 --- a/daemon.c +++ b/daemon.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2011 Andre Noll + * Copyright (C) 1997-2012 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -11,7 +11,7 @@ #include /* getgrnam() */ #include #include -#include +#include #include "para.h" #include "daemon.h" @@ -142,14 +142,25 @@ static bool daemon_test_flag(unsigned flag) return me->flags & flag; } +static void dummy_sighandler(__a_unused int s) +{ +} + /** * Do the usual stuff to become a daemon. * - * Fork, become session leader, dup fd 0, 1, 2 to /dev/null. + * \param parent_waits Whether the parent process should pause before exit. * - * \sa fork(2), setsid(2), dup(2). + * Fork, become session leader, cd to /, and dup fd 0, 1, 2 to /dev/null. If \a + * parent_waits is false, the parent process terminates immediately. + * Otherwise, it calls pause() to sleep until it receives \p SIGTERM or \p + * SIGCHLD and exits successfully thereafter. This behaviour is useful if the + * daemon process should not detach from the console until the child process + * has completed its setup. + * + * \sa fork(2), setsid(2), dup(2), pause(2). */ -void daemonize(void) +void daemonize(bool parent_waits) { pid_t pid; int null; @@ -158,8 +169,14 @@ void daemonize(void) pid = fork(); if (pid < 0) goto err; - if (pid) + if (pid) { + if (parent_waits) { + signal(SIGTERM, dummy_sighandler); + signal(SIGCHLD, dummy_sighandler); + pause(); + } exit(EXIT_SUCCESS); /* parent exits */ + } /* become session leader */ if (setsid() < 0) goto err; @@ -339,7 +356,7 @@ __malloc char *get_server_uptime_str(const struct timeval *current_time) * \param ll The log level. * \param fmt The format string describing the log message. */ -__printf_2_3 void para_log(int ll, const char* fmt,...) +__printf_2_3 void daemon_log(int ll, const char* fmt,...) { va_list argp; FILE *fp;