daemon: Provide option to not chdir to root
authorJustin Pettit <jpettit@nicira.com>
Wed, 5 Aug 2009 05:41:46 +0000 (22:41 -0700)
committerJustin Pettit <jpettit@nicira.com>
Fri, 7 Aug 2009 01:04:36 +0000 (18:04 -0700)
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
lib/daemon.h
lib/daemon.man

index 4ad4af4..a011d37 100644 (file)
@@ -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);
index a54aa52..d62dd4f 100644 (file)
 #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;                              \
@@ -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);
index 4ab6568..cc1a2b5 100644 (file)
@@ -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.