summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-11-06 21:53:34 +0100
committerLennart Poettering <lennart@poettering.net>2014-11-07 01:19:56 +0100
commitb5884878a2874447b2a9f07f324a7cd909d96d48 (patch)
tree7187916b29404dad30f53be8ed0393a095571e0d /src
parentf2997962ff8aeea577bed878d3bc4e4f64784e45 (diff)
util: simplify proc_cmdline() to reuse get_process_cmdline()
Also, make all parsing of the kernel cmdline non-fatal.
Diffstat (limited to 'src')
-rw-r--r--src/core/kmod-setup.c2
-rw-r--r--src/core/main.c8
-rw-r--r--src/cryptsetup/cryptsetup-generator.c7
-rw-r--r--src/debug-generator/debug-generator.c5
-rw-r--r--src/fsck/fsck.c5
-rw-r--r--src/fstab-generator/fstab-generator.c5
-rw-r--r--src/gpt-auto-generator/gpt-auto-generator.c5
-rw-r--r--src/hibernate-resume/hibernate-resume-generator.c12
-rw-r--r--src/journal/journald-server.c4
-rw-r--r--src/modules-load/modules-load.c5
-rw-r--r--src/quotacheck/quotacheck.c10
-rw-r--r--src/shared/condition.c2
-rw-r--r--src/shared/util.c35
-rw-r--r--src/udev/net/link-config.c7
-rw-r--r--src/udev/udevd.c4
15 files changed, 54 insertions, 62 deletions
diff --git a/src/core/kmod-setup.c b/src/core/kmod-setup.c
index 2f3f60883..38e1726e0 100644
--- a/src/core/kmod-setup.c
+++ b/src/core/kmod-setup.c
@@ -47,7 +47,7 @@ static void systemd_kmod_log(
static bool cmdline_check_kdbus(void) {
_cleanup_free_ char *line = NULL;
- if (proc_cmdline(&line) <= 0)
+ if (proc_cmdline(&line) < 0)
return false;
return strstr(line, "kdbus") != NULL;
diff --git a/src/core/main.c b/src/core/main.c
index d48604e67..56a1f6193 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -1402,9 +1402,11 @@ int main(int argc, char *argv[]) {
if (parse_config_file() < 0)
goto finish;
- if (arg_running_as == SYSTEMD_SYSTEM)
- if (parse_proc_cmdline(parse_proc_cmdline_item) < 0)
- goto finish;
+ if (arg_running_as == SYSTEMD_SYSTEM) {
+ r = parse_proc_cmdline(parse_proc_cmdline_item);
+ if (r < 0)
+ log_warning("Failed to parse kernel command line, ignoring: %s", strerror(-r));
+ }
/* Note that this also parses bits from the kernel command
* line, including "debug". */
diff --git a/src/cryptsetup/cryptsetup-generator.c b/src/cryptsetup/cryptsetup-generator.c
index 20dca844b..7c79ca356 100644
--- a/src/cryptsetup/cryptsetup-generator.c
+++ b/src/cryptsetup/cryptsetup-generator.c
@@ -308,7 +308,7 @@ int main(int argc, char *argv[]) {
_cleanup_strv_free_ char **disks_done = NULL;
_cleanup_fclose_ FILE *f = NULL;
unsigned n = 0;
- int r = EXIT_FAILURE, r2 = EXIT_FAILURE;
+ int r = EXIT_FAILURE, r2 = EXIT_FAILURE, z;
char **i;
if (argc > 1 && argc != 4) {
@@ -325,8 +325,9 @@ int main(int argc, char *argv[]) {
umask(0022);
- if (parse_proc_cmdline(parse_proc_cmdline_item) < 0)
- goto cleanup;
+ z = parse_proc_cmdline(parse_proc_cmdline_item);
+ if (z < 0)
+ log_warning("Failed to parse kernel command line, ignoring: %s", strerror(-z));
if (!arg_enabled) {
r = r2 = EXIT_SUCCESS;
diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c
index fd7c29d28..5bbcd8fca 100644
--- a/src/debug-generator/debug-generator.c
+++ b/src/debug-generator/debug-generator.c
@@ -150,8 +150,9 @@ int main(int argc, char *argv[]) {
umask(0022);
- if (parse_proc_cmdline(parse_proc_cmdline_item) < 0)
- return EXIT_FAILURE;
+ r = parse_proc_cmdline(parse_proc_cmdline_item);
+ if (r < 0)
+ log_warning("Failed to parse kernel command line, ignoring: %s", strerror(-r));
if (arg_debug_shell) {
r = strv_extend(&arg_wants, "debug-shell.service");
diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c
index 70a591883..556221759 100644
--- a/src/fsck/fsck.c
+++ b/src/fsck/fsck.c
@@ -236,7 +236,10 @@ int main(int argc, char *argv[]) {
umask(0022);
- parse_proc_cmdline(parse_proc_cmdline_item);
+ q = parse_proc_cmdline(parse_proc_cmdline_item);
+ if (q < 0)
+ log_warning("Failed to parse kernel command line, ignoring: %s", strerror(-q));
+
test_files();
if (!arg_force && arg_skip)
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index 94cbc3a5f..af45c2540 100644
--- a/src/fstab-generator/fstab-generator.c
+++ b/src/fstab-generator/fstab-generator.c
@@ -593,8 +593,9 @@ int main(int argc, char *argv[]) {
umask(0022);
- if (parse_proc_cmdline(parse_proc_cmdline_item) < 0)
- return EXIT_FAILURE;
+ r = parse_proc_cmdline(parse_proc_cmdline_item);
+ if (r < 0)
+ log_warning("Failed to parse kernel command line, ignoring: %s", strerror(-r));
/* Always honour root= and usr= in the kernel command line if we are in an initrd */
if (in_initrd()) {
diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c
index 539e2e64b..d4cfe3729 100644
--- a/src/gpt-auto-generator/gpt-auto-generator.c
+++ b/src/gpt-auto-generator/gpt-auto-generator.c
@@ -772,8 +772,9 @@ int main(int argc, char *argv[]) {
return EXIT_SUCCESS;
}
- if (parse_proc_cmdline(parse_proc_cmdline_item) < 0)
- return EXIT_FAILURE;
+ r = parse_proc_cmdline(parse_proc_cmdline_item);
+ if (r < 0)
+ log_warning("Failed to parse kernel command line, ignoring: %s", strerror(-r));
if (!arg_enabled) {
log_debug("Disabled, exiting.");
diff --git a/src/hibernate-resume/hibernate-resume-generator.c b/src/hibernate-resume/hibernate-resume-generator.c
index f40721662..41f65d984 100644
--- a/src/hibernate-resume/hibernate-resume-generator.c
+++ b/src/hibernate-resume/hibernate-resume-generator.c
@@ -45,6 +45,9 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
static int process_resume(void) {
_cleanup_free_ char *name = NULL, *lnk = NULL;
+ if (!arg_resume_dev)
+ return 0;
+
name = unit_name_from_path_instance("systemd-hibernate-resume", arg_resume_dev, ".service");
if (!name)
return log_oom();
@@ -83,12 +86,11 @@ int main(int argc, char *argv[]) {
if (!in_initrd())
return EXIT_SUCCESS;
- if (parse_proc_cmdline(parse_proc_cmdline_item) < 0)
- return EXIT_FAILURE;
-
- if (arg_resume_dev != NULL)
- r = process_resume();
+ r = parse_proc_cmdline(parse_proc_cmdline_item);
+ if (r < 0)
+ log_warning("Failed to parse kernel command line, ignoring: %s", strerror(-r));
+ r = process_resume();
free(arg_resume_dev);
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
index 2f782f245..62ae79a5c 100644
--- a/src/journal/journald-server.c
+++ b/src/journal/journald-server.c
@@ -1310,10 +1310,10 @@ static int server_parse_proc_cmdline(Server *s) {
int r;
r = proc_cmdline(&line);
- if (r < 0)
+ if (r < 0) {
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
- if (r <= 0)
return 0;
+ }
FOREACH_WORD_QUOTED(w, l, line, state) {
_cleanup_free_ char *word;
diff --git a/src/modules-load/modules-load.c b/src/modules-load/modules-load.c
index c77b092a6..08de5e0ce 100644
--- a/src/modules-load/modules-load.c
+++ b/src/modules-load/modules-load.c
@@ -243,8 +243,9 @@ int main(int argc, char *argv[]) {
umask(0022);
- if (parse_proc_cmdline(parse_proc_cmdline_item) < 0)
- return EXIT_FAILURE;
+ r = parse_proc_cmdline(parse_proc_cmdline_item);
+ if (r < 0)
+ log_warning("Failed to parse kernel command line, ignoring: %s", strerror(-r));
ctx = kmod_new(NULL, NULL);
if (!ctx) {
diff --git a/src/quotacheck/quotacheck.c b/src/quotacheck/quotacheck.c
index ed95b48c6..6f39dae2a 100644
--- a/src/quotacheck/quotacheck.c
+++ b/src/quotacheck/quotacheck.c
@@ -74,6 +74,7 @@ int main(int argc, char *argv[]) {
};
pid_t pid;
+ int r;
if (argc > 1) {
log_error("This program takes no arguments.");
@@ -86,7 +87,10 @@ int main(int argc, char *argv[]) {
umask(0022);
- parse_proc_cmdline(parse_proc_cmdline_item);
+ r = parse_proc_cmdline(parse_proc_cmdline_item);
+ if (r < 0)
+ log_warning("Failed to parse kernel command line, ignoring: %s", strerror(-r));
+
test_files();
if (!arg_force) {
@@ -107,5 +111,7 @@ int main(int argc, char *argv[]) {
_exit(1); /* Operational error */
}
- return wait_for_terminate_and_warn("quotacheck", pid) >= 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+ r = wait_for_terminate_and_warn("quotacheck", pid);
+
+ return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}
diff --git a/src/shared/condition.c b/src/shared/condition.c
index 08bebeee7..ae2359941 100644
--- a/src/shared/condition.c
+++ b/src/shared/condition.c
@@ -93,8 +93,6 @@ static int condition_test_kernel_command_line(Condition *c) {
r = proc_cmdline(&line);
if (r < 0)
return r;
- if (r == 0)
- return false;
equal = !!strchr(c->parameter, '=');
p = line;
diff --git a/src/shared/util.c b/src/shared/util.c
index dc1bc39ac..6401aaf61 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -6153,11 +6153,8 @@ int shall_restore_state(void) {
r = proc_cmdline(&line);
if (r < 0)
return r;
- if (r == 0) /* Container ... */
- return 1;
r = 1;
-
FOREACH_WORD_QUOTED(word, l, line, state) {
const char *e;
char n[l+1];
@@ -6179,30 +6176,12 @@ int shall_restore_state(void) {
}
int proc_cmdline(char **ret) {
- int r;
-
- if (detect_container(NULL) > 0) {
- char *buf = NULL, *p;
- size_t sz = 0;
-
- r = read_full_file("/proc/1/cmdline", &buf, &sz);
- if (r < 0)
- return r;
-
- for (p = buf; p + 1 < buf + sz; p++)
- if (*p == 0)
- *p = ' ';
-
- *p = 0;
- *ret = buf;
- return 1;
- }
-
- r = read_one_line_file("/proc/cmdline", ret);
- if (r < 0)
- return r;
+ assert(ret);
- return 1;
+ if (detect_container(NULL) > 0)
+ return get_process_cmdline(1, 0, false, ret);
+ else
+ return read_one_line_file("/proc/cmdline", ret);
}
int parse_proc_cmdline(int (*parse_item)(const char *key, const char *value)) {
@@ -6215,9 +6194,7 @@ int parse_proc_cmdline(int (*parse_item)(const char *key, const char *value)) {
r = proc_cmdline(&line);
if (r < 0)
- log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
- if (r <= 0)
- return 0;
+ return r;
FOREACH_WORD_QUOTED(w, l, line, state) {
char word[l+1], *value;
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
index 428a71dce..5aefb7d41 100644
--- a/src/udev/net/link-config.c
+++ b/src/udev/net/link-config.c
@@ -174,11 +174,10 @@ static bool enable_name_policy(void) {
size_t l;
r = proc_cmdline(&line);
- if (r < 0)
- log_warning("Failed to read /proc/cmdline, ignoring: %s",
- strerror(-r));
- if (r <= 0)
+ if (r < 0) {
+ log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
return true;
+ }
FOREACH_WORD_QUOTED(word, l, line, state)
if (strneq(word, "net.ifnames=0", l))
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index 305ce86cd..a040529e6 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -961,10 +961,10 @@ static void kernel_cmdline_options(struct udev *udev) {
int r;
r = proc_cmdline(&line);
- if (r < 0)
+ if (r < 0) {
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
- if (r <= 0)
return;
+ }
FOREACH_WORD_QUOTED(word, l, line, state) {
char *s, *opt, *value;