Refactor HIDP kernel module interaction to ioctl_xxx routines. --- profiles/input/device.c | 117 ++++++++++++++++++++++++++---------------------- 1 file changed, 64 insertions(+), 53 deletions(-) diff --git a/profiles/input/device.c b/profiles/input/device.c index a2329c6..bded1ea 100644 --- a/profiles/input/device.c +++ b/profiles/input/device.c @@ -333,6 +333,68 @@ static int ioctl_connadd(struct hidp_connadd_req *req) return err; } +static int ioctl_is_connected(struct input_device *idev) +{ + struct hidp_conninfo ci; + int ctl; + + /* Standard HID */ + ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HIDP); + if (ctl < 0) { + error("Can't open HIDP control socket"); + return 0; + } + + memset(&ci, 0, sizeof(ci)); + bacpy(&ci.bdaddr, &idev->dst); + if (ioctl(ctl, HIDPGETCONNINFO, &ci) < 0) { + error("Can't get HIDP connection info"); + close(ctl); + return 0; + } + + close(ctl); + + if (ci.state != BT_CONNECTED) + return 0; + else + return 1; +} + +static int ioctl_disconnect(struct input_device *idev, uint32_t flags) +{ + struct hidp_conndel_req req; + struct hidp_conninfo ci; + int ctl, err = 0; + + ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HIDP); + if (ctl < 0) { + error("Can't open HIDP control socket"); + return -errno; + } + + memset(&ci, 0, sizeof(ci)); + bacpy(&ci.bdaddr, &idev->dst); + if ((ioctl(ctl, HIDPGETCONNINFO, &ci) < 0) || + (ci.state != BT_CONNECTED)) { + close(ctl); + return -ENOTCONN; + } + + memset(&req, 0, sizeof(req)); + bacpy(&req.bdaddr, &idev->dst); + req.flags = flags; + if (ioctl(ctl, HIDPCONNDEL, &req) < 0) { + err = -errno; + error("Can't delete the HID device: %s (%d)", + strerror(-err), -err); + } + + close(ctl); + + return err; +} + static gboolean encrypt_notify(GIOChannel *io, GIOCondition condition, gpointer data) { @@ -450,35 +512,11 @@ cleanup: static int is_connected(struct input_device *idev) { - struct hidp_conninfo ci; - int ctl; - - /* Standard HID */ - ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HIDP); - if (ctl < 0) - return 0; - - memset(&ci, 0, sizeof(ci)); - bacpy(&ci.bdaddr, &idev->dst); - if (ioctl(ctl, HIDPGETCONNINFO, &ci) < 0) { - close(ctl); - return 0; - } - - close(ctl); - - if (ci.state != BT_CONNECTED) - return 0; - else - return 1; + return ioctl_is_connected(idev); } static int connection_disconnect(struct input_device *idev, uint32_t flags) { - struct hidp_conndel_req req; - struct hidp_conninfo ci; - int ctl, err = 0; - if (!is_connected(idev)) return -ENOTCONN; @@ -488,34 +526,7 @@ static int connection_disconnect(struct input_device *idev, uint32_t flags) if (idev->ctrl_io) g_io_channel_shutdown(idev->ctrl_io, TRUE, NULL); - ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HIDP); - if (ctl < 0) { - error("Can't open HIDP control socket"); - return -errno; - } - - memset(&ci, 0, sizeof(ci)); - bacpy(&ci.bdaddr, &idev->dst); - if ((ioctl(ctl, HIDPGETCONNINFO, &ci) < 0) || - (ci.state != BT_CONNECTED)) { - err = -ENOTCONN; - goto fail; - } - - memset(&req, 0, sizeof(req)); - bacpy(&req.bdaddr, &idev->dst); - req.flags = flags; - if (ioctl(ctl, HIDPCONNDEL, &req) < 0) { - err = -errno; - error("Can't delete the HID device: %s(%d)", - strerror(-err), -err); - goto fail; - } - -fail: - close(ctl); - - return err; + return ioctl_disconnect(idev, flags); } static void disconnect_cb(struct btd_device *device, gboolean removal, -- 1.9.1.423.g4596e3a -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html