summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2007-01-24 17:44:58 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2007-01-24 17:44:58 +0000
commitccf0880203ad1c3c0f6f78a16b271114875fffb4 (patch)
treeec1281011545d58f40c1259f831ac3354ea36bbf
parent818548335c3aa9eff21e569e8f3148663b28af1a (diff)
Check if the input is already connected when "Connect" is requested
-rw-r--r--input/input-service.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/input/input-service.c b/input/input-service.c
index 1c3bb604..049792c5 100644
--- a/input/input-service.c
+++ b/input/input-service.c
@@ -530,7 +530,6 @@ static int l2cap_connect(struct pending_connect *pc,
bacpy(&addr.l2_bdaddr, &pc->dba);
addr.l2_psm = htobs(psm);
- /* FIXME: check leaking io channel */
io = g_io_channel_unix_new(sk);
g_io_channel_set_close_on_unref(io, FALSE);
@@ -682,12 +681,26 @@ static DBusHandlerResult device_connect(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct input_device *idev = data;
+ struct hidp_conninfo ci;
struct pending_connect *pc;
bdaddr_t dba;
+ int ctl;
- /* FIXME: check if it is already connected */
- str2ba(idev->addr, &dba);
+ ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HIDP);
+ if (ctl < 0)
+ return err_connection_failed(conn, msg, strerror(errno));
+
+ /* Check if it is already connected */
+ memset(&ci, 0, sizeof(struct hidp_conninfo));
+ str2ba(idev->addr, &ci.bdaddr);
+ if (!ioctl(ctl, HIDPGETCONNINFO, &ci) && (ci.state == BT_CONNECTED)) {
+ close(ctl);
+ return err_connection_failed(conn, msg, "Already connected");
+ }
+ close(ctl);
+
+ str2ba(idev->addr, &dba);
pc = pending_connect_new(BDADDR_ANY, &dba, conn, msg);
if (!pc)
return DBUS_HANDLER_RESULT_NEED_MEMORY;