From 1205a11fdbbb58e0cedb387afdfb4e1c2b2ad2d0 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 3 Jul 2009 22:31:59 -0700 Subject: [PATCH] Use RTNL device detection only if udev is not available --- src/Makefile.am | 2 +- src/connman.h | 3 -- src/detect.c | 125 ---------------------------------------------- src/element.c | 2 - src/udev-compat.c | 90 +++++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 131 deletions(-) delete mode 100644 src/detect.c diff --git a/src/Makefile.am b/src/Makefile.am index b146a4b9..fb0d646e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -11,7 +11,7 @@ connmand_SOURCES = main.c connman.h log.c selftest.c error.c plugin.c \ element.c device.c network.c connection.c \ manager.c profile.c service.c agent.c notifier.c \ security.c resolver.c ipconfig.c rfkill.c \ - storage.c ipv4.c detect.c rtnl.c inet.c dbus.c + storage.c ipv4.c rtnl.c inet.c dbus.c if UDEV connmand_SOURCES += udev.c diff --git a/src/connman.h b/src/connman.h index 24b64adb..d778cc1d 100644 --- a/src/connman.h +++ b/src/connman.h @@ -175,9 +175,6 @@ int __connman_element_append_ipv4(struct connman_element *element, int __connman_element_set_ipv4(struct connman_element *element, const char *name, DBusMessageIter *value); -int __connman_detect_init(void); -void __connman_detect_cleanup(void); - int __connman_ipv4_init(void); void __connman_ipv4_cleanup(void); diff --git a/src/detect.c b/src/detect.c deleted file mode 100644 index f239d851..00000000 --- a/src/detect.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * - * Connection Manager - * - * Copyright (C) 2007-2009 Intel Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -#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, -}; - -int __connman_detect_init(void) -{ - int err; - - DBG(""); - - err = connman_rtnl_register(&detect_rtnl); - if (err < 0) - return err; - - connman_rtnl_send_getlink(); - - return 0; -} - -void __connman_detect_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; -} diff --git a/src/element.c b/src/element.c index 81f5eafa..dca26eaf 100644 --- a/src/element.c +++ b/src/element.c @@ -1425,7 +1425,6 @@ void __connman_element_start(void) __connman_connection_init(); __connman_ipv4_init(); - __connman_detect_init(); __connman_rfkill_init(); } @@ -1434,7 +1433,6 @@ void __connman_element_stop(void) DBG(""); __connman_rfkill_cleanup(); - __connman_detect_cleanup(); __connman_ipv4_cleanup(); __connman_connection_cleanup(); } 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 #endif +#include + #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; } -- 2.34.1