chiark / gitweb /
util: simplify proc_cmdline() to reuse get_process_cmdline()
authorLennart Poettering <lennart@poettering.net>
Thu, 6 Nov 2014 20:53:34 +0000 (21:53 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 7 Nov 2014 00:19:56 +0000 (01:19 +0100)
Also, make all parsing of the kernel cmdline non-fatal.

15 files changed:
src/core/kmod-setup.c
src/core/main.c
src/cryptsetup/cryptsetup-generator.c
src/debug-generator/debug-generator.c
src/fsck/fsck.c
src/fstab-generator/fstab-generator.c
src/gpt-auto-generator/gpt-auto-generator.c
src/hibernate-resume/hibernate-resume-generator.c
src/journal/journald-server.c
src/modules-load/modules-load.c
src/quotacheck/quotacheck.c
src/shared/condition.c
src/shared/util.c
src/udev/net/link-config.c
src/udev/udevd.c

index 2f3f60883092d2ebb234a7f373f4318505353b77..38e1726e08a83e2feea3509f74d67faae80ebc71 100644 (file)
@@ -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;
index d48604e6739330f80a23d83822d16a864cc1c615..56a1f6193c974d2316fd93b784b7bf7768e166e2 100644 (file)
@@ -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". */
index 20dca844bbd51f75c62cc4b9e74c6907acd2856f..7c79ca35615fbdcc6e081079e9d92ef3ee456b3f 100644 (file)
@@ -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;
index fd7c29d28f0bc2e39ac24cf7618bd8f6dfc97341..5bbcd8fca72be98be5d1923d49e3ddd4d644fcfc 100644 (file)
@@ -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");
index 70a591883e70cc161165077fba3674e12c5960eb..556221759adc2f86fca3371b3139acdaca4e4f12 100644 (file)
@@ -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)
index 94cbc3a5fe8f64d7c9e4d7fd63420e0782ccc8d6..af45c25400ade65651e6aa05fa09ec7f3f3b66d4 100644 (file)
@@ -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()) {
index 539e2e64b53b59568ee70c1de8d15223506e598c..d4cfe37298070fdd7a5a3f1d47c17051f51242ca 100644 (file)
@@ -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.");
index f40721662e5bf1a88cb4c70970ecf5f392671de9..41f65d984e3e497b2a0be39497f5c612b8d8d9b2 100644 (file)
@@ -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;
index 2f782f245d801d8ab211fe03b668dd1ea2a5b0b6..62ae79a5cee8e3a32c47d6cd9569beb172d8e09a 100644 (file)
@@ -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;
index c77b092a628b3599a03dca0ff7160ee205a1a888..08de5e0ce9e506121b87ad86a72d541ca80c017e 100644 (file)
@@ -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) {
index ed95b48c63e6881cb1cccee32edc882a655b48e4..6f39dae2afb6cb27e29e64657e3c2362e30fb825 100644 (file)
@@ -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;
 }
index 08bebeee73c22619edd9833dd89b41467cff0972..ae23599410600b32461478bdc8eb5b9512b21d92 100644 (file)
@@ -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;
index dc1bc39ac710b50f4f52cd171674bd053d3b20ae..6401aaf61c0d8b77aaae018d1acb93a1b98d3cf8 100644 (file)
@@ -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;
index 428a71dce3887873b94f230c4a0e15b80c615b01..5aefb7d415e4dc2fd4fcfe192502494b7c0d9fe0 100644 (file)
@@ -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))
index 305ce86cdf5a021b2ab506ba6762c98a323c6d48..a040529e6f159aacdbdc47bb0d77e1b7400dae52 100644 (file)
@@ -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;