summaryrefslogtreecommitdiff
path: root/android/socket.c
diff options
context:
space:
mode:
authorAndrei Emeltchenko <andrei.emeltchenko@intel.com>2013-12-19 10:49:18 +0200
committerJohan Hedberg <johan.hedberg@intel.com>2013-12-19 11:08:22 +0200
commitb81374ec8001e307507cd98bf3902fc594f4d428 (patch)
treeaaa17b356d3a6c9e26f9178ede677782439a6007 /android/socket.c
parentfe8dabaaa1eb0583e24709031ad51d5b7ff73413 (diff)
downloadbluez-b81374ec8001e307507cd98bf3902fc594f4d428.tar.gz
android/socket: Refactor connect to allow directly connect to rfcomm
Since Socket HAL allows us to specify RFCOMM channel number and directly connect refactor send function to allow connect directly is uuid is zero and channel number is specified.
Diffstat (limited to 'android/socket.c')
-rw-r--r--android/socket.c71
1 files changed, 39 insertions, 32 deletions
diff --git a/android/socket.c b/android/socket.c
index cee4b6eda..656222ea7 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -838,13 +838,47 @@ fail:
cleanup_rfsock(rfsock);
}
-static void sdp_search_cb(sdp_list_t *recs, int err, gpointer data)
+static bool do_connect(struct rfcomm_sock *rfsock, int chan)
{
- struct rfcomm_sock *rfsock = data;
BtIOSecLevel sec_level = BT_IO_SEC_MEDIUM;
+ GIOChannel *io;
GError *gerr = NULL;
+
+ if (rfsock->profile)
+ sec_level = rfsock->profile->sec_level;
+
+ io = bt_io_connect(connect_cb, rfsock, NULL, &gerr,
+ BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
+ BT_IO_OPT_DEST_BDADDR, &rfsock->dst,
+ BT_IO_OPT_CHANNEL, chan,
+ BT_IO_OPT_SEC_LEVEL, sec_level,
+ BT_IO_OPT_INVALID);
+ if (!io) {
+ error("Failed connect: %s", gerr->message);
+ g_error_free(gerr);
+ return false;
+ }
+
+ g_io_channel_set_close_on_unref(io, FALSE);
+ g_io_channel_unref(io);
+
+ if (write(rfsock->fd, &chan, sizeof(chan)) != sizeof(chan)) {
+ error("Error sending RFCOMM channel");
+ return false;
+ }
+
+ rfsock->real_sock = g_io_channel_unix_get_fd(io);
+ rfsock_set_buffer(rfsock);
+ rfsock->channel = chan;
+ connections = g_list_append(connections, rfsock);
+
+ return true;
+}
+
+static void sdp_search_cb(sdp_list_t *recs, int err, gpointer data)
+{
+ struct rfcomm_sock *rfsock = data;
sdp_list_t *list;
- GIOChannel *io;
int chan;
DBG("");
@@ -885,36 +919,9 @@ static void sdp_search_cb(sdp_list_t *recs, int err, gpointer data)
DBG("Got RFCOMM channel %d", chan);
- if (rfsock->profile)
- sec_level = rfsock->profile->sec_level;
-
- io = bt_io_connect(connect_cb, rfsock, NULL, &gerr,
- BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
- BT_IO_OPT_DEST_BDADDR, &rfsock->dst,
- BT_IO_OPT_CHANNEL, chan,
- BT_IO_OPT_SEC_LEVEL, sec_level,
- BT_IO_OPT_INVALID);
- if (!io) {
- error("Failed connect: %s", gerr->message);
- g_error_free(gerr);
- goto fail;
- }
-
- if (write(rfsock->fd, &chan, sizeof(chan)) != sizeof(chan)) {
- error("Error sending RFCOMM channel");
- goto fail;
- }
-
- rfsock->real_sock = g_io_channel_unix_get_fd(io);
- rfsock_set_buffer(rfsock);
- rfsock->channel = chan;
- connections = g_list_append(connections, rfsock);
-
- g_io_channel_unref(io);
-
- return;
+ if (do_connect(rfsock, chan))
+ return;
fail:
- connections = g_list_remove(connections, rfsock);
cleanup_rfsock(rfsock);
}