From b5884878a2874447b2a9f07f324a7cd909d96d48 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 6 Nov 2014 21:53:34 +0100 Subject: [PATCH] util: simplify proc_cmdline() to reuse get_process_cmdline() Also, make all parsing of the kernel cmdline non-fatal. --- src/core/kmod-setup.c | 2 +- src/core/main.c | 8 +++-- src/cryptsetup/cryptsetup-generator.c | 7 ++-- src/debug-generator/debug-generator.c | 5 +-- src/fsck/fsck.c | 5 ++- src/fstab-generator/fstab-generator.c | 5 +-- src/gpt-auto-generator/gpt-auto-generator.c | 5 +-- .../hibernate-resume-generator.c | 12 ++++--- src/journal/journald-server.c | 4 +-- src/modules-load/modules-load.c | 5 +-- src/quotacheck/quotacheck.c | 10 ++++-- src/shared/condition.c | 2 -- src/shared/util.c | 35 ++++--------------- src/udev/net/link-config.c | 7 ++-- src/udev/udevd.c | 4 +-- 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; -- 2.30.2