chiark / gitweb /
[PATCH] handle renamed network interfaces properly if we manage hotplug.d/
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Mon, 20 Dec 2004 07:57:31 +0000 (08:57 +0100)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 06:19:09 +0000 (23:19 -0700)
If we take over the hotplug call and manage the events we don't need
to call the event fake script in dev.d/. Just set all expected values
to the new network interface name and call hotplug.d/. This way the
device renaming is completely handled inside of udev and userspace
can't get confused.

etc/dev.d/net/hotplug.dev
udev.c
udev_add.c
udevd.c
udevsend.c

index 15cc5cb52e5d9ca866bdd19d588aa5003a439a63..e195b0f034f900a8bcec3f0021f9c3c30e80407f 100644 (file)
@@ -8,15 +8,13 @@
 # Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
 #
 
-# See if we really did rename this device.
-if [ "$INTERFACE" = "$DEVNAME" ]; then
+# Do nothing if udev handles hotplug.d.
+if [ "$MANAGED_EVENT" == "1" ]; then
        exit 0
 fi
 
-# ok, we have renamed this device, so let's set $INTERFACE to the new name
-# and call the network hotplug script to handle it properly...
-INTERFACE=$DEVNAME
-export INTERFACE
+# ok, we have renamed this device, so let the network hotplug script
+# know about it to setup the device properly...
 if [ -f /etc/hotplug.d/default/default.hotplug ]; then
        exec /etc/hotplug.d/default/default.hotplug net
 fi
diff --git a/udev.c b/udev.c
index e5d7800ecf73f5d3173d71f791e0c6ee614a6f83..122d34c1a5397b7e85ae20ea3c027eaefac3725d 100644 (file)
--- a/udev.c
+++ b/udev.c
@@ -54,31 +54,32 @@ void log_message(int level, const char *format, ...)
 }
 #endif
 
-/* (for now) true if udevsend is the helper */
+/* decide if we should manage the whole hotplug event
+ * for now look if the kernel calls udevsend instead of /sbin/hotplug
+ */
 static int manage_hotplug_event(void) {
        char helper[256];
        int fd;
        int len;
 
-       /* false, if we are called directly */
-       if (!getenv("MANAGED_EVENT"))
-               goto exit;
+       /* don't handle hotplug.d if we are called directly */
+       if (!getenv("UDEVD_EVENT"))
+               return 0;
 
        fd = open("/proc/sys/kernel/hotplug", O_RDONLY);
        if (fd < 0)
-               goto exit;
+               return 0;
 
        len = read(fd, helper, 256);
        close(fd);
 
        if (len < 0)
-               goto exit;
+               return 0;
        helper[len] = '\0';
 
        if (strstr(helper, "udevsend"))
                return 1;
 
-exit:
        return 0;
 }
 
@@ -104,6 +105,7 @@ int main(int argc, char *argv[], char *envp[])
        const char *action;
        const char *devpath;
        const char *subsystem;
+       int managed_event;
        int retval = -EINVAL;
 
        if (argc == 2 && strcmp(argv[1], "-V") == 0) {
@@ -139,6 +141,11 @@ int main(int argc, char *argv[], char *envp[])
                goto exit;
        }
 
+       /* let the executed programs know if we handle the whole hotplug event */
+       managed_event = manage_hotplug_event();
+       if (managed_event)
+               setenv("MANAGED_EVENT", "1", 1);
+
        action = getenv("ACTION");
        devpath = getenv("DEVPATH");
        subsystem = getenv("SUBSYSTEM");
@@ -238,7 +245,7 @@ int main(int argc, char *argv[], char *envp[])
        }
 
 hotplug:
-       if (udev_hotplug_d && manage_hotplug_event())
+       if (udev_hotplug_d && managed_event)
                udev_multiplex_directory(&udev, HOTPLUGD_DIR, HOTPLUG_SUFFIX);
 
 exit:
index c9b30bad90b93eae8e6aead51a6113914c7c95b8..acd678ffbaec4d76d4d450c37c067fea88ae12c7 100644 (file)
@@ -318,15 +318,16 @@ int udev_add_device(struct udevice *udev, struct sysfs_class_device *class_dev)
                        if (retval != 0)
                                goto exit;
 
-                       /* we've changed the name, now fake the devpath,
-                        * cause original kernel name sleeps with the fishes
-                        * and we don't get any event from the kernel now
+                       /* we've changed the name, now fake the devpath, cause the
+                        * original kernel name sleeps with the fishes and we don't
+                        * get an event from the kernel with the new name
                         */
                        pos = strrchr(udev->devpath, '/');
                        if (pos != NULL) {
                                pos[1] = '\0';
                                strfieldcat(udev->devpath, udev->name);
                                setenv("DEVPATH", udev->devpath, 1);
+                               setenv("INTERFACE", udev->name, 1);
                        }
 
                        /* use netif name for the environment */
diff --git a/udevd.c b/udevd.c
index 91189eb86153fc52046b104ff4d2523179fe2d1e..3c29c2be6e1ef67cefc37f2fe15b9b3913962051 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -335,7 +335,7 @@ static void handle_udevsend_msg(int sock)
                if (strncmp(key, "PHYSDEVPATH=", 12) == 0)
                        msg->physdevpath = &key[12];
        }
-       msg->envp[i++] = "MANAGED_EVENT=1";
+       msg->envp[i++] = "UDEVD_EVENT=1";
        msg->envp[i] = NULL;
 
        /* if no seqnum is given, we move straight to exec queue */
index 74cc09b3300869f5af734c4075eb265262f55aa8..05a50facc51600cb5eeb04eed1e3702f279686c4 100644 (file)
@@ -154,7 +154,7 @@ int main(int argc, char *argv[], char *envp[])
                }
 
                /* prevent loops in the scripts we execute */
-               if (strncmp(key, "MANAGED_EVENT=", 14) == 0) {
+               if (strncmp(key, "UDEVD_EVENT=", 12) == 0) {
                        dbg("seems that the event source is not the kernel, just exit");
                        goto exit;
                }