diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-05-21 00:49:20 -0700 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-05-21 00:49:20 -0700 |
commit | 91a77ed7265af5b9bf10784292945abb8db940ce (patch) | |
tree | b474f634d0dec1380bc35b3a83c33cae6683beeb /src/detect.c | |
parent | d0656e6ee69f695a568a686312fec5127392371c (diff) | |
download | connman-91a77ed7265af5b9bf10784292945abb8db940ce.tar.gz connman-91a77ed7265af5b9bf10784292945abb8db940ce.tar.bz2 connman-91a77ed7265af5b9bf10784292945abb8db940ce.zip |
Add generic wrapper for INET based device creation
Diffstat (limited to 'src/detect.c')
-rw-r--r-- | src/detect.c | 245 |
1 files changed, 2 insertions, 243 deletions
diff --git a/src/detect.c b/src/detect.c index c8247eec..17e69595 100644 --- a/src/detect.c +++ b/src/detect.c @@ -23,18 +23,6 @@ #include <config.h> #endif -#include <stdio.h> -#include <errno.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <sys/ioctl.h> -#include <sys/socket.h> -#include <net/ethernet.h> -#include <linux/if_arp.h> -#include <linux/wireless.h> - #include <glib.h> #include "connman.h" @@ -55,127 +43,10 @@ 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 *index2addr(int index) -{ - struct ifreq ifr; - struct ether_addr *eth; - char *str; - 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); - - if (err == 0) - err = ioctl(sk, SIOCGIFHWADDR, &ifr); - - close(sk); - - if (err < 0) - return NULL; - - str = malloc(18); - if (!str) - return NULL; - - eth = (void *) &ifr.ifr_hwaddr.sa_data; - snprintf(str, 18, "%02X:%02X:%02X:%02X:%02X:%02X", - 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 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; - enum connman_device_mode mode = CONNMAN_DEVICE_MODE_UNKNOWN; struct connman_device *device; - char *addr, *name, *devname, *ident = NULL; DBG("type %d index %d", type, index); @@ -183,121 +54,9 @@ static void detect_newlink(unsigned short type, int index, if (device != NULL) return; - devname = index2name(index); - if (devname == NULL) - return; - - 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, "vmnet") == TRUE || - g_str_has_prefix(devname, "vboxnet") == TRUE) { - connman_info("Ignoring network interface %s", devname); - devtype = CONNMAN_DEVICE_TYPE_UNKNOWN; - } else if (g_str_has_prefix(devname, "bnep") == TRUE) - devtype = CONNMAN_DEVICE_TYPE_UNKNOWN; - else if (g_str_has_prefix(devname, "wmx") == TRUE) - devtype = CONNMAN_DEVICE_TYPE_UNKNOWN; - else if (stat(wimax_path, &st) == 0 && (st.st_mode & S_IFDIR)) - devtype = CONNMAN_DEVICE_TYPE_UNKNOWN; - else if (stat(bridge_path, &st) == 0 && (st.st_mode & S_IFDIR)) - devtype = CONNMAN_DEVICE_TYPE_UNKNOWN; - else if (ioctl(sk, SIOCGIWNAME, &iwr) == 0) - devtype = CONNMAN_DEVICE_TYPE_WIFI; - 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; - } - - switch (devtype) { - case CONNMAN_DEVICE_TYPE_UNKNOWN: - g_free(devname); - return; - case CONNMAN_DEVICE_TYPE_ETHERNET: - case CONNMAN_DEVICE_TYPE_WIFI: - case CONNMAN_DEVICE_TYPE_WIMAX: - name = index2ident(index, ""); - addr = index2addr(index); - break; - case CONNMAN_DEVICE_TYPE_BLUETOOTH: - case CONNMAN_DEVICE_TYPE_GPS: - case CONNMAN_DEVICE_TYPE_HSO: - case CONNMAN_DEVICE_TYPE_NOZOMI: - case CONNMAN_DEVICE_TYPE_HUAWEI: - case CONNMAN_DEVICE_TYPE_NOVATEL: - case CONNMAN_DEVICE_TYPE_VENDOR: - name = strdup(devname); - addr = NULL; - break; - } - - device = connman_device_create(name, devtype); - if (device == NULL) { - g_free(devname); - g_free(name); - g_free(addr); + device = connman_inet_create_device(index); + if (device == NULL) return; - } - - switch (devtype) { - case CONNMAN_DEVICE_TYPE_UNKNOWN: - case CONNMAN_DEVICE_TYPE_VENDOR: - case CONNMAN_DEVICE_TYPE_NOZOMI: - case CONNMAN_DEVICE_TYPE_HUAWEI: - case CONNMAN_DEVICE_TYPE_NOVATEL: - case CONNMAN_DEVICE_TYPE_GPS: - mode = CONNMAN_DEVICE_MODE_UNKNOWN; - break; - case CONNMAN_DEVICE_TYPE_ETHERNET: - mode = CONNMAN_DEVICE_MODE_TRANSPORT_IP; - ident = index2ident(index, NULL); - break; - case CONNMAN_DEVICE_TYPE_WIFI: - case CONNMAN_DEVICE_TYPE_WIMAX: - mode = CONNMAN_DEVICE_MODE_NETWORK_SINGLE; - ident = index2ident(index, NULL); - break; - case CONNMAN_DEVICE_TYPE_BLUETOOTH: - mode = CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE; - break; - case CONNMAN_DEVICE_TYPE_HSO: - mode = CONNMAN_DEVICE_MODE_NETWORK_SINGLE; - connman_device_set_policy(device, CONNMAN_DEVICE_POLICY_MANUAL); - break; - } - - connman_device_set_mode(device, mode); - - connman_device_set_index(device, index); - connman_device_set_interface(device, devname); - - if (ident != NULL) { - connman_device_set_ident(device, ident); - g_free(ident); - } - - connman_device_set_string(device, "Address", addr); - - g_free(devname); - g_free(name); - g_free(addr); if (connman_device_register(device) < 0) { connman_device_unref(device); |