X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdaemon.c;h=0dcc66ff742c10e48275f4adb9694a6712c93850;hb=02630ff2dcfc90fa7b83afd4c6953dd7ce05a790;hp=4ad4af4c607a9eca9fa961750d79ac36eae165a5;hpb=a14bc59fb8f27db193d74662dc9c5cb8237177ef;p=sliver-openvswitch.git diff --git a/lib/daemon.c b/lib/daemon.c index 4ad4af4c6..0dcc66ff7 100644 --- a/lib/daemon.c +++ b/lib/daemon.c @@ -23,6 +23,8 @@ #include #include "fatal-signal.h" #include "dirs.h" +#include "lockfile.h" +#include "timeval.h" #include "util.h" #define THIS_MODULE VLM_daemon @@ -35,7 +37,10 @@ static bool detach; static char *pidfile; /* Create pidfile even if one already exists and is locked? */ -static bool force; +static bool overwrite_pidfile; + +/* Should we chdir to "/". */ +static bool chdir_ = true; /* Returns the file name that would be used for a pidfile if 'name' were * provided to set_pidfile(). The caller must free the returned string. */ @@ -69,13 +74,27 @@ get_pidfile(void) return pidfile; } +/* Sets that we do not chdir to "/". */ +void +set_no_chdir(void) +{ + chdir_ = false; +} + +/* Will we chdir to "/" as part of daemonizing? */ +bool +is_chdir_enabled(void) +{ + return chdir_; +} + /* Normally, die_if_already_running() will terminate the program with a message * if a locked pidfile already exists. If this function is called, * die_if_already_running() will merely log a warning. */ void ignore_existing_pidfile(void) { - force = true; + overwrite_pidfile = true; } /* Sets up a following call to daemonize() to detach from the foreground @@ -86,6 +105,13 @@ set_detach(void) detach = true; } +/* Will daemonize() really detach? */ +bool +get_detach(void) +{ + return detach; +} + /* If a pidfile has been configured and that pidfile already exists and is * locked by a running process, returns the pid of the running process. * Otherwise, returns 0. */ @@ -117,7 +143,7 @@ die_if_already_running(void) { pid_t pid = already_running(); if (pid) { - if (!force) { + if (!overwrite_pidfile) { ovs_fatal(0, "%s: already running as pid %ld", get_pidfile(), (long int) pid); } else { @@ -209,7 +235,11 @@ daemonize(void) write(fds[1], &c, 1); close(fds[1]); setsid(); - chdir("/"); + if (chdir_) { + chdir("/"); + } + time_postfork(); + lockfile_postfork(); break; case -1: @@ -227,9 +257,11 @@ daemon_usage(void) { printf( "\nDaemon options:\n" - " -D, --detach run in background as daemon\n" - " -P, --pidfile[=FILE] create pidfile (default: %s/%s.pid)\n" - " -f, --force with -P, start even if already running\n", + " --detach run in background as daemon\n" + " --no-chdir do not chdir to '/'\n" + " --pidfile[=FILE] create pidfile (default: %s/%s.pid)\n" + " --overwrite-pidfile with --pidfile, start even if already " + "running\n", ovs_rundir, program_name); }