#include <unistd.h>
#include "fatal-signal.h"
#include "dirs.h"
+#include "lockfile.h"
+#include "timeval.h"
#include "util.h"
#define THIS_MODULE VLM_daemon
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. */
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
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. */
{
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 {
/* Child process. */
close(fds[0]);
make_pidfile();
- write(fds[1], &c, 1);
+ ignore(write(fds[1], &c, 1));
close(fds[1]);
setsid();
- chdir("/");
+ if (chdir_) {
+ ignore(chdir("/"));
+ }
+ time_postfork();
+ lockfile_postfork();
break;
case -1:
{
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);
}