Store control interface for complex devices
authorMarcel Holtmann <marcel@holtmann.org>
Sun, 12 Jul 2009 07:32:13 +0000 (00:32 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 12 Jul 2009 07:32:13 +0000 (00:32 -0700)
include/device.h
plugins/bluetooth.c
src/connman.h
src/device.c
src/inet.c
src/udev-compat.c
src/udev.c

index e2f1686..2cd77f8 100644 (file)
@@ -70,7 +70,7 @@ const char *connman_device_get_path(struct connman_device *device);
 void connman_device_set_index(struct connman_device *device, int index);
 int connman_device_get_index(struct connman_device *device);
 void connman_device_set_interface(struct connman_device *device,
-                                                       const char *interface);
+                               const char *interface, const char *control);
 
 void connman_device_set_ident(struct connman_device *device,
                                                const char *ident);
index fa2c3c6..fac96cf 100644 (file)
@@ -650,7 +650,7 @@ static void adapter_properties(DBusConnection *connection, const char *path,
                        connman_device_set_index(adapter, index);
        }
 
-       connman_device_set_interface(adapter, node);
+       connman_device_set_interface(adapter, node, NULL);
 
        connman_device_set_mode(adapter, CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE);
 
index bc1039c..84ebf60 100644 (file)
@@ -189,7 +189,7 @@ void __connman_connection_update_gateway(void);
 int __connman_udev_init(void);
 void __connman_udev_cleanup(void);
 char *__connman_udev_get_devtype(const char *ifname);
-connman_bool_t __connman_udev_is_mbm(const char *ifname);
+char *__connman_udev_get_mbm_devnode(const char *ifname);
 
 #include <connman/device.h>
 
