mirror of
https://github.com/openvswitch/ovs
synced 2025-10-25 15:07:05 +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:
15
lib/daemon.c
15
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);
|
||||
|
||||
17
lib/daemon.h
17
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);
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user