]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sleep-config: allow setting empty HibernateMode= (use kernel default)
authorMike Yuan <me@yhndnzj.com>
Sun, 29 Oct 2023 16:03:07 +0000 (00:03 +0800)
committerLuca Boccassi <luca.boccassi@gmail.com>
Mon, 30 Oct 2023 11:34:21 +0000 (11:34 +0000)
Both sleep_mode_supported and write_mode support this,
but parse_sleep_config currently prohibits this - it always
uses our default value if user specifies HibernateMode=<empty>.

src/shared/sleep-config.c

index 77b5ee5b841c20082b28cc54d337bebc09097792..7282111f497bf0164d80eee33ceea4d6eb72a562 100644 (file)
@@ -57,6 +57,39 @@ SleepConfig* sleep_config_free(SleepConfig *sc) {
         return mfree(sc);
 }
 
+static int config_parse_sleep_mode(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        _cleanup_strv_free_ char **modes = NULL;
+        char ***sv = ASSERT_PTR(data);
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+
+        if (isempty(rvalue)) {
+                modes = strv_new(NULL);
+                if (!modes)
+                        return log_oom();
+        } else {
+                r = strv_split_full(&modes, rvalue, NULL, EXTRACT_UNQUOTE|EXTRACT_RETAIN_ESCAPE);
+                if (r < 0)
+                        return log_oom();
+        }
+
+        return free_and_replace(*sv, modes);
+}
+
 static void sleep_config_validate_state_and_mode(SleepConfig *sc) {
         assert(sc);
 
@@ -102,7 +135,7 @@ int parse_sleep_config(SleepConfig **ret) {
                 { "Sleep", "SuspendMode",               config_parse_warn_compat, DISABLED_LEGACY, NULL                         },
 
                 { "Sleep", "HibernateState",            config_parse_warn_compat, DISABLED_LEGACY, NULL                         },
-                { "Sleep", "HibernateMode",             config_parse_strv,        0,               sc->modes + SLEEP_HIBERNATE  },
+                { "Sleep", "HibernateMode",             config_parse_sleep_mode,  0,               sc->modes + SLEEP_HIBERNATE  },
 
                 { "Sleep", "HybridSleepState",          config_parse_warn_compat, DISABLED_LEGACY, NULL                         },
                 { "Sleep", "HybridSleepMode",           config_parse_warn_compat, DISABLED_LEGACY, NULL                         },