Instead of individually checking for containers in each user do this
once in a new call proc_cmdline() that read the file only if we are not
in a container.
15 files changed:
* device probing should be complete), so that the validity
* check at boot time doesn't have to be reliable. */
* device probing should be complete), so that the validity
* check at boot time doesn't have to be reliable. */
- if (streq(argv[1], "load") && restore_state()) {
+ if (streq(argv[1], "load") && shall_restore_state()) {
_cleanup_free_ char *value = NULL;
if (!validate_device(udev, device))
_cleanup_free_ char *value = NULL;
if (!validate_device(udev, device))
- if (detect_container(NULL) > 0)
- return false;
-
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
+ r = proc_cmdline(&line);
+ if (r < 0)
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
equal = !!strchr(parameter, '=');
pl = strlen(parameter);
equal = !!strchr(parameter, '=');
pl = strlen(parameter);
static int parse_proc_cmdline(void) {
_cleanup_free_ char *line = NULL;
char *w, *state;
static int parse_proc_cmdline(void) {
_cleanup_free_ char *line = NULL;
char *w, *state;
- /* Don't read /proc/cmdline if we are in a container, since
- * that is only relevant for the host system */
- if (detect_container(NULL) > 0)
- return 0;
-
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
+ r = proc_cmdline(&line);
+ if (r < 0)
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
FOREACH_WORD_QUOTED(w, l, line, state) {
_cleanup_free_ char *word;
FOREACH_WORD_QUOTED(w, l, line, state) {
_cleanup_free_ char *word;
* relevant for the container, hence we rely on argv[]
* instead. */
* relevant for the container, hence we rely on argv[]
* instead. */
- for (a = argv; a < argv + argc; a++)
- if ((r = parse_proc_cmdline_word(*a)) < 0) {
+ for (a = argv; a < argv + argc; a++) {
+ r = parse_proc_cmdline_word(*a);
+ if (r < 0) {
log_error("Failed on cmdline argument %s: %s", *a, strerror(-r));
return r;
}
log_error("Failed on cmdline argument %s: %s", *a, strerror(-r));
return r;
}
int cmd, r;
/* suppress shutdown status output if 'quiet' is used */
int cmd, r;
/* suppress shutdown status output if 'quiet' is used */
- r = read_one_line_file("/proc/cmdline", &line);
- if (r >= 0) {
+ r = proc_cmdline(&line);
+ if (r > 0) {
char *w, *state;
size_t l;
char *w, *state;
size_t l;
#include "util.h"
#include "unit-name.h"
#include "mkdir.h"
#include "util.h"
#include "unit-name.h"
#include "mkdir.h"
#include "strv.h"
#include "fileio.h"
#include "strv.h"
#include "fileio.h"
-static int parse_proc_cmdline(char ***arg_proc_cmdline_disks, char ***arg_proc_cmdline_options, char **arg_proc_cmdline_keyfile) {
+static int parse_proc_cmdline(
+ char ***arg_proc_cmdline_disks,
+ char ***arg_proc_cmdline_options,
+ char **arg_proc_cmdline_keyfile) {
+
_cleanup_free_ char *line = NULL;
char *w = NULL, *state = NULL;
_cleanup_free_ char *line = NULL;
char *w = NULL, *state = NULL;
- if (detect_container(NULL) > 0)
- return 0;
-
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
+ r = proc_cmdline(&line);
+ if (r < 0)
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
FOREACH_WORD_QUOTED(w, l, line, state) {
_cleanup_free_ char *word = NULL;
FOREACH_WORD_QUOTED(w, l, line, state) {
_cleanup_free_ char *word = NULL;
#include "bus-util.h"
#include "bus-error.h"
#include "bus-errors.h"
#include "bus-util.h"
#include "bus-error.h"
#include "bus-errors.h"
#include "fileio.h"
#include "udev-util.h"
#include "fileio.h"
#include "udev-util.h"
static int parse_proc_cmdline(void) {
char *line, *w, *state;
static int parse_proc_cmdline(void) {
char *line, *w, *state;
- if (detect_container(NULL) > 0)
- return 0;
-
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
+ r = proc_cmdline(&line);
+ if (r < 0)
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
FOREACH_WORD_QUOTED(w, l, line, state) {
FOREACH_WORD_QUOTED(w, l, line, state) {
#include "mount-setup.h"
#include "special.h"
#include "mkdir.h"
#include "mount-setup.h"
#include "special.h"
#include "mkdir.h"
#include "fileio.h"
static const char *arg_dest = "/tmp";
#include "fileio.h"
static const char *arg_dest = "/tmp";
static int parse_new_root_from_proc_cmdline(void) {
_cleanup_free_ char *what = NULL, *type = NULL, *opts = NULL, *line = NULL;
static int parse_new_root_from_proc_cmdline(void) {
_cleanup_free_ char *what = NULL, *type = NULL, *opts = NULL, *line = NULL;
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
- log_error("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
+ r = proc_cmdline(&line);
+ if (r < 0)
+ log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
+ if (r <= 0)
opts = strdup("ro");
type = strdup("auto");
opts = strdup("ro");
type = strdup("auto");
static int parse_proc_cmdline(void) {
_cleanup_free_ char *line = NULL;
char *w, *state;
static int parse_proc_cmdline(void) {
_cleanup_free_ char *line = NULL;
char *w, *state;
- if (detect_container(NULL) > 0)
- return 0;
-
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
+ r = proc_cmdline(&line);
+ if (r < 0)
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
FOREACH_WORD_QUOTED(w, l, line, state) {
_cleanup_free_ char *word = NULL;
FOREACH_WORD_QUOTED(w, l, line, state) {
_cleanup_free_ char *word = NULL;
#include <sys/timerfd.h>
#include <libudev.h>
#include <sys/timerfd.h>
#include <libudev.h>
-#include <systemd/sd-journal.h>
-#include <systemd/sd-messages.h>
-#include <systemd/sd-daemon.h>
+#include "sd-journal.h"
+#include "sd-messages.h"
+#include "sd-daemon.h"
#include "fileio.h"
#include "mkdir.h"
#include "hashmap.h"
#include "fileio.h"
#include "mkdir.h"
#include "hashmap.h"
#include "socket-util.h"
#include "cgroup-util.h"
#include "list.h"
#include "socket-util.h"
#include "cgroup-util.h"
#include "list.h"
#include "missing.h"
#include "conf-parser.h"
#include "missing.h"
#include "conf-parser.h"
+#include "selinux-util.h"
#include "journal-internal.h"
#include "journal-vacuum.h"
#include "journal-authenticate.h"
#include "journal-internal.h"
#include "journal-vacuum.h"
#include "journal-authenticate.h"
-#include "journald-server.h"
#include "journald-rate-limit.h"
#include "journald-kmsg.h"
#include "journald-syslog.h"
#include "journald-stream.h"
#include "journald-console.h"
#include "journald-native.h"
#include "journald-rate-limit.h"
#include "journald-kmsg.h"
#include "journald-syslog.h"
#include "journald-stream.h"
#include "journald-console.h"
#include "journald-native.h"
-#include "selinux-util.h"
+#include "journald-server.h"
#ifdef HAVE_ACL
#include <sys/acl.h>
#ifdef HAVE_ACL
#include <sys/acl.h>
static int server_parse_proc_cmdline(Server *s) {
_cleanup_free_ char *line = NULL;
char *w, *state;
static int server_parse_proc_cmdline(Server *s) {
_cleanup_free_ char *line = NULL;
char *w, *state;
- if (detect_container(NULL) > 0)
- return 0;
-
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
+ r = proc_cmdline(&line);
+ if (r < 0)
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
FOREACH_WORD_QUOTED(w, l, line, state) {
_cleanup_free_ char *word;
FOREACH_WORD_QUOTED(w, l, line, state) {
_cleanup_free_ char *word;
#include "util.h"
#include "strv.h"
#include "conf-files.h"
#include "util.h"
#include "strv.h"
#include "conf-files.h"
#include "fileio.h"
static char **arg_proc_cmdline_modules = NULL;
#include "fileio.h"
static char **arg_proc_cmdline_modules = NULL;
static int parse_proc_cmdline(void) {
_cleanup_free_ char *line = NULL;
char *w, *state;
static int parse_proc_cmdline(void) {
_cleanup_free_ char *line = NULL;
char *w, *state;
- if (detect_container(NULL) > 0)
- return 0;
-
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
+ r = proc_cmdline(&line);
+ if (r < 0)
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
FOREACH_WORD_QUOTED(w, l, line, state) {
_cleanup_free_ char *word;
FOREACH_WORD_QUOTED(w, l, line, state) {
_cleanup_free_ char *word;
#include <unistd.h>
#include "util.h"
#include <unistd.h>
#include "util.h"
#include "fileio.h"
static bool arg_skip = false;
#include "fileio.h"
static bool arg_skip = false;
- if (detect_container(NULL) > 0)
- return 0;
-
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
+ r = proc_cmdline(&line);
+ if (r < 0)
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
FOREACH_WORD_QUOTED(w, l, line, state) {
FOREACH_WORD_QUOTED(w, l, line, state) {
- if (streq(argv[1], "load") && restore_state()) {
+ if (streq(argv[1], "load") && shall_restore_state()) {
_cleanup_free_ char *value = NULL;
r = read_one_line_file(saved, &value);
_cleanup_free_ char *value = NULL;
r = read_one_line_file(saved, &value);
-bool restore_state(void) {
+int shall_restore_state(void) {
_cleanup_free_ char *line;
char *w, *state;
_cleanup_free_ char *line;
char *w, *state;
- if (detect_container(NULL) > 0)
- return true;
+ r = proc_cmdline(&line);
+ if (r < 0)
+ return r;
+ if (r == 0) /* Container ... */
+ return 1;
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
- log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
- return true; /* something is very wrong, let's not make it worse */
+ FOREACH_WORD_QUOTED(w, l, line, state)
+ if (l == 23 && memcmp(w, "systemd.restore_state=0", 23))
+ return 0;
+
+ return 1;
+}
+
+int proc_cmdline(char **ret) {
+ int r;
+
+ if (detect_container(NULL) > 0) {
+ *ret = NULL;
+ return 0;
- FOREACH_WORD_QUOTED(w, l, line, state)
- if (strneq(w, "systemd.restore_state=0", l))
- return false;
+ r = read_one_line_file("/proc/cmdline", ret);
+ if (r < 0)
+ return r;
int split_pair(const char *s, const char *sep, char **l, char **r);
int split_pair(const char *s, const char *sep, char **l, char **r);
-bool restore_state(void);
+int shall_restore_state(void);
/**
* Normal qsort requires base to be nonnull. Here were require
/**
* Normal qsort requires base to be nonnull. Here were require
qsort(base, nmemb, size, compar);
}
}
qsort(base, nmemb, size, compar);
}
}
+
+int proc_cmdline(char **ret);
- r = read_one_line_file("/proc/cmdline", &line);
- if (r < 0) {
+ r = proc_cmdline(&line);
+ if (r < 0)
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
- return true; /* something is very wrong, let's not make it worse */
- }
+ if (r <= 0)
+ return true;
FOREACH_WORD_QUOTED(w, l, line, state)
if (strneq(w, "net.ifnames=0", l))
FOREACH_WORD_QUOTED(w, l, line, state)
if (strneq(w, "net.ifnames=0", l))
*/
static void kernel_cmdline_options(struct udev *udev)
{
*/
static void kernel_cmdline_options(struct udev *udev)
{
- char *line, *w, *state;
+ _cleanup_free_ char *line = NULL;
+ char *w, *state;
- if (read_one_line_file("/proc/cmdline", &line) < 0)
+ r = proc_cmdline(&line);
+ if (r < 0)
+ log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
+ if (r <= 0)
return;
FOREACH_WORD_QUOTED(w, l, line, state) {
return;
FOREACH_WORD_QUOTED(w, l, line, state) {
}
int main(int argc, char *argv[])
}
int main(int argc, char *argv[])