Add helper for setting network address and use it
authorMarcel Holtmann <marcel@holtmann.org>
Thu, 21 May 2009 19:54:52 +0000 (12:54 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 21 May 2009 19:54:52 +0000 (12:54 -0700)
include/network.h
plugins/supplicant.c
src/network.c

index 3764e08..7710913 100644 (file)
@@ -80,6 +80,8 @@ extern int connman_network_set_connected(struct connman_network *network,
                                                connman_bool_t connected);
 extern connman_bool_t connman_network_get_connected(struct connman_network *network);
 
+extern int connman_network_set_address(struct connman_network *network,
+                               const void *address, unsigned int size);
 extern int connman_network_set_name(struct connman_network *network,
                                                        const char *name);
 extern int connman_network_set_strength(struct connman_network *network,
index 6df89d6..cb84cc5 100644 (file)
@@ -150,7 +150,8 @@ enum supplicant_state {
 struct supplicant_result {
        char *path;
        char *name;
-       char *addr;
+       unsigned char *addr;
+       unsigned int addr_len;
        unsigned char *ssid;
        unsigned int ssid_len;
        dbus_uint16_t capabilities;
@@ -892,25 +893,20 @@ static void extract_addr(DBusMessageIter *value,
        if (addr_len != 6)
                return;
 
-       eth = (void *) addr;
-
-       result->addr = g_try_malloc0(18);
+       result->addr = g_try_malloc(addr_len);
        if (result->addr == NULL)
                return;
 
-       snprintf(result->addr, 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]);
+       memcpy(result->addr, addr, addr_len);
+       result->addr_len = addr_len;
 
-       result->path = g_try_malloc0(18);
+       result->path = g_try_malloc0(13);
        if (result->path == NULL)
                return;
 
-       snprintf(result->path, 18, "%02x%02x%02x%02x%02x%02x",
+       eth = (void *) addr;
+
+       snprintf(result->path, 13, "%02x%02x%02x%02x%02x%02x",
                                                eth->ether_addr_octet[0],
                                                eth->ether_addr_octet[1],
                                                eth->ether_addr_octet[2],
@@ -1167,7 +1163,8 @@ static void properties_reply(DBusPendingCall *call, void *user_data)
                connman_network_set_protocol(network,
                                                CONNMAN_NETWORK_PROTOCOL_IP);
 
-               connman_network_set_string(network, "Address", result.addr);
+               connman_network_set_address(network, result.addr,
+                                                       result.addr_len);
 
                if (connman_device_add_network(task->device, network) < 0) {
                        connman_network_unref(network);
index 70f4289..cf0586b 100644 (file)
@@ -23,6 +23,7 @@
 #include <config.h>
 #endif
 
+#include <errno.h>
 #include <string.h>
 
 #include <gdbus.h>
@@ -861,6 +862,38 @@ int __connman_network_disconnect(struct connman_network *network)
 }
 
 /**
+ * connman_network_set_address:
+ * @network: network structure
+ * @address: binary address value
+ * @size: binary address length
+ *
+ * Set unique address value for network
+ */
+int connman_network_set_address(struct connman_network *network,
+                               const void *address, unsigned int size)
+{
+       const unsigned char *addr_octet = address;
+       char *str;
+
+       DBG("network %p size %d", network, size);
+
+       if (size != 6)
+               return -EINVAL;
+
+       str = g_strdup_printf("%02X:%02X:%02X:%02X:%02X:%02X",
+                               addr_octet[0], addr_octet[1], addr_octet[2],
+                               addr_octet[3], addr_octet[4], addr_octet[5]);
+       if (str == NULL)
+               return -ENOMEM;
+
+       g_free(network->address);
+       network->address = str;
+
+       return connman_element_set_string(&network->element,
+                                               "Address", network->address);
+}
+
+/**
  * connman_network_set_name:
  * @network: network structure
  * @name: name value
@@ -1052,6 +1085,9 @@ int connman_network_set_blob(struct connman_network *network,
 {
        DBG("network %p key %s size %d", network, key, size);
 
+       if (g_strcmp0(key, "Address") == 0)
+               return connman_network_set_address(network, data, size);
+
        if (g_str_equal(key, "WiFi.SSID") == TRUE) {
                g_free(network->wifi.ssid);
                network->wifi.ssid = g_try_malloc(size);