X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fudev%2Fudev-event.c;h=33ed47763748e4365218afe382cab58ef8974b4d;hb=bf9d233f781f27841be6638ee745e9c80bda5f4d;hp=aff14878a709a9fb5c925bd0657ecbee98a4dda9;hpb=47ef94ac5f39db6c5c18be10afe32397a0a8d5cc;p=elogind.git diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index aff14878a..33ed47763 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2010 Kay Sievers + * Copyright (C) 2003-2010 Kay Sievers * * 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; } @@ -319,7 +319,7 @@ subst: break; devnode = udev_device_get_devnode(dev_parent); if (devnode != NULL) - l = util_strpcpy(&s, l, devnode + strlen(TEST_PREFIX "/dev/")); + l = util_strpcpy(&s, l, devnode + strlen("/dev/")); break; } case SUBST_DEVNODE: @@ -330,7 +330,7 @@ subst: if (event->name != NULL) l = util_strpcpy(&s, l, event->name); else if (udev_device_get_devnode(dev) != NULL) - l = util_strpcpy(&s, l, udev_device_get_devnode(dev) + strlen(TEST_PREFIX "/dev/")); + l = util_strpcpy(&s, l, udev_device_get_devnode(dev) + strlen("/dev/")); else l = util_strpcpy(&s, l, udev_device_get_sysname(dev)); break; @@ -340,16 +340,16 @@ subst: list_entry = udev_device_get_devlinks_list_entry(dev); if (list_entry == NULL) break; - l = util_strpcpy(&s, l, udev_list_entry_get_name(list_entry) + strlen(TEST_PREFIX "/dev/")); + l = util_strpcpy(&s, l, udev_list_entry_get_name(list_entry) + strlen("/dev/")); udev_list_entry_foreach(list_entry, udev_list_entry_get_next(list_entry)) - l = util_strpcpyl(&s, l, " ", udev_list_entry_get_name(list_entry) + strlen(TEST_PREFIX "/dev/"), NULL); + l = util_strpcpyl(&s, l, " ", udev_list_entry_get_name(list_entry) + strlen("/dev/"), NULL); break; } case SUBST_ROOT: - l = util_strpcpy(&s, l, TEST_PREFIX "/dev"); + l = util_strpcpy(&s, l, "/dev"); break; case SUBST_SYS: - l = util_strpcpy(&s, l, TEST_PREFIX "/sys"); + l = util_strpcpy(&s, l, "/sys"); break; case SUBST_ENV: if (attr == NULL) { @@ -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 @@ -745,32 +745,11 @@ out: return err; } -static void rename_netif_kernel_log(struct ifreq ifr) -{ - int klog; - FILE *f; - - klog = open("/dev/kmsg", O_WRONLY|O_CLOEXEC); - if (klog < 0) - return; - - f = fdopen(klog, "w"); - if (f == NULL) { - close(klog); - return; - } - - fprintf(f, "<30>udevd[%u]: renamed network interface %s to %s\n", - getpid(), ifr.ifr_name, ifr.ifr_newname); - fclose(f); -} - static int rename_netif(struct udev_event *event) { struct udev_device *dev = event->dev; int sk; struct ifreq ifr; - int loop; int err; log_debug("changing net interface name from '%s' to '%s'\n", @@ -787,49 +766,12 @@ static int rename_netif(struct udev_event *event) util_strscpy(ifr.ifr_name, IFNAMSIZ, udev_device_get_sysname(dev)); util_strscpy(ifr.ifr_newname, IFNAMSIZ, event->name); err = ioctl(sk, SIOCSIFNAME, &ifr); - if (err == 0) { - rename_netif_kernel_log(ifr); - goto out; - } - - /* keep trying if the destination interface name already exists */ - err = -errno; - if (err != -EEXIST) - goto out; - - /* free our own name, another process may wait for us */ - snprintf(ifr.ifr_newname, IFNAMSIZ, "rename%u", udev_device_get_ifindex(dev)); - err = ioctl(sk, SIOCSIFNAME, &ifr); - if (err < 0) { - err = -errno; - goto out; - } - - /* log temporary name */ - rename_netif_kernel_log(ifr); - - /* wait a maximum of 90 seconds for our target to become available */ - util_strscpy(ifr.ifr_name, IFNAMSIZ, ifr.ifr_newname); - util_strscpy(ifr.ifr_newname, IFNAMSIZ, event->name); - loop = 90 * 20; - while (loop--) { - const struct timespec duration = { 0, 1000 * 1000 * 1000 / 20 }; - - nanosleep(&duration, NULL); - - err = ioctl(sk, SIOCSIFNAME, &ifr); - if (err == 0) { - rename_netif_kernel_log(ifr); - break; - } + if (err >= 0) { + print_kmsg("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname); + } else { err = -errno; - if (err != -EEXIST) - break; - } - -out: - if (err < 0) log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname); + } close(sk); return err; } @@ -855,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); @@ -918,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);