From 91a1e24d09ba1f08b1f8c08815f595187c6ef946 Mon Sep 17 00:00:00 2001 From: Justin Pettit Date: Tue, 4 Aug 2009 22:41:46 -0700 Subject: [PATCH] daemon: Provide option to not chdir to root By default, Open vSwitch daemons change their working directories to the root directory. This commit provides a --no-chdir option to prevent this behavior. --- lib/daemon.c | 15 ++++++++++++++- lib/daemon.h | 17 ++++++++++++++--- lib/daemon.man | 17 +++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/lib/daemon.c b/lib/daemon.c index 4ad4af4c..a011d37f 100644 --- a/lib/daemon.c +++ b/lib/daemon.c @@ -37,6 +37,9 @@ static char *pidfile; /* 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 * @@ -69,6 +72,13 @@ get_pidfile(void) 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. */ @@ -209,7 +219,9 @@ daemonize(void) write(fds[1], &c, 1); close(fds[1]); setsid(); - chdir("/"); + if (chdir_) { + chdir("/"); + } break; case -1: @@ -228,6 +240,7 @@ daemon_usage(void) 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); diff --git a/lib/daemon.h b/lib/daemon.h index a54aa520..d62dd4f0 100644 --- a/lib/daemon.h +++ b/lib/daemon.h @@ -17,12 +17,18 @@ #ifndef DAEMON_H #define DAEMON_H 1 +#include #include #include -#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 \ @@ -30,6 +36,10 @@ set_detach(); \ break; \ \ + case OPT_NO_CHDIR: \ + set_no_chdir(); \ + break; \ + \ case 'P': \ set_pidfile(optarg); \ break; \ @@ -41,6 +51,7 @@ 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); diff --git a/lib/daemon.man b/lib/daemon.man index 4ab65680..cc1a2b56 100644 --- a/lib/daemon.man +++ b/lib/daemon.man @@ -19,3 +19,20 @@ effect. \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. -- 2.30.2