chiark / gitweb /
libudev: use sysfs attr ilist interface for attribute walk
[elogind.git] / udev / udev-event.c
index f41f06b16a0b29a93d6c5e4f0bf3cba3a2a0db85..100a79c1e84e1435b0c11fa8e29dbcc44f86217d 100644 (file)
@@ -564,7 +564,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules)
                udev_rules_apply_to_event(rules, event);
 
                /* rename a new network interface, if needed */
-               if (strcmp(udev_device_get_subsystem(dev), "net") == 0 && strcmp(udev_device_get_action(dev), "add") == 0 &&
+               if (udev_device_get_ifindex(dev) > 0 && strcmp(udev_device_get_action(dev), "add") == 0 &&
                    event->name != NULL && strcmp(event->name, udev_device_get_sysname(dev)) != 0) {
                        char syspath[UTIL_PATH_SIZE];
                        char *pos;
@@ -631,12 +631,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules)
                        /* set device node name */
                        util_strscpyl(filename, sizeof(filename), udev_get_dev_path(event->udev), "/", event->name, NULL);
                        udev_device_set_devnode(dev, filename);
-               }
 
-               udev_device_update_db(dev);
-               udev_device_tag_index(dev, event->dev_db, true);
-
-               if (major(udev_device_get_devnum(dev)) != 0) {
                        /* remove/update possible left-over symlinks from old database entry */
                        if (event->dev_db != NULL)
                                udev_node_update_old_links(dev, event->dev_db);
@@ -648,6 +643,17 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules)
                        err = udev_node_add(dev, event->mode, event->uid, event->gid);
                }
 
+               /* preserve old, or get new initialization timestamp */
+               if (event->dev_db != NULL && udev_device_get_usec_initialized(event->dev_db) > 0)
+                       udev_device_set_usec_initialized(event->dev, udev_device_get_usec_initialized(event->dev_db));
+               else
+                       udev_device_set_usec_initialized(event->dev, usec_monotonic());
+
+               /* (re)write database file */
+               udev_device_update_db(dev);
+               udev_device_tag_index(dev, event->dev_db, true);
+               udev_device_set_is_initialized(dev);
+
                udev_device_unref(event->dev_db);
                event->dev_db = NULL;
        }