chiark / gitweb /
make gcc shut up
[elogind.git] / src / backlight / backlight.c
index 51a67a042ade57dee83b2c094996795cbec16a90..86f10cc0cf290f15dc5978a74e8a3b9d9f04add3 100644 (file)
@@ -64,7 +64,7 @@ static struct udev_device *find_pci_or_platform_parent(struct udev_device *devic
 
                 value = udev_device_get_sysattr_value(parent, "class");
                 if (value) {
-                        unsigned long class;
+                        unsigned long class = 0;
 
                         if (safe_atolu(value, &class) < 0) {
                                 log_warning("Cannot parse PCI class %s of device %s:%s.", value, subsystem, sysname);
@@ -195,8 +195,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 +252,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;
@@ -262,12 +285,12 @@ int main(int argc, char *argv[]) {
          * their probing at boot-time might happen in any order. This
          * means the validity checking of the device then is not
          * reliable, since it might not see other devices conflicting
-         * with a specific backlight. To deal with this we will
+         * with a specific backlight. To deal with this, we will
          * actively delete backlight state files at shutdown (where
          * 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") && shall_restore_state()) {
                 _cleanup_free_ char *value = NULL;
 
                 if (!validate_device(udev, device))