*
* Connection Manager
*
- * Copyright (C) 2007-2009 Intel Corporation. All rights reserved.
+ * Copyright (C) 2007-2010 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
struct supplicant_task {
int ifindex;
char *ifname;
- gboolean mac80211;
+ gboolean cfg80211;
struct connman_device *device;
struct connman_network *network;
struct connman_network *pending_network;
DBG("task %p", task);
reply = dbus_pending_call_steal_reply(call);
- if (reply == NULL)
- return;
if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
goto failed;
dbus_message_unref(reply);
+ dbus_pending_call_unref(call);
+
return;
failed:
dbus_message_unref(reply);
+ dbus_pending_call_unref(call);
+
task_list = g_slist_remove(task_list, task);
connman_device_unref(task->device);
DBG("task %p", task);
reply = dbus_pending_call_steal_reply(call);
- if (reply == NULL)
- return;
if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
add_interface(task);
done:
dbus_message_unref(reply);
+
+ dbus_pending_call_unref(call);
}
static int create_interface(struct supplicant_task *task)
free_task(task);
dbus_message_unref(reply);
+
+ dbus_pending_call_unref(call);
}
static int remove_interface(struct supplicant_task *task)
const char *auth_alg = "OPEN";
const char *key_index = "0";
- if (task->mac80211 == TRUE)
+ if (task->cfg80211 == TRUE)
auth_alg = "OPEN SHARED";
connman_dbus_dict_append_basic(&dict, "auth_alg",
task->scan_call = NULL;
reply = dbus_pending_call_steal_reply(call);
- if (reply == NULL)
- return;
if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
connman_device_set_scanning(task->device, FALSE);
done:
dbus_message_unref(reply);
+
+ dbus_pending_call_unref(call);
}
DBG("task %p", task);
reply = dbus_pending_call_steal_reply(call);
- if (reply == NULL) {
- get_properties(task);
- return;
- }
- if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
- dbus_message_unref(reply);
- get_properties(task);
- return;
- }
+ if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
+ goto unref;
memset(&result, 0, sizeof(result));
result.frequency = -1;
g_free(result.name);
g_free(result.ssid);
+unref:
dbus_message_unref(reply);
+ dbus_pending_call_unref(call);
+
get_properties(task);
}
DBG("task %p", task);
reply = dbus_pending_call_steal_reply(call);
- if (reply == NULL)
- goto noscan;
if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
goto done;
dbus_message_unref(reply);
+ dbus_pending_call_unref(call);
+
get_properties(task);
return;
done:
dbus_message_unref(reply);
-noscan:
+ dbus_pending_call_unref(call);
+
task->result_call = NULL;
if (task->scanning == TRUE) {
DBG("address %s security %s", address, security);
- if (security == NULL && passphrase == NULL)
+ if (security == NULL)
return -EINVAL;
- if (g_str_equal(security, "none") == FALSE && passphrase == NULL)
+ if (passphrase == NULL && g_str_equal(security, "none") == FALSE &&
+ g_str_equal(security, "ieee8021x") == FALSE)
return -EINVAL;
remove_network(task);
oldstate, newstate);
}
-static DBusHandlerResult supplicant_filter(DBusConnection *conn,
+static gboolean supplicant_filter(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct supplicant_task *task;
const char *member, *path;
- if (dbus_message_has_interface(msg,
- SUPPLICANT_INTF ".Interface") == FALSE)
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
member = dbus_message_get_member(msg);
if (member == NULL)
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ return TRUE;
path = dbus_message_get_path(msg);
if (path == NULL)
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ return TRUE;
task = find_task_by_path(path);
if (task == NULL)
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ return TRUE;
DBG("task %p member %s", task, member);
else if (g_str_equal(member, "StateChange") == TRUE)
state_change(task, msg);
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ return TRUE;
}
int supplicant_start(struct connman_device *device)
goto failed;
}
- task->mac80211 = connman_inet_is_mac80211(task->ifindex);
- if (task->mac80211 == FALSE)
+ task->cfg80211 = connman_inet_is_cfg80211(task->ifindex);
+ if (task->cfg80211 == FALSE)
connman_warn("Enabling quirks for unsupported driver");
task->range = g_try_malloc0(sizeof(struct iw_range));
}
}
-static const char *supplicant_rule = "type=signal,"
- "interface=" SUPPLICANT_INTF ".Interface";
static guint watch;
+static guint iface_watch;
static int supplicant_create(void)
{
DBG("connection %p", connection);
- if (dbus_connection_add_filter(connection,
- supplicant_filter, NULL, NULL) == FALSE) {
- dbus_connection_unref(connection);
- connection = NULL;
- return -EIO;
- }
-
- dbus_bus_add_match(connection, supplicant_rule, NULL);
- dbus_connection_flush(connection);
-
watch = g_dbus_add_service_watch(connection, SUPPLICANT_NAME,
supplicant_probe, supplicant_remove, NULL, NULL);
+ iface_watch = g_dbus_add_signal_watch(connection, NULL, NULL,
+ SUPPLICANT_INTF ".Interface",
+ NULL, supplicant_filter,
+ NULL, NULL);
+
+ if (watch == 0 || iface_watch == 0) {
+ g_dbus_remove_watch(connection, watch);
+ g_dbus_remove_watch(connection, iface_watch);
+ return -EIO;
+ }
+
return 0;
}
DBG("connection %p", connection);
- if (watch > 0)
- g_dbus_remove_watch(connection, watch);
-
- dbus_bus_remove_match(connection, supplicant_rule, NULL);
- dbus_connection_flush(connection);
-
- dbus_connection_remove_filter(connection, supplicant_filter, NULL);
+ g_dbus_remove_watch(connection, watch);
+ g_dbus_remove_watch(connection, iface_watch);
dbus_connection_unref(connection);
connection = NULL;