[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