From ccf0880203ad1c3c0f6f78a16b271114875fffb4 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Wed, 24 Jan 2007 17:44:58 +0000 Subject: Check if the input is already connected when "Connect" is requested --- input/input-service.c | 19 ++++++++++++++++--- 1 file 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; -- cgit