The device creation function should be part of device.c and not inet.c. After this change the inet.c can be used by separate vpn daemon. --- include/device.h | 1 + include/inet.h | 1 - plugins/iwmxsdk.c | 4 +- src/detect.c | 2 +- src/device.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/inet.c | 173 ---------------------------------------------------- 6 files changed, 182 insertions(+), 177 deletions(-)
diff --git a/include/device.h b/include/device.h index 5339e98..abded72 100644 --- a/include/device.h +++ b/include/device.h @@ -112,6 +112,7 @@ int connman_device_set_regdom(struct connman_device *device, const char *alpha2); void connman_device_regdom_notify(struct connman_device *device, int result, const char *alpha2); +struct connman_device *connman_device_create_device(int index); struct connman_device_driver { const char *name; diff --git a/include/inet.h b/include/inet.h index 6bdcc91..8f7a35c 100644 --- a/include/inet.h +++ b/include/inet.h @@ -41,7 +41,6 @@ short int connman_inet_ifflags(int index); int connman_inet_ifup(int index); int connman_inet_ifdown(int index); -struct connman_device *connman_inet_create_device(int index); connman_bool_t connman_inet_is_cfg80211(int index); int connman_inet_set_address(int index, struct connman_ipaddress *ipaddress); diff --git a/plugins/iwmxsdk.c b/plugins/iwmxsdk.c index 06de4c3..a20fbca 100644 --- a/plugins/iwmxsdk.c +++ b/plugins/iwmxsdk.c @@ -672,7 +672,7 @@ error_scan: * Called through * * iwmx_sdk_dev_add - * connman_inet_create_device + * connman_device_create_device * connman_register * iwmx_cm_probe() */ @@ -856,7 +856,7 @@ static void iwmx_sdk_dev_add(unsigned idx, unsigned api_idx, const char *name) goto error_noifname; } - wmxsdk->dev = connman_inet_create_device(ifindex); + wmxsdk->dev = connman_device_create_device(ifindex); if (wmxsdk->dev == NULL) { connman_error("wmxsdk: %s: failed to create connman_device\n", name); diff --git a/src/detect.c b/src/detect.c index 94a113e..816d3f2 100644 --- a/src/detect.c +++ b/src/detect.c @@ -71,7 +71,7 @@ static void detect_newlink(unsigned short type, int index, if (device != NULL) return; - device = connman_inet_create_device(index); + device = connman_device_create_device(index); if (device == NULL) return; diff --git a/src/device.c b/src/device.c index 12bc7da..8732746 100644 --- a/src/device.c +++ b/src/device.c @@ -25,6 +25,11 @@ #include <errno.h> #include <string.h> +#include <unistd.h> +#include <stdio.h> +#include <sys/ioctl.h> +#include <net/ethernet.h> +#include <net/if.h> #include "connman.h" @@ -1126,6 +1131,179 @@ int __connman_device_request_hidden_scan(struct connman_device *device, identity, passphrase, user_data); } +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 | SOCK_CLOEXEC, 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; + + memcpy(ð, &ifr.ifr_hwaddr.sa_data, sizeof(eth)); + 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 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 | SOCK_CLOEXEC, 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; + + memcpy(ð, &ifr.ifr_hwaddr.sa_data, sizeof(eth)); + 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; +} + +struct connman_device *connman_device_create_device(int index) +{ + enum connman_device_type type; + struct connman_device *device; + char *devname, *ident = NULL; + char *addr = NULL, *name = NULL; + + if (index < 0) + return NULL; + + devname = connman_inet_ifname(index); + if (devname == NULL) + return NULL; + + if (__connman_device_isfiltered(devname) == TRUE) { + connman_info("Ignoring interface %s (filtered)", devname); + g_free(devname); + return NULL; + } + + type = __connman_rtnl_get_device_type(index); + + switch (type) { + case CONNMAN_DEVICE_TYPE_UNKNOWN: + connman_info("Ignoring interface %s (type unknown)", devname); + g_free(devname); + return NULL; + case CONNMAN_DEVICE_TYPE_ETHERNET: + case CONNMAN_DEVICE_TYPE_GADGET: + 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_CELLULAR: + case CONNMAN_DEVICE_TYPE_GPS: + case CONNMAN_DEVICE_TYPE_VENDOR: + name = strdup(devname); + break; + } + + device = connman_device_create(name, type); + if (device == NULL) + goto done; + + switch (type) { + case CONNMAN_DEVICE_TYPE_UNKNOWN: + case CONNMAN_DEVICE_TYPE_VENDOR: + case CONNMAN_DEVICE_TYPE_GPS: + break; + case CONNMAN_DEVICE_TYPE_ETHERNET: + case CONNMAN_DEVICE_TYPE_GADGET: + ident = index2ident(index, NULL); + break; + case CONNMAN_DEVICE_TYPE_WIFI: + case CONNMAN_DEVICE_TYPE_WIMAX: + ident = index2ident(index, NULL); + break; + case CONNMAN_DEVICE_TYPE_BLUETOOTH: + break; + case CONNMAN_DEVICE_TYPE_CELLULAR: + ident = index2ident(index, NULL); + break; + } + + 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); + +done: + g_free(devname); + g_free(name); + g_free(addr); + + return device; +} + connman_bool_t __connman_device_isfiltered(const char *devname) { char **pattern; diff --git a/src/inet.c b/src/inet.c index be69aca..ac45eb4 100644 --- a/src/inet.c +++ b/src/inet.c @@ -357,95 +357,6 @@ done: return err; } -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 | SOCK_CLOEXEC, 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; - - memcpy(ð, &ifr.ifr_hwaddr.sa_data, sizeof(eth)); - 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 | SOCK_CLOEXEC, 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; - - memcpy(ð, &ifr.ifr_hwaddr.sa_data, sizeof(eth)); - 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; -} - connman_bool_t connman_inet_is_cfg80211(int index) { connman_bool_t result = FALSE; @@ -476,90 +387,6 @@ done: return result; } -struct connman_device *connman_inet_create_device(int index) -{ - enum connman_device_type type; - struct connman_device *device; - char *devname, *ident = NULL; - char *addr = NULL, *name = NULL; - - if (index < 0) - return NULL; - - devname = connman_inet_ifname(index); - if (devname == NULL) - return NULL; - - if (__connman_device_isfiltered(devname) == TRUE) { - connman_info("Ignoring interface %s (filtered)", devname); - free(devname); - return NULL; - } - - type = __connman_rtnl_get_device_type(index); - - switch (type) { - case CONNMAN_DEVICE_TYPE_UNKNOWN: - connman_info("Ignoring interface %s (type unknown)", devname); - free(devname); - return NULL; - case CONNMAN_DEVICE_TYPE_ETHERNET: - case CONNMAN_DEVICE_TYPE_GADGET: - 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_CELLULAR: - case CONNMAN_DEVICE_TYPE_GPS: - case CONNMAN_DEVICE_TYPE_VENDOR: - name = strdup(devname); - break; - } - - device = connman_device_create(name, type); - if (device == NULL) - goto done; - - switch (type) { - case CONNMAN_DEVICE_TYPE_UNKNOWN: - case CONNMAN_DEVICE_TYPE_VENDOR: - case CONNMAN_DEVICE_TYPE_GPS: - break; - case CONNMAN_DEVICE_TYPE_ETHERNET: - case CONNMAN_DEVICE_TYPE_GADGET: - ident = index2ident(index, NULL); - break; - case CONNMAN_DEVICE_TYPE_WIFI: - case CONNMAN_DEVICE_TYPE_WIMAX: - ident = index2ident(index, NULL); - break; - case CONNMAN_DEVICE_TYPE_BLUETOOTH: - break; - case CONNMAN_DEVICE_TYPE_CELLULAR: - ident = index2ident(index, NULL); - break; - } - - connman_device_set_index(device, index); - connman_device_set_interface(device, devname); - - if (ident != NULL) { - connman_device_set_ident(device, ident); - free(ident); - } - - connman_device_set_string(device, "Address", addr); - -done: - free(devname); - free(name); - free(addr); - - return device; -} - struct in6_ifreq { struct in6_addr ifr6_addr; __u32 ifr6_prefixlen; -- 1.7.11.4 _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman