summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/device.h2
-rw-r--r--src/device.c44
2 files changed, 45 insertions, 1 deletions
diff --git a/include/device.h b/include/device.h
index e4a735f1..c0042a9e 100644
--- a/include/device.h
+++ b/include/device.h
@@ -122,6 +122,8 @@ struct connman_device_driver {
int (*enable) (struct connman_device *device);
int (*disable) (struct connman_device *device);
int (*scan) (struct connman_device *device);
+ int (*join) (struct connman_device *device,
+ struct connman_network *network);
};
extern int connman_device_driver_register(struct connman_device_driver *driver);
diff --git a/src/device.c b/src/device.c
index d7106eaf..ef2e2d3b 100644
--- a/src/device.c
+++ b/src/device.c
@@ -473,13 +473,55 @@ static DBusMessage *set_property(DBusConnection *conn,
static DBusMessage *join_network(DBusConnection *conn,
DBusMessage *msg, void *data)
{
+ struct connman_device *device = data;
+ struct connman_network *network;
+ DBusMessageIter iter, array;
+ int err;
+
DBG("conn %p", conn);
if (__connman_security_check_privilege(msg,
CONNMAN_SECURITY_PRIVILEGE_MODIFY) < 0)
return __connman_error_permission_denied(msg);
- return __connman_error_invalid_arguments(msg);
+ if (!device->driver || !device->driver->join)
+ return __connman_error_not_supported(msg);
+
+ dbus_message_iter_init(msg, &iter);
+ dbus_message_iter_recurse(&iter, &array);
+
+ network = connman_network_create("_", CONNMAN_NETWORK_TYPE_UNKNOWN);
+ if (network == NULL)
+ return __connman_error_failed(msg);
+
+ while (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_DICT_ENTRY) {
+ DBusMessageIter entry, value;
+ const char *key, *str;
+
+ dbus_message_iter_recurse(&iter, &entry);
+ dbus_message_iter_get_basic(&entry, &key);
+
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &value);
+
+ switch (dbus_message_iter_get_arg_type(&value)) {
+ case DBUS_TYPE_STRING:
+ dbus_message_iter_get_basic(&value, &str);
+ connman_network_set_string(network, key, str);
+ break;
+ }
+
+ dbus_message_iter_next(&iter);
+ }
+
+ err = device->driver->join(device, network);
+
+ connman_network_unref(network);
+
+ if (err < 0)
+ return __connman_error_failed(msg);
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
static DBusMessage *create_network(DBusConnection *conn,