udev: use sd_device for udev_event.dev_parent
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 29 Oct 2018 06:16:00 +0000 (15:16 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 7 Nov 2018 04:35:03 +0000 (13:35 +0900)
src/udev/udev-event.c
src/udev/udev-rules.c
src/udev/udev.h

index 1270369..2984548 100644 (file)
@@ -159,7 +159,7 @@ static ssize_t subst_format_var(struct udev_event *event,
         case SUBST_ID:
                 if (!event->dev_parent)
                         return 0;
-                r = sd_device_get_sysname(event->dev_parent->device, &val);
+                r = sd_device_get_sysname(event->dev_parent, &val);
                 if (r < 0)
                         return r;
                 l = strpcpy(&s, l, val);
@@ -167,7 +167,7 @@ static ssize_t subst_format_var(struct udev_event *event,
         case SUBST_DRIVER:
                 if (!event->dev_parent)
                         return 0;
-                r = sd_device_get_driver(event->dev_parent->device, &val);
+                r = sd_device_get_driver(event->dev_parent, &val);
                 if (r < 0)
                         return r == -ENOENT ? 0 : r;
                 l = strpcpy(&s, l, val);
@@ -240,8 +240,8 @@ static ssize_t subst_format_var(struct udev_event *event,
                         (void) sd_device_get_sysattr_value(dev, attr, &val);
 
                 /* try to read the attribute of the parent device, other matches have selected */
-                if (!val && event->dev_parent && event->dev_parent->device != dev)
-                        (void) sd_device_get_sysattr_value(event->dev_parent->device, attr, &val);
+                if (!val && event->dev_parent && event->dev_parent != dev)
+                        (void) sd_device_get_sysattr_value(event->dev_parent, attr, &val);
 
                 if (!val)
                         return 0;
index daa3fd2..cf1c442 100644 (file)
@@ -1861,32 +1861,39 @@ int udev_rules_apply_to_event(
                                 next++;
 
                         /* loop over parents */
-                        event->dev_parent = event->dev;
+                        event->dev_parent = event->dev->device;
                         for (;;) {
                                 struct token *key;
+                                const char *val;
 
                                 /* loop over sequence of parent match keys */
                                 for (key = cur; key < next; key++ ) {
                                         dump_token(rules, key);
                                         switch(key->type) {
                                         case TK_M_KERNELS:
-                                                if (match_key(rules, key, udev_device_get_sysname(event->dev_parent)) != 0)
+                                                if (sd_device_get_sysname(event->dev_parent, &val) < 0)
+                                                        goto try_parent;
+                                                if (match_key(rules, key, val) != 0)
                                                         goto try_parent;
                                                 break;
                                         case TK_M_SUBSYSTEMS:
-                                                if (match_key(rules, key, udev_device_get_subsystem(event->dev_parent)) != 0)
+                                                if (sd_device_get_subsystem(event->dev_parent, &val) < 0)
+                                                        goto try_parent;
+                                                if (match_key(rules, key, val) != 0)
                                                         goto try_parent;
                                                 break;
                                         case TK_M_DRIVERS:
-                                                if (match_key(rules, key, udev_device_get_driver(event->dev_parent)) != 0)
+                                                if (sd_device_get_driver(event->dev_parent, &val) < 0)
+                                                        goto try_parent;
+                                                if (match_key(rules, key, val) != 0)
                                                         goto try_parent;
                                                 break;
                                         case TK_M_ATTRS:
-                                                if (match_attr(rules, event->dev_parent->device, event, key) != 0)
+                                                if (match_attr(rules, event->dev_parent, event, key) != 0)
                                                         goto try_parent;
                                                 break;
                                         case TK_M_TAGS: {
-                                                bool match = udev_device_has_tag(event->dev_parent, rules_str(rules, cur->key.value_off));
+                                                bool match = sd_device_has_tag(event->dev_parent, rules_str(rules, cur->key.value_off));
 
                                                 if (match && key->key.op == OP_NOMATCH)
                                                         goto try_parent;
@@ -1901,9 +1908,10 @@ int udev_rules_apply_to_event(
                                 break;
 
                         try_parent:
-                                event->dev_parent = udev_device_get_parent(event->dev_parent);
-                                if (event->dev_parent == NULL)
+                                if (sd_device_get_parent(event->dev_parent, &event->dev_parent) < 0) {
+                                        event->dev_parent = NULL;
                                         goto nomatch;
+                                }
                         }
                         /* move behind our sequence of parent match keys */
                         cur = next;
index c963af8..85fcdc4 100644 (file)
@@ -22,7 +22,7 @@
 
 struct udev_event {
         struct udev_device *dev;
-        struct udev_device *dev_parent;
+        sd_device *dev_parent;
         sd_device *dev_db_clone;
         char *name;
         char *program_result;