summaryrefslogtreecommitdiff
path: root/src/udev
diff options
context:
space:
mode:
authorKay Sievers <kay@vrfy.org>2012-07-05 17:40:50 +0200
committerKay Sievers <kay@vrfy.org>2012-07-05 17:40:50 +0200
commit97595710b77aa162ca5e20da57d0a1ed7355eaad (patch)
tree1d7412c52d0591b14bef72b7c7db91d49f00f2e2 /src/udev
parent47ef94ac5f39db6c5c18be10afe32397a0a8d5cc (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.c69
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
748static 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
768static int rename_netif(struct udev_event *event) 748static 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
830out:
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}