mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-24 21:34:08 +03:00
udev: network device renaming - immediately give up if the target name isn't available
This commit is contained in:
parent
47ef94ac5f
commit
97595710b7
@ -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,19 @@ 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;
|
||||
}
|
||||
if (err >= 0) {
|
||||
FILE *f;
|
||||
|
||||
/* 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;
|
||||
f = fopen("/dev/kmsg", "we");
|
||||
if (f != NULL) {
|
||||
fprintf(f, "<30>systemd-udevd[%u]: renamed network interface %s to %s\n",
|
||||
getpid(), ifr.ifr_name, ifr.ifr_newname);
|
||||
fclose(f);
|
||||
}
|
||||
} 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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user