chiark / gitweb /
hack to allow ATTR{block/*/uevent}="change"
authorKay Sievers <kay.sievers@vrfy.org>
Thu, 13 Mar 2008 15:00:25 +0000 (16:00 +0100)
committerKay Sievers <kay.sievers@vrfy.org>
Thu, 13 Mar 2008 15:00:25 +0000 (16:00 +0100)
udev_rules.c

index 5ae4aa2b7817c0f6a1f48e0480eb879a1e6676c7..e464404b5947e14a9eb4a97a6edbb0266c0cc2ab 100644 (file)
@@ -26,6 +26,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <syslog.h>
+#include <dirent.h>
 #include <fnmatch.h>
 #include <sys/socket.h>
 #include <sys/un.h>
@@ -1243,6 +1244,7 @@ try_parent:
                if (pair->key.operation == KEY_OP_ASSIGN) {
                        const char *key_name = key_pair_name(rule, pair);
                        char devpath[PATH_SIZE];
+                       char *pos;
                        char *attrib;
                        char attr[PATH_SIZE] = "";
                        char value[NAME_SIZE];
@@ -1264,6 +1266,28 @@ try_parent:
                                strlcat(attr, key_name, sizeof(attr));
                        }
 
+                       pos = strstr(attr, "/*/");
+                       if (pos != NULL) {
+                               char str[PATH_SIZE];
+                               DIR *dir;
+
+                               pos[1] = '\0';
+                               strlcpy(str, &pos[2], sizeof(str));
+                               dir = opendir(attr);
+                               if (dir != NULL) {
+                                       struct dirent *dent;
+
+                                       for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+                                               if (dent->d_name[0] == '.')
+                                                       continue;
+                                               strlcat(attr, dent->d_name, sizeof(attr));
+                                               break;
+                                       }
+                                       closedir(dir);
+                               }
+                               strlcat(attr, str, sizeof(attr));
+                       }
+
                        strlcpy(value, key_val(rule, &pair->key), sizeof(value));
                        udev_rules_apply_format(udev, value, sizeof(value));
                        info("writing '%s' to sysfs file '%s'", value, attr);