chiark / gitweb /
events for "bus" and "class" registration must be matched as "subsystem"
[elogind.git] / udev_rules_parse.c
index 5ce91df383dfdb5c924b7008549b6d7b8679d70c..9166980488fa0362fe8316753dd11fb0d278f35f 100644 (file)
@@ -298,7 +298,16 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
                                err("invalid SUBSYSTEM operation");
                                goto invalid;
                        }
-                       add_rule_key(rule, &rule->subsystem, operation, value);
+                       /* bus, class, subsystem events should all be the same */
+                       if (strcmp(value, "subsystem") == 0 ||
+                           strcmp(value, "bus") == 0 ||
+                           strcmp(value, "class") == 0) {
+                               if (strcmp(value, "bus") == 0 || strcmp(value, "class") == 0)
+                                       err("'%s' must be specified as 'subsystem' "
+                                           "please fix it in %s:%u", value, filename, lineno);
+                               add_rule_key(rule, &rule->subsystem, operation, "subsystem|class|bus");
+                       } else
+                               add_rule_key(rule, &rule->subsystem, operation, value);
                        valid = 1;
                        continue;
                }
@@ -376,7 +385,7 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
                        if (strncmp(attr, "device/", 7) == 0)
                                err("the 'device' link is deprecated and will be removed from a future kernel, "
                                    "please fix it in %s:%u", filename, lineno);
-                       else if (strchr(attr, '/') != NULL)
+                       else if (strstr(attr, "../") != NULL)
                                err("do not reference parent sysfs directories directly, that may break with a future kernel, "
                                    "please fix it in %s:%u", filename, lineno);
                        if (add_rule_key_pair(rule, &rule->attrs, operation, attr, value) != 0)
@@ -555,6 +564,8 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
                }
 
                if (strcasecmp(key, "OPTIONS") == 0) {
+                       const char *pos;
+
                        if (strstr(value, "last_rule") != NULL) {
                                dbg("last rule to be applied");
                                rule->last_rule = 1;
@@ -567,6 +578,11 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
                                dbg("remove event should be ignored");
                                rule->ignore_remove = 1;
                        }
+                       pos = strstr(value, "link_priority=");
+                       if (pos != NULL) {
+                               rule->link_priority = atoi(&pos[strlen("link_priority=")]);
+                               info("link priority=%i", rule->link_priority);
+                       }
                        if (strstr(value, "all_partitions") != NULL) {
                                dbg("creation of partition nodes requested");
                                rule->partitions = DEFAULT_PARTITIONS_COUNT;