diff options
author | Martin Schiller <ms@dev.tdt.de> | 2017-09-28 10:32:28 +0200 |
---|---|---|
committer | Hans Dedecker <dedeckeh@gmail.com> | 2017-10-06 13:54:58 +0200 |
commit | 3429bd8e7e34454d32615134bb5a5b2f6d832935 (patch) | |
tree | c585b9aebadc8e2fb7401c24848294b420cb1725 /system-linux.c | |
parent | 7d94ede3c38dd7b8e08c8a2fd8ae5ede71a2059b (diff) |
system-linux: add support for hotplug event 'move'
If you rename a network interface, there is a move uevent
invoked instead of remove/add.
This patch adds support for this kind of event.
Signed-off-by: Martin Schiller <ms@dev.tdt.de>
Acked-by: Hans Dedecker <dedeckeh@gmail.com>
Diffstat (limited to 'system-linux.c')
-rw-r--r-- | system-linux.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/system-linux.c b/system-linux.c index 6d97a02..32d6ffc 100644 --- a/system-linux.c +++ b/system-linux.c @@ -543,16 +543,20 @@ out: static void handle_hotplug_msg(char *data, int size) { - const char *subsystem = NULL, *interface = NULL; + const char *subsystem = NULL, *interface = NULL, *interface_old = NULL; char *cur, *end, *sep; struct device *dev; int skip; - bool add; + bool add, move = false; if (!strncmp(data, "add@", 4)) add = true; else if (!strncmp(data, "remove@", 7)) add = false; + else if (!strncmp(data, "move@", 5)) { + add = true; + move = true; + } else return; @@ -573,12 +577,32 @@ handle_hotplug_msg(char *data, int size) subsystem = sep + 1; if (strcmp(subsystem, "net") != 0) return; + } else if (!strcmp(cur, "DEVPATH_OLD")) { + interface_old = strrchr(sep + 1, '/'); + if (interface_old) + interface_old++; } - if (subsystem && interface) + } + + if (subsystem && interface) { + if (move && interface_old) + goto move; + else goto found; } + return; +move: + dev = device_find(interface_old); + if (!dev) + goto found; + + if (dev->type != &simple_device_type) + goto found; + + device_set_present(dev, false); + found: dev = device_find(interface); if (!dev) |