/* Create pidfile even if one already exists and is locked? */
static bool force;
+/* 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. */
char *
return pidfile;
}
+/* Sets that we do not chdir to "/". */
+void
+set_no_chdir(void)
+{
+ chdir_ = false;
+}
+
/* 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. */
write(fds[1], &c, 1);
close(fds[1]);
setsid();
- chdir("/");
+ if (chdir_) {
+ chdir("/");
+ }
break;
case -1:
printf(
"\nDaemon options:\n"
" -D, --detach run in background as daemon\n"
+ " --no-chdir do not chdir to '/'\n"
" -P, --pidfile[=FILE] create pidfile (default: %s/%s.pid)\n"
" -f, --force with -P, start even if already running\n",
ovs_rundir, program_name);
#ifndef DAEMON_H
#define DAEMON_H 1
+#include <limits.h>
#include <stdbool.h>
#include <sys/types.h>
-#define DAEMON_LONG_OPTIONS \
- {"detach", no_argument, 0, 'D'}, \
- {"force", no_argument, 0, 'f'}, \
+enum {
+ OPT_NO_CHDIR = UCHAR_MAX + 2048
+};
+
+#define DAEMON_LONG_OPTIONS \
+ {"detach", no_argument, 0, 'D'}, \
+ {"no-chdir", no_argument, 0, OPT_NO_CHDIR}, \
+ {"force", no_argument, 0, 'f'}, \
{"pidfile", optional_argument, 0, 'P'}
#define DAEMON_OPTION_HANDLERS \
set_detach(); \
break; \
\
+ case OPT_NO_CHDIR: \
+ set_no_chdir(); \
+ break; \
+ \
case 'P': \
set_pidfile(optarg); \
break; \
char *make_pidfile_name(const char *name);
void set_pidfile(const char *name);
const char *get_pidfile(void);
+void set_no_chdir(void);
void set_detach(void);
void daemonize(void);
void die_if_already_running(void);
\fB-D\fR, \fB--detach\fR
Causes \fB\*(PN\fR to detach itself from the foreground session and
run as a background process.
+
+.TP
+\fB--no-chdir\fR
+By default, when \fB-D\fR or \fB--detach\fR is specified, \fB\*(PN\fR
+changes its current working directory to the root directory after it
+detaches. Otherwise, invoking \fB\*(PN\fR from a carelessly chosen
+directory would prevent the administrator from unmounting the file
+system that holds that directory.
+.IP
+Specifying \fB--no-chdir\fR suppresses this behavior, preventing
+\fB\*(PN\fR from changing its current working directory. This may be
+useful for collecting core files, since it is common behavior to write
+core dumps into the current working directory and the root directory
+is not a good directory to use.
+.IP
+This option has no effect when neither \fB-D\fR nor \fB--detach\fR is
+specified.