X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Fudev-event.c;h=ae523f83c5727249c6b7afae7c018780a698cb52;hb=457c67e7c1bc971c64e56dd11aaf697d2f9a1c76;hp=7785ad892c308a1b07bee1d8ddab06576e505479;hpb=09c03103028011935044bbade29a602925898f27;p=elogind.git diff --git a/udev/udev-event.c b/udev/udev-event.c index 7785ad892..ae523f83c 100644 --- a/udev/udev-event.c +++ b/udev/udev-event.c @@ -454,8 +454,8 @@ static void rename_netif_kernel_log(struct ifreq ifr) return; } - fprintf(f, "<6>udev: renamed network interface %s to %s\n", - ifr.ifr_name, ifr.ifr_newname); + fprintf(f, "<6>udev[%u]: renamed network interface %s to %s\n", + getpid(), ifr.ifr_name, ifr.ifr_newname); fclose(f); } @@ -464,8 +464,8 @@ static int rename_netif(struct udev_event *event) struct udev_device *dev = event->dev; int sk; struct ifreq ifr; + int loop; int err; - char *newdup; info(event->udev, "changing net interface name from '%s' to '%s'\n", udev_device_get_sysname(dev), event->name); @@ -473,61 +473,58 @@ static int rename_netif(struct udev_event *event) sk = socket(PF_INET, SOCK_DGRAM, 0); if (sk < 0) { err(event->udev, "error opening socket: %m\n"); - return -1; + return -errno; } memset(&ifr, 0x00, sizeof(struct ifreq)); 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) + if (err == 0) { rename_netif_kernel_log(ifr); - else { - int loop; - - /* see if the destination interface name already exists */ - if (errno != EEXIST) { - err(event->udev, "error changing netif name %s to %s: %m\n", - ifr.ifr_name, ifr.ifr_newname); - goto exit; - } + goto out; + } - /* free our own name, another process may wait for us */ - newdup = strdup(ifr.ifr_newname); - util_strscpyl(ifr.ifr_newname, IFNAMSIZ, udev_device_get_sysname(dev), "-", newdup, NULL); - free(newdup); - err = ioctl(sk, SIOCSIFNAME, &ifr); - if (err != 0) { - err(event->udev, "error changing netif name %s to %s: %m\n", - ifr.ifr_name, ifr.ifr_newname); - goto exit; - } - rename_netif_kernel_log(ifr); + /* keep trying if the destination interface name already exists */ + err = -errno; + if (err != -EEXIST) + goto out; - /* wait 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 }; + /* free our own name, another process may wait for us */ + util_strscpyl(ifr.ifr_newname, IFNAMSIZ, udev_device_get_sysname(dev), "-", event->name, NULL); + err = ioctl(sk, SIOCSIFNAME, &ifr); + if (err < 0) { + err = -errno; + goto out; + } - err = ioctl(sk, SIOCSIFNAME, &ifr); - if (err == 0) { - rename_netif_kernel_log(ifr); - break; - } + /* log temporary name */ + rename_netif_kernel_log(ifr); - if (errno != EEXIST) { - err(event->udev, "error changing net interface name %s to %s: %m\n", - ifr.ifr_name, ifr.ifr_newname); - break; - } - dbg(event->udev, "wait for netif '%s' to become free, loop=%i\n", - event->name, (90 * 20) - loop); - nanosleep(&duration, NULL); + /* 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 }; + + dbg(event->udev, "wait for netif '%s' to become free, loop=%i\n", + event->name, (90 * 20) - loop); + nanosleep(&duration, NULL); + + err = ioctl(sk, SIOCSIFNAME, &ifr); + if (err == 0) { + rename_netif_kernel_log(ifr); + break; } + err = -errno; + if (err != -EEXIST) + break; } -exit: + +out: + if (err < 0) + err(event->udev, "error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname); close(sk); return err; } @@ -537,14 +534,6 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules) struct udev_device *dev = event->dev; int err = 0; - if (udev_device_get_sysname_old(dev) != NULL && - strcmp(udev_device_get_sysname_old(dev), udev_device_get_sysname(dev)) != 0) { - udev_device_rename_db(dev); - info(event->udev, "moved database from '%s:%s' to '%s:%s'\n", - udev_device_get_subsystem(dev), udev_device_get_sysname_old(dev), - udev_device_get_subsystem(dev), udev_device_get_sysname(dev)); - } - if (strcmp(udev_device_get_action(dev), "remove") == 0) { udev_device_read_db(dev); udev_device_delete_db(dev);