chiark / gitweb /
Extract looping over /proc/cmdline into a shared function
[elogind.git] / src / shared / util.c
index 6b5b07463c215f65e95884f56477824ad4834aac..d95a4b4ab117ce6d8062b43ec85560dcd7abe8cc 100644 (file)
@@ -513,7 +513,7 @@ char *truncate_nl(char *s) {
         return s;
 }
 
-char get_process_state(pid_t pid) {
+int get_process_state(pid_t pid) {
         const char *p;
         char state;
         int r;
@@ -5943,6 +5943,35 @@ int proc_cmdline(char **ret) {
         return 1;
 }
 
+int parse_proc_cmdline(int (*parse_word)(const char *word)) {
+        _cleanup_free_ char *line = NULL;
+        char *w, *state;
+        size_t l;
+        int r;
+
+        r = proc_cmdline(&line);
+        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;
+
+                word = strndup(w, l);
+                if (!word)
+                        return log_oom();
+
+                r = parse_word(word);
+                if (r < 0) {
+                        log_error("Failed on cmdline argument %s: %s", word, strerror(-r));
+                        return r;
+                }
+        }
+
+        return 0;
+}
+
 int container_get_leader(const char *machine, pid_t *pid) {
         _cleanup_free_ char *s = NULL, *class = NULL;
         const char *p;