diff options
author | Kay Sievers <kay@vrfy.org> | 2012-07-05 17:40:50 +0200 |
---|---|---|
committer | Kay Sievers <kay@vrfy.org> | 2012-07-05 17:40:50 +0200 |
commit | 97595710b77aa162ca5e20da57d0a1ed7355eaad (patch) | |
tree | 1d7412c52d0591b14bef72b7c7db91d49f00f2e2 /src/udev | |
parent | 47ef94ac5f39db6c5c18be10afe32397a0a8d5cc (diff) |
udev: network device renaming - immediately give up if the target name isn't available
Diffstat (limited to 'src/udev')
-rw-r--r-- | src/udev/udev-event.c | 69 |
1 files changed, 9 insertions, 60 deletions
diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index aff14878a..46e579dce 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c | |||
@@ -745,32 +745,11 @@ out: | |||
745 | return err; | 745 | return err; |
746 | } | 746 | } |
747 | 747 | ||
748 | static void rename_netif_kernel_log(struct ifreq ifr) | ||
749 | { | ||
750 | int klog; | ||
751 | FILE *f; | ||
752 | |||
753 | klog = open("/dev/kmsg", O_WRONLY|O_CLOEXEC); | ||
754 | if (klog < 0) | ||
755 | return; | ||
756 | |||
757 | f = fdopen(klog, "w"); | ||
758 | if (f == NULL) { | ||
759 | close(klog); | ||
760 | return; | ||
761 | } | ||
762 | |||
763 | fprintf(f, "<30>udevd[%u]: renamed network interface %s to %s\n", | ||
764 | getpid(), ifr.ifr_name, ifr.ifr_newname); | ||
765 | fclose(f); | ||
766 | } | ||
767 | |||
768 | static int rename_netif(struct udev_event *event) | 748 | static int rename_netif(struct udev_event *event) |
769 | { | 749 | { |
770 | struct udev_device *dev = event->dev; | 750 | struct udev_device *dev = event->dev; |
771 | int sk; | 751 | int sk; |
772 | struct ifreq ifr; | 752 | struct ifreq ifr; |
773 | int loop; | ||
774 | int err; | 753 | int err; |
775 | 754 | ||
776 | log_debug("changing net interface name from '%s' to '%s'\n", | 755 | log_debug("changing net interface name from '%s' to '%s'\n", |
@@ -787,49 +766,19 @@ static int rename_netif(struct udev_event *event) | |||
787 | util_strscpy(ifr.ifr_name, IFNAMSIZ, udev_device_get_sysname(dev)); | 766 | util_strscpy(ifr.ifr_name, IFNAMSIZ, udev_device_get_sysname(dev)); |
788 | util_strscpy(ifr.ifr_newname, IFNAMSIZ, event->name); | 767 | util_strscpy(ifr.ifr_newname, IFNAMSIZ, event->name); |
789 | err = ioctl(sk, SIOCSIFNAME, &ifr); | 768 | err = ioctl(sk, SIOCSIFNAME, &ifr); |
790 | if (err == 0) { | 769 | if (err >= 0) { |
791 | rename_netif_kernel_log(ifr); | 770 | FILE *f; |
792 | goto out; | ||
793 | } | ||
794 | |||
795 | /* keep trying if the destination interface name already exists */ | ||
796 | err = -errno; | ||
797 | if (err != -EEXIST) | ||
798 | goto out; | ||
799 | |||
800 | /* free our own name, another process may wait for us */ | ||
801 | snprintf(ifr.ifr_newname, IFNAMSIZ, "rename%u", udev_device_get_ifindex(dev)); | ||
802 | err = ioctl(sk, SIOCSIFNAME, &ifr); | ||
803 | if (err < 0) { | ||
804 | err = -errno; | ||
805 | goto out; | ||
806 | } | ||
807 | |||
808 | /* log temporary name */ | ||
809 | rename_netif_kernel_log(ifr); | ||
810 | |||
811 | /* wait a maximum of 90 seconds for our target to become available */ | ||
812 | util_strscpy(ifr.ifr_name, IFNAMSIZ, ifr.ifr_newname); | ||
813 | util_strscpy(ifr.ifr_newname, IFNAMSIZ, event->name); | ||
814 | loop = 90 * 20; | ||
815 | while (loop--) { | ||
816 | const struct timespec duration = { 0, 1000 * 1000 * 1000 / 20 }; | ||
817 | |||
818 | nanosleep(&duration, NULL); | ||
819 | 771 | ||
820 | err = ioctl(sk, SIOCSIFNAME, &ifr); | 772 | f = fopen("/dev/kmsg", "we"); |
821 | if (err == 0) { | 773 | if (f != NULL) { |
822 | rename_netif_kernel_log(ifr); | 774 | fprintf(f, "<30>systemd-udevd[%u]: renamed network interface %s to %s\n", |
823 | break; | 775 | getpid(), ifr.ifr_name, ifr.ifr_newname); |
776 | fclose(f); | ||
824 | } | 777 | } |
778 | } else { | ||
825 | err = -errno; | 779 | err = -errno; |
826 | if (err != -EEXIST) | ||
827 | break; | ||
828 | } | ||
829 | |||
830 | out: | ||
831 | if (err < 0) | ||
832 | log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname); | 780 | log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname); |
781 | } | ||
833 | close(sk); | 782 | close(sk); |
834 | return err; | 783 | return err; |
835 | } | 784 | } |