diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2010-11-08 23:56:54 +0100 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-11-08 23:56:54 +0100 |
commit | b8015e1eddca7c246826f74e6a06fb3da1b011d4 (patch) | |
tree | 6ebafc0a2a6ee987601af51ec34a9b903e0762c4 /plugins/bluetooth.c | |
parent | eb93dcfa05a8ddcaea9d80b990f3055c1f4e0edf (diff) | |
download | connman-b8015e1eddca7c246826f74e6a06fb3da1b011d4.tar.gz connman-b8015e1eddca7c246826f74e6a06fb3da1b011d4.tar.bz2 connman-b8015e1eddca7c246826f74e6a06fb3da1b011d4.zip |
bluetooth: Implement tethering hook
Diffstat (limited to 'plugins/bluetooth.c')
-rw-r--r-- | plugins/bluetooth.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c index b34ca1c3..9a73e96f 100644 --- a/plugins/bluetooth.c +++ b/plugins/bluetooth.c @@ -44,6 +44,7 @@ #define BLUEZ_ADAPTER_INTERFACE BLUEZ_SERVICE ".Adapter" #define BLUEZ_DEVICE_INTERFACE BLUEZ_SERVICE ".Device" #define BLUEZ_NETWORK_INTERFACE BLUEZ_SERVICE ".Network" +#define BLUEZ_NETWORK_SERVER BLUEZ_SERVICE ".NetworkServer" #define LIST_ADAPTERS "ListAdapters" #define ADAPTER_ADDED "AdapterAdded" @@ -57,6 +58,9 @@ #define CONNECT "Connect" #define DISCONNECT "Disconnect" +#define REGISTER "Register" +#define UNREGISTER "Unregister" + #define UUID_NAP "00001116-0000-1000-8000-00805f9b34fb" #define TIMEOUT 5000 @@ -942,9 +946,117 @@ static void tech_remove(struct connman_technology *technology) { } +static void server_register_reply(DBusPendingCall *call, void *user_data) +{ + DBusError error; + DBusMessage *reply; + + DBG(""); + + reply = dbus_pending_call_steal_reply(call); + + dbus_error_init(&error); + + if (dbus_set_error_from_message(&error, reply) == TRUE) { + connman_error("%s", error.message); + dbus_error_free(&error); + dbus_message_unref(reply); + dbus_pending_call_unref(call); + return; + } + + dbus_message_unref(reply); + dbus_pending_call_unref(call); + +} + +static void server_register(const char *path, const char *uuid, + const char *bridge, connman_bool_t enabled) +{ + DBusMessage *message; + DBusPendingCall *call; + char *command; + + DBG("path %s enabled %d", path, enabled); + + command = enabled ? REGISTER : UNREGISTER; + + message = dbus_message_new_method_call(BLUEZ_SERVICE, path, + BLUEZ_NETWORK_SERVER, command); + if (message == NULL) + return; + + dbus_message_set_auto_start(message, FALSE); + + dbus_message_append_args(message, DBUS_TYPE_STRING, &uuid, + DBUS_TYPE_INVALID); + + if (enabled == TRUE) + dbus_message_append_args(message, DBUS_TYPE_STRING, &bridge, + DBUS_TYPE_INVALID); + + if (dbus_connection_send_with_reply(connection, message, + &call, TIMEOUT) == FALSE) { + connman_error("Failed to enable PAN server"); + dbus_message_unref(message); + return; + } + + if (call == NULL) { + connman_error("D-Bus connection not available"); + dbus_message_unref(message); + return; + } + + dbus_pending_call_set_notify(call, server_register_reply, + g_strdup(path), g_free); + + dbus_message_unref(message); +} + +static void enable_nap(gpointer key, gpointer value, + gpointer user_data) +{ + struct connman_device *device = value; + const char *bridge = user_data; + const char *path; + + path = connman_device_get_string(device, "Path"); + + server_register(path, "nap", bridge, TRUE); +} + +static void disable_nap(gpointer key, gpointer value, + gpointer user_data) +{ + struct connman_device *device = value; + const char *bridge = user_data; + const char *path; + + path = connman_device_get_string(device, "Path"); + + server_register(path, "nap", bridge, FALSE); +} + static int tech_set_tethering(struct connman_technology *technology, const char *bridge, connman_bool_t enabled) { + char *bridge_name = g_strdup(bridge); + + DBG("bridge %s", bridge); + + if (bridge_name == NULL) + return -ENOMEM; + + if (enabled) + g_hash_table_foreach(bluetooth_devices, + enable_nap, bridge_name); + else + g_hash_table_foreach(bluetooth_devices, + disable_nap, bridge_name); + + g_free(bridge_name); + return 0; } |