[ovs-discuss] [PATCH 3/6] daemon: Provide option to not chdir to root

Justin Pettit jpettit at nicira.com
Wed Aug 5 23:48:56 UTC 2009


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 |    5 +++++
 3 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/lib/daemon.c b/lib/daemon.c
index 4ad4af4..a011d37 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 a54aa52..d62dd4f 100644
--- a/lib/daemon.h
+++ b/lib/daemon.h
@@ -17,12 +17,18 @@
 #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                  \
@@ -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 4ab6568..386977a 100644
--- a/lib/daemon.man
+++ b/lib/daemon.man
@@ -19,3 +19,8 @@ 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, the working directory is changed to the root directory.  Specify
+\fB--no-chdir\fR to prevent this.
-- 
1.5.5





More information about the discuss mailing list