diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-07-03 22:31:59 -0700 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-07-03 22:31:59 -0700 |
commit | 1205a11fdbbb58e0cedb387afdfb4e1c2b2ad2d0 (patch) | |
tree | 2465a5ff21eab5f52a0280de715283eed3ea0114 /src/udev-compat.c | |
parent | 1c3c447691960239fd9362e9d63ee8f5004c00f3 (diff) | |
download | connman-1205a11fdbbb58e0cedb387afdfb4e1c2b2ad2d0.tar.gz connman-1205a11fdbbb58e0cedb387afdfb4e1c2b2ad2d0.tar.bz2 connman-1205a11fdbbb58e0cedb387afdfb4e1c2b2ad2d0.zip |
Use RTNL device detection only if udev is not available
Diffstat (limited to 'src/udev-compat.c')
-rw-r--r-- | src/udev-compat.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/udev-compat.c b/src/udev-compat.c index 516a48db..333eb894 100644 --- a/src/udev-compat.c +++ b/src/udev-compat.c @@ -23,8 +23,73 @@ #include <config.h> #endif +#include <glib.h> + #include "connman.h" +static GSList *device_list = NULL; + +static struct connman_device *find_device(int index) +{ + GSList *list; + + for (list = device_list; list; list = list->next) { + struct connman_device *device = list->data; + + if (connman_device_get_index(device) == index) + return device; + } + + return NULL; +} + +static void detect_newlink(unsigned short type, int index, + unsigned flags, unsigned change) +{ + struct connman_device *device; + + DBG("type %d index %d", type, index); + + device = find_device(index); + if (device != NULL) + return; + + device = connman_inet_create_device(index); + if (device == NULL) + return; + + if (connman_device_register(device) < 0) { + connman_device_unref(device); + return; + } + + device_list = g_slist_append(device_list, device); +} + +static void detect_dellink(unsigned short type, int index, + unsigned flags, unsigned change) +{ + struct connman_device *device; + + DBG("type %d index %d", type, index); + + device = find_device(index); + if (device == NULL) + return; + + device_list = g_slist_remove(device_list, device); + + connman_device_unregister(device); + connman_device_unref(device); +} + +static struct connman_rtnl detect_rtnl = { + .name = "detect", + .priority = CONNMAN_RTNL_PRIORITY_LOW, + .newlink = detect_newlink, + .dellink = detect_dellink, +}; + char *__connman_udev_get_devtype(const char *ifname) { return NULL; @@ -32,9 +97,34 @@ char *__connman_udev_get_devtype(const char *ifname) int __connman_udev_init(void) { + int err; + + DBG(""); + + err = connman_rtnl_register(&detect_rtnl); + if (err < 0) + return err; + + connman_rtnl_send_getlink(); + return 0; } void __connman_udev_cleanup(void) { + GSList *list; + + DBG(""); + + connman_rtnl_unregister(&detect_rtnl); + + for (list = device_list; list; list = list->next) { + struct connman_device *device = list->data; + + connman_device_unregister(device); + connman_device_unref(device); + } + + g_slist_free(device_list); + device_list = NULL; } |