index a7e4a2c..bcf40a8 100644 (file)
@@ -46,6 +46,7 @@ struct connman_device {
        char *node;
        char *address;
        char *interface;
+       char *control;
        char *ident;
        unsigned int connections;
        guint scan_timeout;
@@ -1000,6 +1001,7 @@ static void device_destruct(struct connman_element *element)
        g_free(device->node);
        g_free(device->name);
        g_free(device->address);
+       g_free(device->control);
        g_free(device->interface);
 
        connman_ipconfig_unref(device->ipconfig);
@@ -1182,11 +1184,12 @@ int connman_device_get_index(struct connman_device *device)
  * connman_device_set_interface:
  * @device: device structure
  * @interface: interface name
+ * @control: control interface
  *
  * Set interface name of device
  */
 void connman_device_set_interface(struct connman_device *device,
-                                                       const char *interface)
+                               const char *interface, const char *control)
 {
        g_free(device->element.devname);
        device->element.devname = g_strdup(interface);
@@ -1194,6 +1197,9 @@ void connman_device_set_interface(struct connman_device *device,
        g_free(device->interface);
        device->interface = g_strdup(interface);
 
+       g_free(device->control);
+       device->control = g_strdup(control);
+
        if (device->name == NULL) {
                const char *str = type2description(device->type);
                if (str != NULL && device->interface != NULL)
index eeceec0..2546778 100644 (file)
@@ -312,6 +312,7 @@ enum connman_device_type __connman_inet_get_device_type(int index)
                char bridge_path[PATH_MAX], wimax_path[PATH_MAX];
                struct stat st;
                struct iwreq iwr;
+               char *devnode;
 
                snprintf(bridge_path, PATH_MAX,
                                        "/sys/class/net/%s/bridge", devname);
@@ -321,9 +322,14 @@ enum connman_device_type __connman_inet_get_device_type(int index)
                memset(&iwr, 0, sizeof(iwr));
                strncpy(iwr.ifr_ifrn.ifrn_name, devname, IFNAMSIZ);
 
-               if (__connman_udev_is_mbm(devname) == TRUE)
+               devnode = __connman_udev_get_mbm_devnode(devname);
+               if (devnode != NULL) {
                        devtype = CONNMAN_DEVICE_TYPE_MBM;
-               else if (g_str_has_prefix(devname, "vmnet") == TRUE)
+                       g_free(devnode);
+                       goto done;
+               }
+
+               if (g_str_has_prefix(devname, "vmnet") == TRUE)
                        devtype = CONNMAN_DEVICE_TYPE_UNKNOWN;
                else if (g_str_has_prefix(ifr.ifr_name, "vboxnet") == TRUE)
                        devtype = CONNMAN_DEVICE_TYPE_UNKNOWN;
@@ -355,7 +361,7 @@ struct connman_device *connman_inet_create_device(int index)
        enum connman_device_mode mode = CONNMAN_DEVICE_MODE_UNKNOWN;
        enum connman_device_type type;
        struct connman_device *device;
-       char *addr, *name, *devname, *ident = NULL;
+       char *addr, *name, *node, *devname, *ident = NULL;
 
        if (index < 0)
                return NULL;
@@ -378,10 +384,10 @@ struct connman_device *connman_inet_create_device(int index)
        case CONNMAN_DEVICE_TYPE_WIMAX:
                name = index2ident(index, "");
                addr = index2addr(index);
+               node = NULL;
                break;
        case CONNMAN_DEVICE_TYPE_BLUETOOTH:
        case CONNMAN_DEVICE_TYPE_GPS:
-       case CONNMAN_DEVICE_TYPE_MBM:
        case CONNMAN_DEVICE_TYPE_HSO:
        case CONNMAN_DEVICE_TYPE_NOZOMI:
        case CONNMAN_DEVICE_TYPE_HUAWEI:
@@ -389,16 +395,18 @@ struct connman_device *connman_inet_create_device(int index)
        case CONNMAN_DEVICE_TYPE_VENDOR:
                name = strdup(devname);
                addr = NULL;
+               node = NULL;
+               break;
+       case CONNMAN_DEVICE_TYPE_MBM:
+               name = strdup(devname);
+               addr = index2addr(index);
+               node = __connman_udev_get_mbm_devnode(devname);
                break;
        }
 
        device = connman_device_create(name, type);
-       if (device == NULL) {
-               g_free(devname);
-               g_free(name);
-               g_free(addr);
-               return NULL;
-       }
+       if (device == NULL)
+               goto done;
 
        switch (type) {
        case CONNMAN_DEVICE_TYPE_UNKNOWN:
@@ -430,7 +438,7 @@ struct connman_device *connman_inet_create_device(int index)
        connman_device_set_mode(device, mode);
 
        connman_device_set_index(device, index);
-       connman_device_set_interface(device, devname);
+       connman_device_set_interface(device, devname, node);
 
        if (ident != NULL) {
                connman_device_set_ident(device, ident);
@@ -439,7 +447,9 @@ struct connman_device *connman_inet_create_device(int index)
 
        connman_device_set_string(device, "Address", addr);
 
+done:
        g_free(devname);
+       g_free(node);
        g_free(name);
        g_free(addr);
 
index 89813a7..4230984 100644 (file)
@@ -95,9 +95,9 @@ char *__connman_udev_get_devtype(const char *ifname)
        return NULL;
 }
 
-connman_bool_t __connman_udev_is_mbm(const char *ifname)
+char *__connman_udev_get_mbm_devnode(const char *ifname)
 {
-       return FALSE;
+       return NULL;
 }
 
 int __connman_udev_init(void)
index f03f952..0900f39 100644 (file)
@@ -304,16 +304,16 @@ done:
        return NULL;
 }
 
-connman_bool_t __connman_udev_is_mbm(const char *ifname)
+char *__connman_udev_get_mbm_devnode(const char *ifname)
 {
-       connman_bool_t result = FALSE;
        struct udev_device *device, *parent, *control;
        const char *driver, *devpath1, *devpath2;
+       char *devnode = NULL;
 
        device = udev_device_new_from_subsystem_sysname(udev_ctx,
                                                        "net", ifname);
        if (device == NULL)
-               return FALSE;
+               return NULL;
 
        parent = udev_device_get_parent(device);
        if (parent == NULL)
@@ -343,12 +343,12 @@ connman_bool_t __connman_udev_is_mbm(const char *ifname)
        devpath2 = udev_device_get_devpath(parent);
 
        if (g_strcmp0(devpath1, devpath2) == 0)
-               result = TRUE;
+               devnode = g_strdup(udev_device_get_devnode(control));
 
 done:
        udev_device_unref(device);
 
-       return result;
+       return devnode;
 }
 
 int __connman_udev_init(void)