Fix handling of strict-aliasing rules
[framework/connectivity/connman.git] / plugins / supplicant.c
index 92668f8..958200e 100644 (file)
@@ -185,6 +185,7 @@ struct supplicant_task {
        gboolean noscan;
        GSList *scan_results;
        struct iw_range *range;
+       gboolean connecting;
        gboolean disconnecting;
 };
 
@@ -291,9 +292,9 @@ static char *get_bssid(struct connman_device *device)
                return NULL;
 
        snprintf(bssid, 13, "%02x%02x%02x%02x%02x%02x",
-                ioctl_bssid[0], ioctl_bssid[1],
-                ioctl_bssid[2], ioctl_bssid[3],
-                ioctl_bssid[4], ioctl_bssid[5]);
+                                       ioctl_bssid[0], ioctl_bssid[1],
+                                       ioctl_bssid[2], ioctl_bssid[3],
+                                       ioctl_bssid[4], ioctl_bssid[5]);
 
        return bssid;
 }
@@ -948,6 +949,11 @@ static char *build_group(const char *addr, const char *name,
        if (str == NULL)
                return NULL;
 
+       if (ssid == NULL) {
+               g_string_append_printf(str, "hidden_%s", addr);
+               goto done;
+       }
+
        for (i = 0; special_ssid[i].name; i++) {
                if (g_strcmp0(special_ssid[i].name, name) == 0) {
                        if (special_ssid[i].value == NULL)
@@ -976,7 +982,7 @@ static void extract_addr(DBusMessageIter *value,
                                        struct supplicant_result *result)
 {
        DBusMessageIter array;
-       struct ether_addr *eth;
+       struct ether_addr eth;
        unsigned char *addr;
        int addr_len;
 
@@ -997,15 +1003,14 @@ static void extract_addr(DBusMessageIter *value,
        if (result->path == NULL)
                return;
 
-       eth = (void *) addr;
-
+       memcpy(&eth, addr, sizeof(eth));
        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],
-                                               eth->ether_addr_octet[3],
-                                               eth->ether_addr_octet[4],
-                                               eth->ether_addr_octet[5]);
+                                               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]);
 }
 
 static void extract_ssid(DBusMessageIter *value,
@@ -1021,6 +1026,9 @@ static void extract_ssid(DBusMessageIter *value,
        if (ssid_len < 1)
                return;
 
+       if (ssid[0] == '\0')
+               return;
+
        result->ssid = g_try_malloc(ssid_len);
        if (result->ssid == NULL)
                return;
@@ -1136,7 +1144,7 @@ static void properties_reply(DBusPendingCall *call, void *user_data)
        unsigned char strength;
        unsigned short channel, frequency;
        const char *mode, *security;
-       char *group;
+       char *group = NULL;
        unsigned int ssid_len;
 
        DBG("task %p", task);
@@ -1293,11 +1301,12 @@ static void properties_reply(DBusPendingCall *call, void *user_data)
        connman_network_set_uint16(network, "WiFi.Channel", channel);
        connman_network_set_string(network, "WiFi.Security", security);
 
-       connman_network_set_group(network, group);
+       if (result.ssid != NULL)
+               connman_network_set_group(network, group);
 
+done:
        g_free(group);
 
-done:
        g_free(result.path);
        g_free(result.addr);
        g_free(result.name);
@@ -1486,6 +1495,8 @@ static int task_connect(struct supplicant_task *task)
        if (g_str_equal(security, "none") == FALSE && passphrase == NULL)
                return -EINVAL;
 
+       task->connecting = TRUE;
+
        add_network(task);
 
        select_network(task);
@@ -1555,7 +1566,7 @@ static void state_change(struct supplicant_task *task, DBusMessage *msg)
        case WPA_COMPLETED:
                if (connman_network_get_group(task->network) == NULL) {
                        const char *name, *mode, *security;
-                       char *group, *bssid;
+                       char *bssid;
 
                        /*
                         * This is a hidden network, we need to set its
@@ -1571,18 +1582,21 @@ static void state_change(struct supplicant_task *task, DBusMessage *msg)
                                                        "WiFi.Security");
 
                        if (bssid && name && mode && security) {
+                               char *group;
+
                                group = build_group(bssid, name, NULL, 0,
                                                                mode, security);
                                connman_network_set_group(task->network, group);
+                               g_free(group);
                        }
 
                        g_free(bssid);
-                       g_free(group);
                }
 
                /* carrier on */
                connman_network_set_connected(task->network, TRUE);
                connman_device_set_scanning(task->device, FALSE);
+               task->connecting = FALSE;
                break;
 
        case WPA_DISCONNECTED:
@@ -1600,6 +1614,7 @@ static void state_change(struct supplicant_task *task, DBusMessage *msg)
                        /* carrier off */
                        connman_network_set_connected(task->network, FALSE);
                        connman_device_set_scanning(task->device, FALSE);
+                       task->connecting = FALSE;
                }
                break;
 
@@ -1679,6 +1694,7 @@ int supplicant_start(struct connman_device *device)
        task->created = FALSE;
        task->noscan = FALSE;
        task->state = WPA_INVALID;
+       task->connecting = FALSE;
        task->disconnecting = FALSE;
        task->pending_network = NULL;