chiark / gitweb /
kerne-command-line: introduce option 'systemd.restore_state'
[elogind.git] / src / backlight / backlight.c
index 51a67a042ade57dee83b2c094996795cbec16a90..6c00b00d82c64e385948cf3a52139ddf69822c7f 100644 (file)
@@ -24,6 +24,7 @@
 #include "fileio.h"
 #include "libudev.h"
 #include "udev-util.h"
+#include "util.h"
 
 static struct udev_device *find_pci_or_platform_parent(struct udev_device *device) {
         struct udev_device *parent;
@@ -195,8 +196,8 @@ static bool validate_device(struct udev *udev, struct udev_device *device) {
 int main(int argc, char *argv[]) {
         _cleanup_udev_unref_ struct udev *udev = NULL;
         _cleanup_udev_device_unref_ struct udev_device *device = NULL;
-        _cleanup_free_ char *saved = NULL, *ss = NULL;
-        const char *sysname;
+        _cleanup_free_ char *saved = NULL, *ss = NULL, *escaped_ss = NULL, *escaped_sysname = NULL, *escaped_path_id = NULL;
+        const char *sysname, *path_id;
         int r;
 
         if (argc != 3) {
@@ -252,7 +253,30 @@ int main(int argc, char *argv[]) {
                 return EXIT_FAILURE;
         }
 
-        saved = strjoin("/var/lib/systemd/backlight/", ss, ":", sysname, NULL);
+        escaped_ss = cescape(ss);
+        if (!escaped_ss) {
+                log_oom();
+                return EXIT_FAILURE;
+        }
+
+        escaped_sysname = cescape(sysname);
+        if (!escaped_sysname) {
+                log_oom();
+                return EXIT_FAILURE;
+        }
+
+        path_id = udev_device_get_property_value(device, "ID_PATH");
+        if (path_id) {
+                escaped_path_id = cescape(path_id);
+                if (!escaped_path_id) {
+                        log_oom();
+                        return EXIT_FAILURE;
+                }
+
+                saved = strjoin("/var/lib/systemd/backlight/", escaped_path_id, ":", escaped_ss, ":", escaped_sysname, NULL);
+        } else
+                saved = strjoin("/var/lib/systemd/backlight/", escaped_ss, ":", escaped_sysname, NULL);
+
         if (!saved) {
                 log_oom();
                 return EXIT_FAILURE;
@@ -267,7 +291,7 @@ int main(int argc, char *argv[]) {
          * device probing should be complete), so that the validity
          * check at boot time doesn't have to be reliable. */
 
-        if (streq(argv[1], "load")) {
+        if (streq(argv[1], "load") && restore_state()) {
                 _cleanup_free_ char *value = NULL;
 
                 if (!validate_device(udev, device))