X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdaemon.c;h=84ed6147169e6bddf57cda35f28cd591c2046ee3;hb=48d84b1706f76882bc5265c09257e70899fb9c41;hp=a2eff07c038c0c3c53ccbbce57de9d2086ae2a85;hpb=8aee05ccf4818ea3a070163f7d3dc43126d8443e;p=openvswitch diff --git a/lib/daemon.c b/lib/daemon.c index a2eff07c..84ed6147 100644 --- a/lib/daemon.c +++ b/lib/daemon.c @@ -39,7 +39,8 @@ VLOG_DEFINE_THIS_MODULE(daemon); /* --detach: Should we run in the background? */ -static bool detach; +static bool detach; /* Was --detach specified? */ +static bool detached; /* Have we already detached? */ /* --pidfile: Name of pidfile (null if none). */ static char *pidfile; @@ -513,22 +514,38 @@ daemonize_start(void) } /* If daemonization is configured, then this function notifies the parent - * process that the child process has completed startup successfully. + * process that the child process has completed startup successfully. It also + * call daemonize_post_detach(). * * Calling this function more than once has no additional effect. */ void daemonize_complete(void) { - fork_notify_startup(daemonize_fd); - daemonize_fd = -1; + if (!detached) { + detached = true; + + fork_notify_startup(daemonize_fd); + daemonize_fd = -1; + daemonize_post_detach(); + } +} +/* If daemonization is configured, then this function does traditional Unix + * daemonization behavior: join a new session, chdir to the root (if not + * disabled), and close the standard file descriptors. + * + * It only makes sense to call this function as part of an implementation of a + * special daemon subprocess. A normal daemon should just call + * daemonize_complete(). */ +void +daemonize_post_detach(void) +{ if (detach) { setsid(); if (chdir_) { ignore(chdir("/")); } close_standard_fds(); - detach = false; } }