diff options
| -rw-r--r-- | common/glib-helper.c | 32 | ||||
| -rw-r--r-- | common/glib-helper.h | 2 | 
2 files changed, 29 insertions, 5 deletions
| diff --git a/common/glib-helper.c b/common/glib-helper.c index ef5a1d13..59293334 100644 --- a/common/glib-helper.c +++ b/common/glib-helper.c @@ -734,7 +734,7 @@ static int l2cap_connect(struct io_context *io_ctxt, const bdaddr_t *src,  }  static int rfcomm_bind(struct io_context *io_ctxt, const bdaddr_t *src, -				uint8_t channel, uint32_t flags, +				uint8_t *channel, uint32_t flags,  				struct sockaddr_rc *addr)  {  	int err; @@ -756,7 +756,7 @@ static int rfcomm_bind(struct io_context *io_ctxt, const bdaddr_t *src,  	memset(addr, 0, sizeof(*addr));  	addr->rc_family = AF_BLUETOOTH;  	bacpy(&addr->rc_bdaddr, src); -	addr->rc_channel = channel; +	addr->rc_channel = *channel;  	err = bind(io_ctxt->fd, (struct sockaddr *) addr, sizeof(*addr));  	if (err < 0) { @@ -764,11 +764,13 @@ static int rfcomm_bind(struct io_context *io_ctxt, const bdaddr_t *src,  		return -errno;  	} +	*channel = addr->rc_channel; +  	return 0;  }  static int rfcomm_listen(struct io_context *io_ctxt, const bdaddr_t *src, -				uint8_t channel, uint32_t flags) +				uint8_t *channel, uint32_t flags)  {  	struct sockaddr_rc addr;  	int err; @@ -834,8 +836,8 @@ static void io_context_cleanup(struct io_context *io_ctxt)  	g_free(io_ctxt);  } -GIOChannel *bt_rfcomm_listen(const bdaddr_t *src, uint8_t channel, uint32_t flags, -			bt_io_callback_t cb, void *user_data) +GIOChannel *rfcomm_listen_internal(const bdaddr_t *src, uint8_t *channel, +			uint32_t flags, bt_io_callback_t cb, void *user_data)  {  	struct io_context *io_ctxt;  	int err; @@ -853,6 +855,26 @@ GIOChannel *bt_rfcomm_listen(const bdaddr_t *src, uint8_t channel, uint32_t flag  	return io_ctxt->io;  } +GIOChannel *bt_rfcomm_listen_allocate(const bdaddr_t *src, uint8_t *channel, +			uint32_t flags, bt_io_callback_t cb, void *user_data) +{ +	if (!channel) +		return NULL; + +	*channel = 0; + +	return rfcomm_listen_internal(src, channel, flags, cb, user_data); +} + +GIOChannel *bt_rfcomm_listen(const bdaddr_t *src, uint8_t channel, +			uint32_t flags, bt_io_callback_t cb, void *user_data) +{ +	if (channel < 1 || channel > 30) +		return NULL; + +	return rfcomm_listen_internal(src, &channel, flags, cb, user_data); +} +  int bt_rfcomm_connect(const bdaddr_t *src, const bdaddr_t *dst,  			uint8_t channel, bt_io_callback_t cb, void *user_data)  { diff --git a/common/glib-helper.h b/common/glib-helper.h index 23a04046..8d346b49 100644 --- a/common/glib-helper.h +++ b/common/glib-helper.h @@ -42,6 +42,8 @@ GSList *bt_string2list(const gchar *str);  GIOChannel *bt_rfcomm_listen(const bdaddr_t *src, uint8_t channel,  			uint32_t flags, bt_io_callback_t cb, void *user_data); +GIOChannel *bt_rfcomm_listen_allocate(const bdaddr_t *src, uint8_t *channel, +			uint32_t flags, bt_io_callback_t cb, void *user_data);  int bt_rfcomm_connect(const bdaddr_t *src, const bdaddr_t *dst,  			uint8_t channel, bt_io_callback_t cb, void *user_data); | 
