]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
proc-cmdline: add runlevel to target mapping
authorEvgeny Vereshchagin <evvers@ya.ru>
Tue, 3 Nov 2015 11:09:03 +0000 (14:09 +0300)
committerEvgeny Vereshchagin <evvers@ya.ru>
Tue, 3 Nov 2015 11:09:03 +0000 (14:09 +0300)
src/basic/proc-cmdline.c
src/basic/proc-cmdline.h
src/test/test-util.c

index dd91ce7dbcc57550ed7211854ad1855395257dc5..f9f98af473a1ed1addd9fb39020518defcbac58b 100644 (file)
@@ -26,6 +26,7 @@
 #include "parse-util.h"
 #include "proc-cmdline.h"
 #include "process-util.h"
+#include "special.h"
 #include "string-util.h"
 #include "util.h"
 #include "virt.h"
@@ -143,3 +144,31 @@ int shall_restore_state(void) {
 
         return parse_boolean(value) != 0;
 }
+
+static const char * const rlmap[] = {
+        "emergency", SPECIAL_EMERGENCY_TARGET,
+        "-b",        SPECIAL_EMERGENCY_TARGET,
+        "rescue",    SPECIAL_RESCUE_TARGET,
+        "single",    SPECIAL_RESCUE_TARGET,
+        "-s",        SPECIAL_RESCUE_TARGET,
+        "s",         SPECIAL_RESCUE_TARGET,
+        "S",         SPECIAL_RESCUE_TARGET,
+        "1",         SPECIAL_RESCUE_TARGET,
+        "2",         SPECIAL_MULTI_USER_TARGET,
+        "3",         SPECIAL_MULTI_USER_TARGET,
+        "4",         SPECIAL_MULTI_USER_TARGET,
+        "5",         SPECIAL_GRAPHICAL_TARGET,
+};
+
+const char* runlevel_to_target(const char *word) {
+        size_t i;
+
+        if (!word)
+                return NULL;
+
+        for (i = 0; i < ELEMENTSOF(rlmap); i += 2)
+                if (streq(word, rlmap[i]))
+                        return rlmap[i+1];
+
+        return NULL;
+}
index ea8277b05303d5ac44b2a1db1ee81efa21edc44d..ce6e84995a4e7cda45babbcfe3865dc3cd27fef8 100644 (file)
@@ -26,3 +26,4 @@ int parse_proc_cmdline(int (*parse_word)(const char *key, const char *value));
 int get_proc_cmdline_key(const char *parameter, char **value);
 
 int shall_restore_state(void);
+const char* runlevel_to_target(const char *rl);
index 647df4f5c3b0ba016169d9001cdc80a436913d6f..f6ed55878cc383b0e3b58e131f614fd56778b956 100644 (file)
@@ -48,6 +48,7 @@
 #include "process-util.h"
 #include "rm-rf.h"
 #include "signal-util.h"
+#include "special.h"
 #include "stat-util.h"
 #include "string-util.h"
 #include "strv.h"
@@ -1638,6 +1639,12 @@ cleanup:
         assert_se(rmdir(t) >= 0);
 }
 
+static void test_runlevel_to_target(void) {
+        assert_se(streq_ptr(runlevel_to_target(NULL), NULL));
+        assert_se(streq_ptr(runlevel_to_target("unknown-runlevel"), NULL));
+        assert_se(streq_ptr(runlevel_to_target("3"), SPECIAL_MULTI_USER_TARGET));
+}
+
 int main(int argc, char *argv[]) {
         log_parse_environment();
         log_open();
@@ -1718,6 +1725,7 @@ int main(int argc, char *argv[]) {
         test_tempfn();
         test_strcmp_ptr();
         test_fgetxattrat_fake();
+        test_runlevel_to_target();
 
         return 0;
 }