Add an API to set the link timeout.

Change-Id: I5abd8fc37e20a7916e84e624f883c7a1987b0587
diff --git a/src/adapter.c b/src/adapter.c
index 9e9bacd..bb2f320 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1735,7 +1735,6 @@
 				ERROR_INTERFACE ".Failed",
 				"Failed to register sdp record");
 
-	printf("npelly new handle %X\n", record->handle);
 	reply = dbus_message_new_method_return(msg);
 	dbus_message_append_args(reply,
 			DBUS_TYPE_UINT32, &record->handle,
@@ -1763,6 +1762,49 @@
 	return dbus_message_new_method_return(msg);
 }
 
+static DBusMessage *set_link_timeout(DBusConnection *conn,
+					DBusMessage *msg, void *data)
+{
+	struct btd_adapter *adapter = data;
+        struct btd_device *device;
+	const char *path;
+	GSList *l;
+	uint32_t num_slots;
+        int dd, err;
+
+	if (!dbus_message_get_args(msg, NULL,
+			DBUS_TYPE_OBJECT_PATH, &path,
+			DBUS_TYPE_UINT32, &num_slots,
+			DBUS_TYPE_INVALID))
+		return invalid_args(msg);
+
+        l = g_slist_find_custom(adapter->devices,
+                        path, (GCompareFunc) device_path_cmp);
+        if (!l)
+                return g_dbus_create_error(msg,
+                                ERROR_INTERFACE ".DoesNotExist",
+                                "Device does not exist");
+	device = l->data;
+	dd = hci_open_dev(adapter->dev_id);
+
+	if (dd < 0) {
+		err = -errno;
+		goto fail;
+	}
+
+	err = hci_write_link_supervision_timeout(dd,
+			htobs(device_get_handle(device)), htobs(num_slots), 1000);
+	hci_close_dev(dd);
+
+	if (err < 0) {
+		err = -errno;
+		goto fail;
+	}
+	return dbus_message_new_method_return(msg);
+fail:
+	return failed_strerror(msg, errno);
+}
+
 static GDBusMethodTable adapter_methods[] = {
 	{ "GetProperties",	"",	"a{sv}",get_properties		},
 	{ "SetProperty",	"sv",	"",	set_property,
@@ -1788,6 +1830,7 @@
 	{ "UnregisterAgent",	"o",	"",	unregister_agent	},
 	{ "AddRfcommServiceRecord",	"sttq",	"u",	add_rfcomm_service_record },
 	{ "RemoveServiceRecord",	"u",	"",	remove_service_record },
+	{ "SetLinkTimeout",	"ou",	"",	set_link_timeout	},
 	{ }
 };
 
diff --git a/src/device.c b/src/device.c
index 2aaf5b8..5328db9 100644
--- a/src/device.c
+++ b/src/device.c
@@ -857,6 +857,11 @@
 	return (handle == device->handle);
 }
 
+uint16_t device_get_handle(struct btd_device *device)
+{
+	return device->handle;
+}
+
 guint device_add_disconnect_watch(struct btd_device *device,
 				disconnect_watch watch, void *user_data,
 				GDestroyNotify destroy)
diff --git a/src/device.h b/src/device.h
index 7f297c1..c6677dc 100644
--- a/src/device.h
+++ b/src/device.h
@@ -80,6 +80,7 @@
 void device_set_renewed_key(struct btd_device *device, gboolean renewed);
 void device_add_connection(struct btd_device *device, DBusConnection *conn,
 				uint16_t handle);
+uint16_t device_get_handle(struct btd_device *device);
 void device_remove_connection(struct btd_device *device, DBusConnection *conn,
 				uint16_t handle);
 gboolean device_has_connection(struct btd_device *device, uint16_t handle);