summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/install.c72
-rw-r--r--src/socket.c2
-rw-r--r--src/util.c19
-rw-r--r--src/util.h2
4 files changed, 65 insertions, 30 deletions
diff --git a/src/install.c b/src/install.c
index 3b70bd1d3d..a05002d073 100644
--- a/src/install.c
+++ b/src/install.c
@@ -32,6 +32,7 @@
#include "strv.h"
#include "conf-parser.h"
#include "dbus-common.h"
+#include "sd-daemon.h"
static bool arg_force = false;
@@ -49,11 +50,12 @@ static enum {
} arg_action = ACTION_INVALID;
static enum {
- START_NO, /* Don't start/stop or anything */
- START_MINIMAL, /* Only shutdown/restart if running. */
- START_MAYBE, /* Start if WantedBy= suggests */
- START_YES /* Start unconditionally */
-} arg_start = START_NO;
+ REALIZE_NO, /* Don't reload/start/stop or anything */
+ REALIZE_RELOAD, /* Only reload daemon config, don't stop/start */
+ REALIZE_MINIMAL, /* Only shutdown/restart if running. */
+ REALIZE_MAYBE, /* Start if WantedBy= suggests */
+ REALIZE_YES /* Start unconditionally */
+} arg_realize = REALIZE_NO;
typedef struct {
char *name;
@@ -69,13 +71,13 @@ static int help(void) {
printf("%s [OPTIONS...] {COMMAND} ...\n\n"
"Install init system units.\n\n"
- " -h --help Show this help\n"
- " --force Override existing links\n"
- " --system Install into system\n"
- " --session Install into session\n"
- " --global Install into all sessions\n"
- " --start[=MODE] Start/stop/restart unit after installation\n"
- " Takes 'no', 'minimal', 'maybe' or 'yes'\n\n"
+ " -h --help Show this help\n"
+ " --force Override existing links\n"
+ " --system Install into system\n"
+ " --session Install into session\n"
+ " --global Install into all sessions\n"
+ " --realize[=MODE] Start/stop/restart unit after installation\n"
+ " Takes 'no', 'minimal', 'maybe' or 'yes'\n\n"
"Commands:\n"
" enable [NAME...] Enable one or more units\n"
" disable [NAME...] Disable one or more units\n"
@@ -92,7 +94,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_SYSTEM,
ARG_GLOBAL,
ARG_FORCE,
- ARG_START
+ ARG_REALIZE
};
static const struct option options[] = {
@@ -101,7 +103,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "system", no_argument, NULL, ARG_SYSTEM },
{ "global", no_argument, NULL, ARG_GLOBAL },
{ "force", no_argument, NULL, ARG_FORCE },
- { "start", optional_argument, NULL, ARG_START },
+ { "realize", optional_argument, NULL, ARG_REALIZE },
{ NULL, 0, NULL, 0 }
};
@@ -134,20 +136,20 @@ static int parse_argv(int argc, char *argv[]) {
arg_force = true;
break;
- case ARG_START:
+ case ARG_REALIZE:
if (!optarg)
- arg_start = START_MAYBE;
+ arg_realize = REALIZE_MAYBE;
else if (streq(optarg, "no"))
- arg_start = START_NO;
+ arg_realize = REALIZE_NO;
else if (streq(optarg, "minimal"))
- arg_start = START_MINIMAL;
+ arg_realize = REALIZE_MINIMAL;
else if (streq(optarg, "maybe"))
- arg_start = START_MAYBE;
+ arg_realize = REALIZE_MAYBE;
else if (streq(optarg, "yes"))
- arg_start = START_YES;
+ arg_realize = REALIZE_YES;
else {
- log_error("Invalid --start argument %s", optarg);
+ log_error("Invalid --realize argument %s", optarg);
return -EINVAL;
}
@@ -306,7 +308,7 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) {
if (arg_action == ACTION_ENABLE) {
- if (arg_start == START_MAYBE) {
+ if (arg_realize == REALIZE_MAYBE) {
char **k;
bool yes_please = false;
@@ -416,7 +418,7 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) {
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
- arg_start == START_MINIMAL ? "TryRestartUnit" : "RestartUnit"))) {
+ arg_realize == REALIZE_MINIMAL ? "TryRestartUnit" : "RestartUnit"))) {
log_error("Could not allocate message.");
r = -ENOMEM;
goto finish;
@@ -778,16 +780,26 @@ static int do_run(void) {
dbus_error_init(&error);
- if (arg_start == START_NO)
+ if (arg_realize == REALIZE_NO)
return 0;
if (arg_where == WHERE_GLOBAL) {
- log_warning("Warning: --start has no effect with --global.");
+ log_warning("Warning: --realize has no effect with --global.");
return 0;
}
if (arg_action != ACTION_ENABLE && arg_action != ACTION_DISABLE) {
- log_warning("Warning: --start has no effect with test.");
+ log_warning("Warning: --realize has no effect with test.");
+ return 0;
+ }
+
+ if (arg_where == WHERE_SYSTEM && sd_booted() <= 0) {
+ log_info("systemd is not running, --realize has not effect.");
+ return 0;
+ }
+
+ if (arg_where == WHERE_SYSTEM && running_in_chroot() > 0) {
+ log_info("Running in a chroot() environment, --realize has no effect.");
return 0;
}
@@ -802,9 +814,11 @@ static int do_run(void) {
if ((r = daemon_reload(bus)) < 0)
goto finish;
- HASHMAP_FOREACH(j, have_installed, i)
- if ((q = install_info_run(bus, j)) < 0)
- r = q;
+ if (arg_realize != REALIZE_RELOAD) {
+ HASHMAP_FOREACH(j, have_installed, i)
+ if ((q = install_info_run(bus, j)) < 0)
+ r = q;
+ }
if (arg_action == ACTION_DISABLE)
if ((q = daemon_reload(bus)) < 0)
diff --git a/src/socket.c b/src/socket.c
index ee75de04d6..acd49a5045 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -1039,7 +1039,7 @@ static void socket_enter_running(Socket *s, int cfd) {
socket_set_state(s, SOCKET_RUNNING);
} else {
Unit *u;
- char *prefix, *instance, *name;
+ char *prefix, *instance = NULL, *name;
if (s->n_connections >= s->max_connections) {
log_warning("Too many incoming connections (%u)", s->n_connections);
diff --git a/src/util.c b/src/util.c
index 2e5827f32d..7f5fa05dca 100644
--- a/src/util.c
+++ b/src/util.c
@@ -2825,6 +2825,25 @@ int columns(void) {
return parsed_columns;
}
+int running_in_chroot(void) {
+ struct stat a, b;
+
+ zero(a);
+ zero(b);
+
+ /* Only works as root */
+
+ if (stat("/proc/1/root", &a) < 0)
+ return -errno;
+
+ if (stat("/", &b) < 0)
+ return -errno;
+
+ return
+ a.st_dev != b.st_dev ||
+ a.st_ino != b.st_ino;
+}
+
static const char *const ioprio_class_table[] = {
[IOPRIO_CLASS_NONE] = "none",
[IOPRIO_CLASS_RT] = "realtime",
diff --git a/src/util.h b/src/util.h
index 5d51c07e2f..1a4c440ba5 100644
--- a/src/util.h
+++ b/src/util.h
@@ -330,6 +330,8 @@ void status_welcome(void);
int columns(void);
+int running_in_chroot(void);
+
const char *ioprio_class_to_string(int i);
int ioprio_class_from_string(const char *s);