chiark / gitweb /
udev: properly handle symlink removal by 'change' event
[elogind.git] / src / udev / udev-event.c
index 2ade0ab81aa7a96e76da04bf85158004b4b86eff..33ed47763748e4365218afe382cab58ef8974b4d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003-2010 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2003-2010 Kay Sievers <kay@vrfy.org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -48,7 +48,7 @@ struct udev_event *udev_event_new(struct udev_device *dev)
         event->udev = udev;
         udev_list_init(udev, &event->run_list, false);
         event->fd_signal = -1;
-        event->birth_usec = now_usec();
+        event->birth_usec = now(CLOCK_MONOTONIC);
         event->timeout_usec = 30 * 1000 * 1000;
         return event;
 }
@@ -466,9 +466,9 @@ static void spawn_read(struct udev_event *event,
                 int i;
 
                 if (event->timeout_usec > 0) {
-                        unsigned long long age_usec;
+                        usec_t age_usec;
 
-                        age_usec = now_usec() - event->birth_usec;
+                        age_usec = now(CLOCK_MONOTONIC) - event->birth_usec;
                         if (age_usec >= event->timeout_usec) {
                                 log_error("timeout '%s'\n", cmd);
                                 goto out;
@@ -554,9 +554,9 @@ static int spawn_wait(struct udev_event *event, const char *cmd, pid_t pid)
                 int fdcount;
 
                 if (event->timeout_usec > 0) {
-                        unsigned long long age_usec;
+                        usec_t age_usec;
 
-                        age_usec = now_usec() - event->birth_usec;
+                        age_usec = now(CLOCK_MONOTONIC) - event->birth_usec;
                         if (age_usec >= event->timeout_usec)
                                 timeout = 1000;
                         else
@@ -767,7 +767,7 @@ static int rename_netif(struct udev_event *event)
         util_strscpy(ifr.ifr_newname, IFNAMSIZ, event->name);
         err = ioctl(sk, SIOCSIFNAME, &ifr);
         if (err >= 0) {
-                print_kmsg("renamed network interface %s to %s", ifr.ifr_name, ifr.ifr_newname);
+                print_kmsg("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname);
         } else {
                 err = -errno;
                 log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname);
@@ -797,8 +797,10 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules,
                 if (major(udev_device_get_devnum(dev)) != 0)
                         udev_node_remove(dev);
         } else {
-                event->dev_db = udev_device_new_from_syspath(event->udev, udev_device_get_syspath(dev));
+                event->dev_db = udev_device_new(event->udev);
                 if (event->dev_db != NULL) {
+                        udev_device_set_syspath(event->dev_db, udev_device_get_syspath(dev));
+                        udev_device_set_subsystem(event->dev_db, udev_device_get_subsystem(dev));
                         udev_device_read_db(event->dev_db, NULL);
                         udev_device_set_info_loaded(event->dev_db);
 
@@ -860,7 +862,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules,
                 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 if (udev_device_get_usec_initialized(event->dev) == 0)
-                        udev_device_set_usec_initialized(event->dev, now_usec());
+                        udev_device_set_usec_initialized(event->dev, now(CLOCK_MONOTONIC));
 
                 /* (re)write database file */
                 udev_device_update_db(dev);