d22a5aa
From e58c591e5a969523356aafe7e8d308b42f0f401b Mon Sep 17 00:00:00 2001
d22a5aa
From: Lennart Poettering <lennart@poettering.net>
d22a5aa
Date: Mon, 14 Oct 2013 19:01:09 +0200
d22a5aa
Subject: [PATCH] backlight: include ID_PATH in file names for backlight
d22a5aa
 settings
d22a5aa
d22a5aa
Much like for rfkill devices we should provide some stability regarding
d22a5aa
enumeration order, hence include the stable bits of the device path in
d22a5aa
the file name we store settings under.
d22a5aa
d22a5aa
(cherry picked from commit be3f52f4ed02a9256b1577719677b32a17b525ac)
d22a5aa
d22a5aa
Conflicts:
d22a5aa
	rules/99-systemd.rules.in
d22a5aa
	src/rfkill/rfkill.c
d22a5aa
---
d22a5aa
 rules/99-systemd.rules.in |  4 ++--
d22a5aa
 src/backlight/backlight.c | 29 ++++++++++++++++++++++++++---
d22a5aa
 2 files changed, 28 insertions(+), 5 deletions(-)
d22a5aa
d22a5aa
diff --git a/rules/99-systemd.rules.in b/rules/99-systemd.rules.in
d22a5aa
index ff0e771..dd6e7f1 100644
d22a5aa
--- a/rules/99-systemd.rules.in
d22a5aa
+++ b/rules/99-systemd.rules.in
d22a5aa
@@ -57,8 +57,8 @@ ACTION=="add", SUBSYSTEM=="net", KERNEL!="lo", RUN+="@rootlibexecdir@/systemd-sy
d22a5aa
 # Pull in backlight save/restore for all backlight devices and
d22a5aa
 # keyboard backlights
d22a5aa
 
d22a5aa
-SUBSYSTEM=="backlight", TAG+="systemd", ENV{SYSTEMD_WANTS}+="systemd-backlight@$name.service"
d22a5aa
-SUBSYSTEM=="leds", KERNEL=="*kbd_backlight", TAG+="systemd", ENV{SYSTEMD_WANTS}+="systemd-backlight@$name.service"
d22a5aa
+SUBSYSTEM=="backlight", TAG+="systemd", IMPORT{builtin}="path_id", ENV{SYSTEMD_WANTS}+="systemd-backlight@$name.service"
d22a5aa
+SUBSYSTEM=="leds", KERNEL=="*kbd_backlight", TAG+="systemd", IMPORT{builtin}="path_id", ENV{SYSTEMD_WANTS}+="systemd-backlight@$name.service"
d22a5aa
 
d22a5aa
 # Asynchronously mount file systems implemented by these modules as
d22a5aa
 # soon as they are loaded.
d22a5aa
diff --git a/src/backlight/backlight.c b/src/backlight/backlight.c
d22a5aa
index 51a67a0..e8cdad6 100644
d22a5aa
--- a/src/backlight/backlight.c
d22a5aa
+++ b/src/backlight/backlight.c
d22a5aa
@@ -195,8 +195,8 @@ static bool validate_device(struct udev *udev, struct udev_device *device) {
d22a5aa
 int main(int argc, char *argv[]) {
d22a5aa
         _cleanup_udev_unref_ struct udev *udev = NULL;
d22a5aa
         _cleanup_udev_device_unref_ struct udev_device *device = NULL;
d22a5aa
-        _cleanup_free_ char *saved = NULL, *ss = NULL;
d22a5aa
-        const char *sysname;
d22a5aa
+        _cleanup_free_ char *saved = NULL, *ss = NULL, *escaped_ss = NULL, *escaped_sysname = NULL, *escaped_path_id = NULL;
d22a5aa
+        const char *sysname, *path_id;
d22a5aa
         int r;
d22a5aa
 
d22a5aa
         if (argc != 3) {
d22a5aa
@@ -252,7 +252,30 @@ int main(int argc, char *argv[]) {
d22a5aa
                 return EXIT_FAILURE;
d22a5aa
         }
d22a5aa
 
d22a5aa
-        saved = strjoin("/var/lib/systemd/backlight/", ss, ":", sysname, NULL);
d22a5aa
+        escaped_ss = cescape(ss);
d22a5aa
+        if (!escaped_ss) {
d22a5aa
+                log_oom();
d22a5aa
+                return EXIT_FAILURE;
d22a5aa
+        }
d22a5aa
+
d22a5aa
+        escaped_sysname = cescape(sysname);
d22a5aa
+        if (!escaped_sysname) {
d22a5aa
+                log_oom();
d22a5aa
+                return EXIT_FAILURE;
d22a5aa
+        }
d22a5aa
+
d22a5aa
+        path_id = udev_device_get_property_value(device, "ID_PATH");
d22a5aa
+        if (path_id) {
d22a5aa
+                escaped_path_id = cescape(path_id);
d22a5aa
+                if (!escaped_path_id) {
d22a5aa
+                        log_oom();
d22a5aa
+                        return EXIT_FAILURE;
d22a5aa
+                }
d22a5aa
+
d22a5aa
+                saved = strjoin("/var/lib/systemd/backlight/", escaped_path_id, ":", escaped_ss, ":", escaped_sysname, NULL);
d22a5aa
+        } else
d22a5aa
+                saved = strjoin("/var/lib/systemd/backlight/", escaped_ss, ":", escaped_sysname, NULL);
d22a5aa
+
d22a5aa
         if (!saved) {
d22a5aa
                 log_oom();
d22a5aa
                 return EXIT_FAILURE;