diff options
Diffstat (limited to 'common/glib-helper.c')
-rw-r--r-- | common/glib-helper.c | 103 |
1 files changed, 53 insertions, 50 deletions
diff --git a/common/glib-helper.c b/common/glib-helper.c index 798f8a64..93ef262c 100644 --- a/common/glib-helper.c +++ b/common/glib-helper.c @@ -63,6 +63,7 @@ int set_nonblocking(int fd) } struct io_context { + int fd; GIOChannel *io; bt_io_callback_t cb; gpointer user_data; @@ -404,15 +405,15 @@ static gboolean listen_cb(GIOChannel *chan, GIOCondition cond, return TRUE; } -static int transport_listen(struct io_context *io_ctxt, int fd) +static int transport_listen(struct io_context *io_ctxt) { int err; - err = listen(fd, 1); + err = listen(io_ctxt->fd, 1); if (err < 0) return -errno; - io_ctxt->io = g_io_channel_unix_new(fd); + io_ctxt->io = g_io_channel_unix_new(io_ctxt->fd); if (!io_ctxt->io) return -ENOMEM; @@ -458,12 +459,12 @@ done: return FALSE; } -static int transport_connect(struct io_context *io_ctxt, int fd, - struct sockaddr *addr, socklen_t addrlen) +static int transport_connect(struct io_context *io_ctxt, struct sockaddr *addr, + socklen_t addrlen) { int err; - io_ctxt->io = g_io_channel_unix_new(fd); + io_ctxt->io = g_io_channel_unix_new(io_ctxt->fd); if (!io_ctxt->io) return -ENOMEM; @@ -471,7 +472,7 @@ static int transport_connect(struct io_context *io_ctxt, int fd, if (err != G_IO_STATUS_NORMAL) return -EPERM; - err = connect(fd, addr, addrlen); + err = connect(io_ctxt->fd, addr, addrlen); if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS)) return -errno; @@ -505,7 +506,7 @@ static int sco_connect(struct io_context *io_ctxt, const bdaddr_t *src, addr.sco_family = AF_BLUETOOTH; bacpy(&addr.sco_bdaddr, dst); - err = transport_connect(io_ctxt, sk, (struct sockaddr *) &addr, + err = transport_connect(io_ctxt, (struct sockaddr *) &addr, sizeof(addr)); if (err < 0) { close(sk); @@ -519,26 +520,27 @@ static int l2cap_bind(struct io_context *io_ctxt, const bdaddr_t *src, uint16_t psm, uint16_t mtu, uint32_t flags, struct sockaddr_l2 *addr) { - int sk, err; + int err; struct l2cap_options l2o; - sk = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); - if (sk < 0) + io_ctxt->fd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); + if (io_ctxt->fd < 0) return -errno; if (mtu) { socklen_t olen = sizeof(l2o); memset(&l2o, 0, olen); - getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &olen); + getsockopt(io_ctxt->fd, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &olen); l2o.imtu = l2o.omtu = mtu; - setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, sizeof(l2o)); + setsockopt(io_ctxt->fd, SOL_L2CAP, L2CAP_OPTIONS, &l2o, sizeof(l2o)); } if (flags) { int opt = flags; - err = setsockopt(sk, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)); + err = setsockopt(io_ctxt->fd, SOL_L2CAP, L2CAP_LM, &opt, + sizeof(opt)); if (err < 0) { - close(sk); + close(io_ctxt->fd); return -errno; } } @@ -548,28 +550,28 @@ static int l2cap_bind(struct io_context *io_ctxt, const bdaddr_t *src, bacpy(&addr->l2_bdaddr, src); addr->l2_psm = htobs(psm); - err = bind(sk, (struct sockaddr *) addr, sizeof(*addr)); + err = bind(io_ctxt->fd, (struct sockaddr *) addr, sizeof(*addr)); if (err < 0) { - close(sk); + close(io_ctxt->fd); return -errno; } - return sk; + return 0; } static int l2cap_listen(struct io_context *io_ctxt, const bdaddr_t *src, uint16_t psm, uint16_t mtu, uint32_t flags) { struct sockaddr_l2 addr; - int sk, err; + int err; - sk = l2cap_bind(io_ctxt, src, psm, mtu, flags, &addr); - if (sk < 0) - return sk; + err = l2cap_bind(io_ctxt, src, psm, mtu, flags, &addr); + if (err < 0) + return err; - err = transport_listen(io_ctxt, sk); + err = transport_listen(io_ctxt); if (err < 0) { - close(sk); + close(io_ctxt->fd); return err; } @@ -581,21 +583,21 @@ static int l2cap_connect(struct io_context *io_ctxt, const bdaddr_t *src, uint16_t mtu) { struct sockaddr_l2 l2a; - int sk, err; + int err; - sk = l2cap_bind(io_ctxt, src, 0, mtu, 0, &l2a); - if (sk < 0) - return sk; + err = l2cap_bind(io_ctxt, src, 0, mtu, 0, &l2a); + if (err < 0) + return err; memset(&l2a, 0, sizeof(l2a)); l2a.l2_family = AF_BLUETOOTH; bacpy(&l2a.l2_bdaddr, dst); l2a.l2_psm = htobs(psm); - err = transport_connect(io_ctxt, sk, (struct sockaddr *) &l2a, + err = transport_connect(io_ctxt, (struct sockaddr *) &l2a, sizeof(l2a)); if (err < 0) { - close(sk); + close(io_ctxt->fd); return err; } @@ -606,17 +608,18 @@ static int rfcomm_bind(struct io_context *io_ctxt, const bdaddr_t *src, uint8_t channel, uint32_t flags, struct sockaddr_rc *addr) { - int sk, err; + int err; - sk = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); - if (sk < 0) + io_ctxt->fd = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); + if ( io_ctxt->fd < 0) return -errno; if (flags) { int opt = flags; - err = setsockopt(sk, SOL_RFCOMM, RFCOMM_LM, &opt, sizeof(opt)); + err = setsockopt(io_ctxt->fd, SOL_RFCOMM, RFCOMM_LM, &opt, + sizeof(opt)); if (err < 0) { - close(sk); + close(io_ctxt->fd); return -errno; } } @@ -626,28 +629,28 @@ static int rfcomm_bind(struct io_context *io_ctxt, const bdaddr_t *src, bacpy(&addr->rc_bdaddr, src); addr->rc_channel = channel; - err = bind(sk, (struct sockaddr *) addr, sizeof(*addr)); + err = bind(io_ctxt->fd, (struct sockaddr *) addr, sizeof(*addr)); if (err < 0) { - close(sk); + close(io_ctxt->fd); return -errno; } - return sk; + return 0; } static int rfcomm_listen(struct io_context *io_ctxt, const bdaddr_t *src, uint8_t channel, uint32_t flags) { struct sockaddr_rc addr; - int sk, err; + int err; - sk = rfcomm_bind(io_ctxt, src, channel, flags, &addr); - if (sk < 0) - return sk; + err = rfcomm_bind(io_ctxt, src, channel, flags, &addr); + if (err < 0) + return err; - err = transport_listen(io_ctxt, sk); + err = transport_listen(io_ctxt); if (err < 0) { - close(sk); + close(io_ctxt->fd); return err; } @@ -658,21 +661,21 @@ static int rfcomm_connect(struct io_context *io_ctxt, const bdaddr_t *src, const bdaddr_t *dst, uint8_t channel) { struct sockaddr_rc addr; - int sk, err; + int err; - sk = rfcomm_bind(io_ctxt, src, 0, 0, &addr); - if (sk < 0) - return sk; + err = rfcomm_bind(io_ctxt, src, 0, 0, &addr); + if (err < 0) + return err; memset(&addr, 0, sizeof(addr)); addr.rc_family = AF_BLUETOOTH; bacpy(&addr.rc_bdaddr, dst); addr.rc_channel = channel; - err = transport_connect(io_ctxt, sk, (struct sockaddr *) &addr, + err = transport_connect(io_ctxt, (struct sockaddr *) &addr, sizeof(addr)); if (err < 0) { - close(sk); + close(io_ctxt->fd); return err; } |