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:
13
lib/daemon.c
13
lib/daemon.c
@@ -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);
|
||||||
|
11
lib/daemon.h
11
lib/daemon.h
@@ -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);
|
||||||
|
@@ -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.
|
||||||
|
Reference in New Issue
Block a user