2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-19 14:37:21 +00:00

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.
This commit is contained in:
Justin Pettit
2009-08-04 22:41:46 -07:00
parent c4fca56af2
commit 91a1e24d09
3 changed files with 45 additions and 4 deletions

View File

@@ -37,6 +37,9 @@ static char *pidfile;
/* Create pidfile even if one already exists and is locked? */ /* Create pidfile even if one already exists and is locked? */
static bool force; 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 /* 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. */ * provided to set_pidfile(). The caller must free the returned string. */
char * char *
@@ -69,6 +72,13 @@ get_pidfile(void)
return pidfile; 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 /* Normally, die_if_already_running() will terminate the program with a message
* if a locked pidfile already exists. If this function is called, * if a locked pidfile already exists. If this function is called,
* die_if_already_running() will merely log a warning. */ * die_if_already_running() will merely log a warning. */
@@ -209,7 +219,9 @@ daemonize(void)
write(fds[1], &c, 1); write(fds[1], &c, 1);
close(fds[1]); close(fds[1]);
setsid(); setsid();
if (chdir_) {
chdir("/"); chdir("/");
}
break; break;
case -1: case -1:
@@ -228,6 +240,7 @@ daemon_usage(void)
printf( printf(
"\nDaemon options:\n" "\nDaemon options:\n"
" -D, --detach run in background as daemon\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" " -P, --pidfile[=FILE] create pidfile (default: %s/%s.pid)\n"
" -f, --force with -P, start even if already running\n", " -f, --force with -P, start even if already running\n",
ovs_rundir, program_name); ovs_rundir, program_name);

View File

@@ -17,11 +17,17 @@
#ifndef DAEMON_H #ifndef DAEMON_H
#define DAEMON_H 1 #define DAEMON_H 1
#include <limits.h>
#include <stdbool.h> #include <stdbool.h>
#include <sys/types.h> #include <sys/types.h>
enum {
OPT_NO_CHDIR = UCHAR_MAX + 2048
};
#define DAEMON_LONG_OPTIONS \ #define DAEMON_LONG_OPTIONS \
{"detach", no_argument, 0, 'D'}, \ {"detach", no_argument, 0, 'D'}, \
{"no-chdir", no_argument, 0, OPT_NO_CHDIR}, \
{"force", no_argument, 0, 'f'}, \ {"force", no_argument, 0, 'f'}, \
{"pidfile", optional_argument, 0, 'P'} {"pidfile", optional_argument, 0, 'P'}
@@ -30,6 +36,10 @@
set_detach(); \ set_detach(); \
break; \ break; \
\ \
case OPT_NO_CHDIR: \
set_no_chdir(); \
break; \
\
case 'P': \ case 'P': \
set_pidfile(optarg); \ set_pidfile(optarg); \
break; \ break; \
@@ -41,6 +51,7 @@
char *make_pidfile_name(const char *name); char *make_pidfile_name(const char *name);
void set_pidfile(const char *name); void set_pidfile(const char *name);
const char *get_pidfile(void); const char *get_pidfile(void);
void set_no_chdir(void);
void set_detach(void); void set_detach(void);
void daemonize(void); void daemonize(void);
void die_if_already_running(void); void die_if_already_running(void);

View File

@@ -19,3 +19,20 @@ effect.
\fB-D\fR, \fB--detach\fR \fB-D\fR, \fB--detach\fR
Causes \fB\*(PN\fR to detach itself from the foreground session and Causes \fB\*(PN\fR to detach itself from the foreground session and
run as a background process. 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.