From: Andrei Emeltchenko <andrei.emeltchenko@xxxxxxxxx> HAL connect uses similar event handlers like listen call. --- android/socket.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/android/socket.c b/android/socket.c index dde000d..063681e 100644 --- a/android/socket.c +++ b/android/socket.c @@ -377,8 +377,49 @@ static int handle_listen(void *buf) return hal_fd; } -static void connect_cb(GIOChannel *io, GError *err, gpointer user_data) +static void connect_cb(GIOChannel *io, GError *conn_err, gpointer user_data) { + struct rfcomm_slot *rfslot = user_data; + GIOChannel *io_stack; + GError *io_err = NULL; + bdaddr_t dst; + char address[18]; + int chan = -1; + + bt_io_get(io, &io_err, + BT_IO_OPT_DEST_BDADDR, &dst, + BT_IO_OPT_INVALID); + if (io_err) { + error("%s", io_err->message); + g_error_free(io_err); + goto fail; + } + + if (conn_err) { + error("%s", conn_err->message); + goto fail; + } + + ba2str(&dst, address); + DBG("Connected to %s rfslot %p chan %d", address, rfslot, chan); + + DBG("rfslot: fd %d real_sock %d chan %u sock %d", + rfslot->fd, rfslot->real_sock, rfslot->channel, + g_io_channel_unix_get_fd(io)); + + /* Handle events from Android */ + io_stack = g_io_channel_unix_new(rfslot->fd); + g_io_add_watch(io_stack, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, + sock_stack_event_cb, rfslot); + g_io_channel_unref(io_stack); + + /* Handle rfcomm events */ + g_io_add_watch(io, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL, + sock_rfcomm_event_cb, rfslot); + + return; +fail: + cleanup_rfslot(rfslot); } static void sdp_search_cb(sdp_list_t *recs, int err, gpointer data) -- 1.7.10.4 -- 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