chiark / gitweb /
rfkill: use ID_PATH as identifier for rfkill state files
authorLennart Poettering <lennart@poettering.net>
Mon, 14 Oct 2013 16:52:07 +0000 (18:52 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 14 Oct 2013 17:02:44 +0000 (19:02 +0200)
Let's include the stable device path for the rfkill devices in the name
of the file we store the rfkill state in, so that we have some stability
regarding enumeration order.

rules/99-systemd.rules.in
src/rfkill/rfkill.c

index 2ffe744413043026d29b26519861d7e210223bba..8e877809a2327cd43eafe7e5f7c18c5254f83d8e 100644 (file)
@@ -59,7 +59,7 @@ ACTION=="add", SUBSYSTEM=="leds", KERNEL=="*kbd_backlight", TAG+="systemd", ENV{
 
 # Pull in rfkill save/restore for all rfkill devices
 
-ACTION=="add", SUBSYSTEM=="rfkill", TAG+="systemd", ENV{SYSTEMD_WANTS}+="systemd-rfkill@rfkill:$name.service"
+ACTION=="add", SUBSYSTEM=="rfkill", TAG+="systemd", IMPORT{builtin}="path_id", ENV{SYSTEMD_WANTS}+="systemd-rfkill@$name.service"
 
 # Asynchronously mount file systems implemented by these modules as
 # soon as they are loaded.
index 91536523b0b146c3eac8a0e747989e8ebbdabb17..ad1d63d32deaaba1a778492397e6b79a775fbec7 100644 (file)
@@ -28,8 +28,8 @@
 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, *escaped_name = NULL;
-        const char *sysname, *name;
+        _cleanup_free_ char *saved = NULL, *escaped_name = NULL, *escaped_path_id = NULL;
+        const char *name, *path_id;
         int r;
 
         if (argc != 3) {
@@ -55,30 +55,11 @@ int main(int argc, char *argv[]) {
                 return EXIT_FAILURE;
         }
 
-        sysname = strchr(argv[2], ':');
-        if (!sysname) {
-                log_error("Requires pair of subsystem and sysname for specifying rfkill device.");
-                return EXIT_FAILURE;
-        }
-
-        ss = strndup(argv[2], sysname - argv[2]);
-        if (!ss) {
-                log_oom();
-                return EXIT_FAILURE;
-        }
-
-        sysname++;
-
-        if (!streq(ss, "rfkill")) {
-                log_error("Not a rfkill device: '%s:%s'", ss, sysname);
-                return EXIT_FAILURE;
-        }
-
         errno = 0;
-        device = udev_device_new_from_subsystem_sysname(udev, ss, sysname);
+        device = udev_device_new_from_subsystem_sysname(udev, "rfkill", argv[2]);
         if (!device) {
                 if (errno != 0)
-                        log_error("Failed to get rfkill device '%s:%s': %m", ss, sysname);
+                        log_error("Failed to get rfkill device '%s': %m", argv[2]);
                 else
                         log_oom();
 
@@ -97,7 +78,18 @@ int main(int argc, char *argv[]) {
                 return EXIT_FAILURE;
         }
 
-        saved = strjoin("/var/lib/systemd/rfkill/", escaped_name, NULL);
+        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/rfkill/", escaped_path_id, "-", escaped_name, NULL);
+        } else
+                saved = strjoin("/var/lib/systemd/rfkill/", escaped_name, NULL);
+
         if (!saved) {
                 log_oom();
                 return EXIT_FAILURE;