X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fdetect.c;h=f4b5d2947f1204f7327f563ea422cce495012150;hb=2aa593bceff2698fe3ca714152064e4758cf5593;hp=f2d811d4e45643a86a35fdd9e05d16f1e8c17979;hpb=21a89f85e212d694db038a201aebbcccb90a3c5b;p=framework%2Fconnectivity%2Fconnman.git diff --git a/src/detect.c b/src/detect.c index f2d811d..f4b5d29 100644 --- a/src/detect.c +++ b/src/detect.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. + * Copyright (C) 2007-2012 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 @@ -23,21 +23,7 @@ #include #endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include +#include #include "connman.h" @@ -57,151 +43,37 @@ static struct connman_device *find_device(int index) return NULL; } -static char *index2name(int index) -{ - struct ifreq ifr; - int sk, err; - - if (index < 0) - return NULL; - - sk = socket(PF_INET, SOCK_DGRAM, 0); - if (sk < 0) - return NULL; - - memset(&ifr, 0, sizeof(ifr)); - ifr.ifr_ifindex = index; - - err = ioctl(sk, SIOCGIFNAME, &ifr); - - close(sk); - - if (err < 0) - return NULL; - - return strdup(ifr.ifr_name); -} - -static char *index2ident(int index, const char *prefix) -{ - struct ifreq ifr; - struct ether_addr *eth; - char *str; - int sk, err, len; - - if (index < 0) - return NULL; - - sk = socket(PF_INET, SOCK_DGRAM, 0); - if (sk < 0) - return NULL; - - memset(&ifr, 0, sizeof(ifr)); - ifr.ifr_ifindex = index; - - err = ioctl(sk, SIOCGIFNAME, &ifr); - - if (err == 0) - err = ioctl(sk, SIOCGIFHWADDR, &ifr); - - close(sk); - - if (err < 0) - return NULL; - - len = prefix ? strlen(prefix) + 18 : 18; - - str = malloc(len); - if (!str) - return NULL; - - eth = (void *) &ifr.ifr_hwaddr.sa_data; - snprintf(str, len, "%s%02X_%02X_%02X_%02X_%02X_%02X", - prefix ? prefix : "", - eth->ether_addr_octet[0], - eth->ether_addr_octet[1], - eth->ether_addr_octet[2], - eth->ether_addr_octet[3], - eth->ether_addr_octet[4], - eth->ether_addr_octet[5]); - - return str; -} - static void detect_newlink(unsigned short type, int index, unsigned flags, unsigned change) { - enum connman_device_type devtype = CONNMAN_DEVICE_TYPE_UNKNOWN; struct connman_device *device; - gchar *name, *devname; + enum connman_device_type devtype; DBG("type %d index %d", type, index); - device = find_device(index); - if (device != NULL) - return; - - devname = index2name(index); - - if (type == ARPHRD_ETHER) { - char bridge_path[PATH_MAX], wimax_path[PATH_MAX]; - struct stat st; - struct iwreq iwr; - int sk; - - snprintf(bridge_path, PATH_MAX, - "/sys/class/net/%s/bridge", devname); - snprintf(wimax_path, PATH_MAX, - "/sys/class/net/%s/wimax", devname); - - memset(&iwr, 0, sizeof(iwr)); - strncpy(iwr.ifr_ifrn.ifrn_name, devname, IFNAMSIZ); - - sk = socket(PF_INET, SOCK_DGRAM, 0); - - if (g_str_has_prefix(devname, "bnep") == TRUE) - devtype = CONNMAN_DEVICE_TYPE_UNKNOWN; - else if (stat(bridge_path, &st) == 0 && (st.st_mode & S_IFDIR)) - devtype = CONNMAN_DEVICE_TYPE_UNKNOWN; - else if (stat(wimax_path, &st) == 0 && (st.st_mode & S_IFDIR)) - devtype = CONNMAN_DEVICE_TYPE_WIMAX; - else if (ioctl(sk, SIOCGIWNAME, &iwr) == 0) - devtype = CONNMAN_DEVICE_TYPE_UNKNOWN; - else - devtype = CONNMAN_DEVICE_TYPE_ETHERNET; - - close(sk); - } else if (type == ARPHRD_NONE) { - if (g_str_has_prefix(devname, "hso") == TRUE) - devtype = CONNMAN_DEVICE_TYPE_HSO; - } - - if (devtype == CONNMAN_DEVICE_TYPE_UNKNOWN) { - g_free(devname); - return; - } + devtype = __connman_rtnl_get_device_type(index); switch (devtype) { - case CONNMAN_DEVICE_TYPE_HSO: - name = strdup(devname); - break; - default: - name = index2ident(index, "dev_"); + case CONNMAN_DEVICE_TYPE_UNKNOWN: + case CONNMAN_DEVICE_TYPE_VENDOR: + case CONNMAN_DEVICE_TYPE_WIMAX: + case CONNMAN_DEVICE_TYPE_BLUETOOTH: + case CONNMAN_DEVICE_TYPE_CELLULAR: + case CONNMAN_DEVICE_TYPE_GPS: + return; + case CONNMAN_DEVICE_TYPE_ETHERNET: + case CONNMAN_DEVICE_TYPE_WIFI: + case CONNMAN_DEVICE_TYPE_GADGET: break; } - device = connman_device_create(name, devtype); - if (device == NULL) { - g_free(devname); - g_free(name); + device = find_device(index); + if (device != NULL) return; - } - connman_device_set_index(device, index); - connman_device_set_interface(device, devname); - - g_free(devname); - g_free(name); + device = connman_inet_create_device(index); + if (device == NULL) + return; if (connman_device_register(device) < 0) { connman_device_unref(device); @@ -237,21 +109,17 @@ static struct connman_rtnl detect_rtnl = { 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; + return connman_rtnl_register(&detect_rtnl); } void __connman_detect_cleanup(void) { GSList *list; + DBG(""); + connman_rtnl_unregister(&detect_rtnl); for (list = device_list; list; list = list->next) {