diff options
Diffstat (limited to 'common/glib-helper.c')
| -rw-r--r-- | common/glib-helper.c | 121 | 
1 files changed, 55 insertions, 66 deletions
| diff --git a/common/glib-helper.c b/common/glib-helper.c index 3ccadbcf..c05ac5c5 100644 --- a/common/glib-helper.c +++ b/common/glib-helper.c @@ -739,6 +739,38 @@ static int transport_connect(BtIO *io, struct sockaddr *addr,  	return 0;  } +static int sco_bind(struct io_context *io_ctxt, const char *address, +			uint16_t mtu, struct sockaddr_sco *addr) +{ +	int err; +	struct sco_options sco_opt; + +	io_ctxt->fd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO); +	if (io_ctxt->fd < 0) +		return -errno; + +	memset(addr, 0, sizeof(*addr)); +	addr->sco_family = AF_BLUETOOTH; +	str2ba(address, &addr->sco_bdaddr); + +	err = bind(io_ctxt->fd, (struct sockaddr *) addr, sizeof(*addr)); +	if (err < 0) { +		close(io_ctxt->fd); +		return -errno; +	} + +	if (mtu) { +		socklen_t olen = sizeof(sco_opt); +		memset(&sco_opt, 0, olen); +		getsockopt(io_ctxt->fd, SOL_SCO, SCO_OPTIONS, &sco_opt, &olen); +		sco_opt.mtu = mtu; +		setsockopt(io_ctxt->fd, SOL_SCO, SCO_OPTIONS, &sco_opt, +				sizeof(sco_opt)); +	} + +	return 0; +} +  static BtIOError sco_connect(BtIO *io, BtIOFunc func)  {  	struct io_context *io_ctxt = io->io_ctxt; @@ -747,21 +779,9 @@ static BtIOError sco_connect(BtIO *io, BtIOFunc func)  	io_ctxt->func = func; -	sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO); -	if (sk < 0) -		return -errno; - -	memset(&addr, 0, sizeof(addr)); -	addr.sco_family = AF_BLUETOOTH; -	str2ba(io->src, &addr.sco_bdaddr); - -	err = bind(sk, (struct sockaddr *) &addr, sizeof(addr)); -	if (err < 0) { -		close(sk); +	err = sco_bind(io_ctxt, io->src, 0, &addr); +	if (err < 0)  		return BT_IO_FAILED; -	} - -	io_ctxt->fd = sk;  	memset(&addr, 0, sizeof(addr));  	addr.sco_family = AF_BLUETOOTH; @@ -788,6 +808,17 @@ static int l2cap_bind(struct io_context *io_ctxt, const char *address,  	if (io_ctxt->fd < 0)  		return -errno; +	memset(addr, 0, sizeof(*addr)); +	addr->l2_family = AF_BLUETOOTH; +	str2ba(address, &addr->l2_bdaddr); +	addr->l2_psm = htobs(psm); + +	err = bind(io_ctxt->fd, (struct sockaddr *) addr, sizeof(*addr)); +	if (err < 0) { +		close(io_ctxt->fd); +		return -errno; +	} +  	if (mtu) {  		socklen_t olen = sizeof(l2o);  		memset(&l2o, 0, olen); @@ -806,17 +837,6 @@ static int l2cap_bind(struct io_context *io_ctxt, const char *address,  		}  	} -	memset(addr, 0, sizeof(*addr)); -	addr->l2_family = AF_BLUETOOTH; -	str2ba(address, &addr->l2_bdaddr); -	addr->l2_psm = htobs(psm); - -	err = bind(io_ctxt->fd, (struct sockaddr *) addr, sizeof(*addr)); -	if (err < 0) { -		close(io_ctxt->fd); -		return -errno; -	} -  	return 0;  } @@ -878,15 +898,6 @@ static BtIOError rfcomm_bind(struct io_context *io_ctxt, const char *address,  	if (io_ctxt->fd < 0)  		return BT_IO_FAILED; -	if (flags) { -		int opt = flags; -		err = setsockopt(io_ctxt->fd, SOL_RFCOMM, RFCOMM_LM, &opt, -				sizeof(opt)); -		if (err < 0) { -			close(io_ctxt->fd); -			return BT_IO_FAILED; -		} -	}  	memset(addr, 0, sizeof(*addr));  	addr->rc_family = AF_BLUETOOTH; @@ -899,6 +910,16 @@ static BtIOError rfcomm_bind(struct io_context *io_ctxt, const char *address,  		return BT_IO_FAILED;  	} +	if (flags) { +		int opt = flags; +		err = setsockopt(io_ctxt->fd, SOL_RFCOMM, RFCOMM_LM, &opt, +				sizeof(opt)); +		if (err < 0) { +			close(io_ctxt->fd); +			return BT_IO_FAILED; +		} +	} +  	return BT_IO_SUCCESS;  } @@ -961,38 +982,6 @@ static BtIOError rfcomm_connect(BtIO *io, BtIOFunc func)  	return BT_IO_SUCCESS;  } -static int sco_bind(struct io_context *io_ctxt, const char *address, -			uint16_t mtu, struct sockaddr_sco *addr) -{ -	int err; -	struct sco_options sco_opt; - -	io_ctxt->fd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO); -	if (io_ctxt->fd < 0) -		return -errno; - -	if (mtu) { -		socklen_t olen = sizeof(sco_opt); -		memset(&sco_opt, 0, olen); -		getsockopt(io_ctxt->fd, SOL_SCO, SCO_OPTIONS, &sco_opt, &olen); -		sco_opt.mtu = mtu; -		setsockopt(io_ctxt->fd, SOL_SCO, SCO_OPTIONS, &sco_opt, -				sizeof(sco_opt)); -	} - -	memset(addr, 0, sizeof(*addr)); -	addr->sco_family = AF_BLUETOOTH; -	str2ba(address, &addr->sco_bdaddr); - -	err = bind(io_ctxt->fd, (struct sockaddr *) addr, sizeof(*addr)); -	if (err < 0) { -		close(io_ctxt->fd); -		return -errno; -	} - -	return 0; -} -  static BtIOError sco_listen(BtIO *io, BtIOFunc func)  {  	struct io_context *io_ctxt = io->io_ctxt; | 
