3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2009-2010 Marcel Holtmann <marcel at holtmann.org>
6 * Copyright (C) 2009-2010 Nokia Corporation
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29 #include <sys/types.h>
30 #include <sys/socket.h>
32 #include <bluetooth/bluetooth.h>
33 #include <bluetooth/l2cap.h>
34 #include <bluetooth/rfcomm.h>
35 #include <bluetooth/sco.h>
36 #include <bluetooth/hci.h>
37 #include <bluetooth/hci_lib.h>
43 #define ERROR_FAILED(gerr, str, err) \
44 g_set_error(gerr, BT_IO_ERROR, BT_IO_ERROR_FAILED, \
45 str ": %s (%d)", strerror(err), err)
47 #define DEFAULT_DEFER_TIMEOUT 30
67 GDestroyNotify destroy;
73 GDestroyNotify destroy;
80 GDestroyNotify destroy;
83 static void server_remove(struct server *server)
86 server->destroy(server->user_data);
90 static void connect_remove(struct connect *conn)
93 conn->destroy(conn->user_data);
97 static void accept_remove(struct accept *accept)
100 accept->destroy(accept->user_data);
104 static gboolean check_nval(GIOChannel *io)
108 memset(&fds, 0, sizeof(fds));
109 fds.fd = g_io_channel_unix_get_fd(io);
110 fds.events = POLLNVAL;
112 if (poll(&fds, 1, 0) > 0 && (fds.revents & POLLNVAL))
118 static gboolean accept_cb(GIOChannel *io, GIOCondition cond,
121 struct accept *accept = user_data;
124 /* If the user aborted this accept attempt */
125 if ((cond & G_IO_NVAL) || check_nval(io))
128 if (cond & (G_IO_HUP | G_IO_ERR))
129 g_set_error(&err, BT_IO_ERROR, BT_IO_ERROR_DISCONNECTED,
130 "HUP or ERR on socket");
132 accept->connect(io, err, accept->user_data);
139 static gboolean connect_cb(GIOChannel *io, GIOCondition cond,
142 struct connect *conn = user_data;
145 /* If the user aborted this connect attempt */
146 if ((cond & G_IO_NVAL) || check_nval(io))
149 if (cond & G_IO_OUT) {
150 int err = 0, sock = g_io_channel_unix_get_fd(io);
151 socklen_t len = sizeof(err);
153 if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &err, &len) < 0)
157 g_set_error(&gerr, BT_IO_ERROR,
158 BT_IO_ERROR_CONNECT_FAILED, "%s (%d)",
160 } else if (cond & (G_IO_HUP | G_IO_ERR))
161 g_set_error(&gerr, BT_IO_ERROR, BT_IO_ERROR_CONNECT_FAILED,
162 "HUP or ERR on socket");
164 conn->connect(io, gerr, conn->user_data);
172 static gboolean server_cb(GIOChannel *io, GIOCondition cond,
175 struct server *server = user_data;
176 int srv_sock, cli_sock;
179 /* If the user closed the server */
180 if ((cond & G_IO_NVAL) || check_nval(io))
183 srv_sock = g_io_channel_unix_get_fd(io);
185 cli_sock = accept(srv_sock, NULL, NULL);
189 cli_io = g_io_channel_unix_new(cli_sock);
191 g_io_channel_set_close_on_unref(cli_io, TRUE);
192 g_io_channel_set_flags(cli_io, G_IO_FLAG_NONBLOCK, NULL);
195 server->confirm(cli_io, server->user_data);
197 server->connect(cli_io, NULL, server->user_data);
199 g_io_channel_unref(cli_io);
204 static void server_add(GIOChannel *io, BtIOConnect connect,
205 BtIOConfirm confirm, gpointer user_data,
206 GDestroyNotify destroy)
208 struct server *server;
211 server = g_new0(struct server, 1);
212 server->connect = connect;
213 server->confirm = confirm;
214 server->user_data = user_data;
215 server->destroy = destroy;
217 cond = G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
218 g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, server_cb, server,
219 (GDestroyNotify) server_remove);
222 static void connect_add(GIOChannel *io, BtIOConnect connect,
223 gpointer user_data, GDestroyNotify destroy)
225 struct connect *conn;
228 conn = g_new0(struct connect, 1);
229 conn->connect = connect;
230 conn->user_data = user_data;
231 conn->destroy = destroy;
233 cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
234 g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, connect_cb, conn,
235 (GDestroyNotify) connect_remove);
238 static void accept_add(GIOChannel *io, BtIOConnect connect, gpointer user_data,
239 GDestroyNotify destroy)
241 struct accept *accept;
244 accept = g_new0(struct accept, 1);
245 accept->connect = connect;
246 accept->user_data = user_data;
247 accept->destroy = destroy;
249 cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
250 g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, accept_cb, accept,
251 (GDestroyNotify) accept_remove);
254 static int l2cap_bind(int sock, const bdaddr_t *src, uint16_t psm,
255 uint16_t cid, GError **err)
257 struct sockaddr_l2 addr;
259 memset(&addr, 0, sizeof(addr));
260 addr.l2_family = AF_BLUETOOTH;
261 bacpy(&addr.l2_bdaddr, src);
264 addr.l2_cid = htobs(cid);
266 addr.l2_psm = htobs(psm);
268 if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
269 ERROR_FAILED(err, "l2cap_bind", errno);
276 static int l2cap_connect(int sock, const bdaddr_t *dst,
277 uint16_t psm, uint16_t cid)
280 struct sockaddr_l2 addr;
282 memset(&addr, 0, sizeof(addr));
283 addr.l2_family = AF_BLUETOOTH;
284 bacpy(&addr.l2_bdaddr, dst);
286 addr.l2_cid = htobs(cid);
288 addr.l2_psm = htobs(psm);
290 err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
291 if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
297 static int l2cap_set_master(int sock, int master)
303 if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags, &len) < 0)
307 if (flags & L2CAP_LM_MASTER)
309 flags |= L2CAP_LM_MASTER;
311 if (!(flags & L2CAP_LM_MASTER))
313 flags &= ~L2CAP_LM_MASTER;
316 if (setsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags, sizeof(flags)) < 0)
322 static int rfcomm_set_master(int sock, int master)
328 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags, &len) < 0)
332 if (flags & RFCOMM_LM_MASTER)
334 flags |= RFCOMM_LM_MASTER;
336 if (!(flags & RFCOMM_LM_MASTER))
338 flags &= ~RFCOMM_LM_MASTER;
341 if (setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags, sizeof(flags)) < 0)
347 static int l2cap_set_lm(int sock, int level)
352 L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT,
353 L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT | L2CAP_LM_SECURE,
354 }, opt = lm_map[level];
356 if (setsockopt(sock, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)) < 0)
362 static int rfcomm_set_lm(int sock, int level)
367 RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT,
368 RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT | RFCOMM_LM_SECURE,
369 }, opt = lm_map[level];
371 if (setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, sizeof(opt)) < 0)
377 static gboolean set_sec_level(int sock, BtIOType type, int level, GError **err)
379 struct bt_security sec;
382 if (level < BT_SECURITY_LOW || level > BT_SECURITY_HIGH) {
383 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
384 "Valid security level range is %d-%d",
385 BT_SECURITY_LOW, BT_SECURITY_HIGH);
389 memset(&sec, 0, sizeof(sec));
392 if (setsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec,
396 if (errno != ENOPROTOOPT) {
397 ERROR_FAILED(err, "setsockopt(BT_SECURITY)", errno);
401 if (type == BT_IO_L2CAP)
402 ret = l2cap_set_lm(sock, level);
404 ret = rfcomm_set_lm(sock, level);
407 ERROR_FAILED(err, "setsockopt(LM)", -ret);
414 static int l2cap_get_lm(int sock, int *sec_level)
420 if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &opt, &len) < 0)
425 if (opt & L2CAP_LM_AUTH)
426 *sec_level = BT_SECURITY_LOW;
427 if (opt & L2CAP_LM_ENCRYPT)
428 *sec_level = BT_SECURITY_MEDIUM;
429 if (opt & L2CAP_LM_SECURE)
430 *sec_level = BT_SECURITY_HIGH;
435 static int rfcomm_get_lm(int sock, int *sec_level)
441 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, &len) < 0)
446 if (opt & RFCOMM_LM_AUTH)
447 *sec_level = BT_SECURITY_LOW;
448 if (opt & RFCOMM_LM_ENCRYPT)
449 *sec_level = BT_SECURITY_MEDIUM;
450 if (opt & RFCOMM_LM_SECURE)
451 *sec_level = BT_SECURITY_HIGH;
456 static gboolean get_sec_level(int sock, BtIOType type, int *level,
459 struct bt_security sec;
463 memset(&sec, 0, sizeof(sec));
465 if (getsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec, &len) == 0) {
470 if (errno != ENOPROTOOPT) {
471 ERROR_FAILED(err, "getsockopt(BT_SECURITY)", errno);
475 if (type == BT_IO_L2CAP)
476 ret = l2cap_get_lm(sock, level);
478 ret = rfcomm_get_lm(sock, level);
481 ERROR_FAILED(err, "getsockopt(LM)", -ret);
488 static gboolean l2cap_set(int sock, int sec_level, uint16_t imtu, uint16_t omtu,
489 uint8_t mode, int master, GError **err)
491 if (imtu || omtu || mode) {
492 struct l2cap_options l2o;
495 memset(&l2o, 0, sizeof(l2o));
497 if (getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o,
499 ERROR_FAILED(err, "getsockopt(L2CAP_OPTIONS)", errno);
510 if (setsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o,
512 ERROR_FAILED(err, "setsockopt(L2CAP_OPTIONS)", errno);
517 if (master >= 0 && l2cap_set_master(sock, master) < 0) {
518 ERROR_FAILED(err, "l2cap_set_master", errno);
522 if (sec_level && !set_sec_level(sock, BT_IO_L2CAP, sec_level, err))
528 static int rfcomm_bind(int sock,
529 const bdaddr_t *src, uint8_t channel, GError **err)
531 struct sockaddr_rc addr;
533 memset(&addr, 0, sizeof(addr));
534 addr.rc_family = AF_BLUETOOTH;
535 bacpy(&addr.rc_bdaddr, src);
536 addr.rc_channel = channel;
538 if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
539 ERROR_FAILED(err, "rfcomm_bind", errno);
546 static int rfcomm_connect(int sock, const bdaddr_t *dst, uint8_t channel)
549 struct sockaddr_rc addr;
551 memset(&addr, 0, sizeof(addr));
552 addr.rc_family = AF_BLUETOOTH;
553 bacpy(&addr.rc_bdaddr, dst);
554 addr.rc_channel = channel;
556 err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
557 if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
563 static gboolean rfcomm_set(int sock, int sec_level, int master, GError **err)
565 if (sec_level && !set_sec_level(sock, BT_IO_RFCOMM, sec_level, err))
568 if (master >= 0 && rfcomm_set_master(sock, master) < 0) {
569 ERROR_FAILED(err, "rfcomm_set_master", errno);
576 static int sco_bind(int sock, const bdaddr_t *src, GError **err)
578 struct sockaddr_sco addr;
580 memset(&addr, 0, sizeof(addr));
581 addr.sco_family = AF_BLUETOOTH;
582 bacpy(&addr.sco_bdaddr, src);
584 if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
585 ERROR_FAILED(err, "sco_bind", errno);
592 static int sco_connect(int sock, const bdaddr_t *dst)
594 struct sockaddr_sco addr;
597 memset(&addr, 0, sizeof(addr));
598 addr.sco_family = AF_BLUETOOTH;
599 bacpy(&addr.sco_bdaddr, dst);
601 err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
602 if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
608 static gboolean sco_set(int sock, uint16_t mtu, GError **err)
610 struct sco_options sco_opt;
616 len = sizeof(sco_opt);
617 memset(&sco_opt, 0, len);
618 if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) {
619 ERROR_FAILED(err, "getsockopt(SCO_OPTIONS)", errno);
624 if (setsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt,
625 sizeof(sco_opt)) < 0) {
626 ERROR_FAILED(err, "setsockopt(SCO_OPTIONS)", errno);
633 static gboolean parse_set_opts(struct set_opts *opts, GError **err,
634 BtIOOption opt1, va_list args)
636 BtIOOption opt = opt1;
639 memset(opts, 0, sizeof(*opts));
642 opts->defer = DEFAULT_DEFER_TIMEOUT;
644 opts->sec_level = BT_IO_SEC_MEDIUM;
645 opts->mode = L2CAP_MODE_BASIC;
647 while (opt != BT_IO_OPT_INVALID) {
649 case BT_IO_OPT_SOURCE:
650 str = va_arg(args, const char *);
651 if (strncasecmp(str, "hci", 3) == 0)
652 hci_devba(atoi(str + 3), &opts->src);
654 str2ba(str, &opts->src);
656 case BT_IO_OPT_SOURCE_BDADDR:
657 bacpy(&opts->src, va_arg(args, const bdaddr_t *));
660 str2ba(va_arg(args, const char *), &opts->dst);
662 case BT_IO_OPT_DEST_BDADDR:
663 bacpy(&opts->dst, va_arg(args, const bdaddr_t *));
665 case BT_IO_OPT_DEFER_TIMEOUT:
666 opts->defer = va_arg(args, int);
668 case BT_IO_OPT_SEC_LEVEL:
669 opts->sec_level = va_arg(args, int);
671 case BT_IO_OPT_CHANNEL:
672 opts->channel = va_arg(args, int);
675 opts->psm = va_arg(args, int);
678 opts->cid = va_arg(args, int);
681 opts->mtu = va_arg(args, int);
682 opts->imtu = opts->mtu;
683 opts->omtu = opts->mtu;
686 opts->omtu = va_arg(args, int);
688 opts->mtu = opts->omtu;
691 opts->imtu = va_arg(args, int);
693 opts->mtu = opts->imtu;
695 case BT_IO_OPT_MASTER:
696 opts->master = va_arg(args, gboolean);
699 opts->mode = va_arg(args, int);
702 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
703 "Unknown option %d", opt);
707 opt = va_arg(args, int);
713 static gboolean get_peers(int sock, struct sockaddr *src, struct sockaddr *dst,
714 socklen_t len, GError **err)
720 if (getsockname(sock, src, &olen) < 0) {
721 ERROR_FAILED(err, "getsockname", errno);
727 if (getpeername(sock, dst, &olen) < 0) {
728 ERROR_FAILED(err, "getpeername", errno);
735 static int l2cap_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
737 struct l2cap_conninfo info;
741 if (getsockopt(sock, SOL_L2CAP, L2CAP_CONNINFO, &info, &len) < 0)
745 *handle = info.hci_handle;
748 memcpy(dev_class, info.dev_class, 3);
753 static gboolean l2cap_get(int sock, GError **err, BtIOOption opt1,
756 BtIOOption opt = opt1;
757 struct sockaddr_l2 src, dst;
758 struct l2cap_options l2o;
760 uint8_t dev_class[3];
765 memset(&l2o, 0, len);
766 if (getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &len) < 0) {
767 ERROR_FAILED(err, "getsockopt(L2CAP_OPTIONS)", errno);
771 if (!get_peers(sock, (struct sockaddr *) &src,
772 (struct sockaddr *) &dst, sizeof(src), err))
775 while (opt != BT_IO_OPT_INVALID) {
777 case BT_IO_OPT_SOURCE:
778 ba2str(&src.l2_bdaddr, va_arg(args, char *));
780 case BT_IO_OPT_SOURCE_BDADDR:
781 bacpy(va_arg(args, bdaddr_t *), &src.l2_bdaddr);
784 ba2str(&dst.l2_bdaddr, va_arg(args, char *));
786 case BT_IO_OPT_DEST_BDADDR:
787 bacpy(va_arg(args, bdaddr_t *), &dst.l2_bdaddr);
789 case BT_IO_OPT_DEFER_TIMEOUT:
791 if (getsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
792 va_arg(args, int *), &len) < 0) {
793 ERROR_FAILED(err, "getsockopt(DEFER_SETUP)",
798 case BT_IO_OPT_SEC_LEVEL:
799 if (!get_sec_level(sock, BT_IO_L2CAP,
800 va_arg(args, int *), err))
804 *(va_arg(args, uint16_t *)) = src.l2_psm ?
805 src.l2_psm : dst.l2_psm;
808 *(va_arg(args, uint16_t *)) = src.l2_cid ?
809 src.l2_cid : dst.l2_cid;
812 *(va_arg(args, uint16_t *)) = l2o.omtu;
815 *(va_arg(args, uint16_t *)) = l2o.imtu;
817 case BT_IO_OPT_MASTER:
819 if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags,
821 ERROR_FAILED(err, "getsockopt(L2CAP_LM)",
825 *(va_arg(args, gboolean *)) =
826 (flags & L2CAP_LM_MASTER) ? TRUE : FALSE;
828 case BT_IO_OPT_HANDLE:
829 if (l2cap_get_info(sock, &handle, dev_class) < 0) {
830 ERROR_FAILED(err, "L2CAP_CONNINFO", errno);
833 *(va_arg(args, uint16_t *)) = handle;
835 case BT_IO_OPT_CLASS:
836 if (l2cap_get_info(sock, &handle, dev_class) < 0) {
837 ERROR_FAILED(err, "L2CAP_CONNINFO", errno);
840 memcpy(va_arg(args, uint8_t *), dev_class, 3);
843 *(va_arg(args, uint8_t *)) = l2o.mode;
846 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
847 "Unknown option %d", opt);
851 opt = va_arg(args, int);
857 static int rfcomm_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
859 struct rfcomm_conninfo info;
863 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_CONNINFO, &info, &len) < 0)
867 *handle = info.hci_handle;
870 memcpy(dev_class, info.dev_class, 3);
875 static gboolean rfcomm_get(int sock, GError **err, BtIOOption opt1,
878 BtIOOption opt = opt1;
879 struct sockaddr_rc src, dst;
882 uint8_t dev_class[3];
885 if (!get_peers(sock, (struct sockaddr *) &src,
886 (struct sockaddr *) &dst, sizeof(src), err))
889 while (opt != BT_IO_OPT_INVALID) {
891 case BT_IO_OPT_SOURCE:
892 ba2str(&src.rc_bdaddr, va_arg(args, char *));
894 case BT_IO_OPT_SOURCE_BDADDR:
895 bacpy(va_arg(args, bdaddr_t *), &src.rc_bdaddr);
898 ba2str(&dst.rc_bdaddr, va_arg(args, char *));
900 case BT_IO_OPT_DEST_BDADDR:
901 bacpy(va_arg(args, bdaddr_t *), &dst.rc_bdaddr);
903 case BT_IO_OPT_DEFER_TIMEOUT:
905 if (getsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
906 va_arg(args, int *), &len) < 0) {
907 ERROR_FAILED(err, "getsockopt(DEFER_SETUP)",
912 case BT_IO_OPT_SEC_LEVEL:
913 if (!get_sec_level(sock, BT_IO_RFCOMM,
914 va_arg(args, int *), err))
917 case BT_IO_OPT_CHANNEL:
918 *(va_arg(args, uint8_t *)) = src.rc_channel ?
919 src.rc_channel : dst.rc_channel;
921 case BT_IO_OPT_SOURCE_CHANNEL:
922 *(va_arg(args, uint8_t *)) = src.rc_channel;
924 case BT_IO_OPT_DEST_CHANNEL:
925 *(va_arg(args, uint8_t *)) = dst.rc_channel;
927 case BT_IO_OPT_MASTER:
929 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags,
931 ERROR_FAILED(err, "getsockopt(RFCOMM_LM)",
935 *(va_arg(args, gboolean *)) =
936 (flags & RFCOMM_LM_MASTER) ? TRUE : FALSE;
938 case BT_IO_OPT_HANDLE:
939 if (rfcomm_get_info(sock, &handle, dev_class) < 0) {
940 ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
943 *(va_arg(args, uint16_t *)) = handle;
945 case BT_IO_OPT_CLASS:
946 if (rfcomm_get_info(sock, &handle, dev_class) < 0) {
947 ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
950 memcpy(va_arg(args, uint8_t *), dev_class, 3);
953 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
954 "Unknown option %d", opt);
958 opt = va_arg(args, int);
964 static int sco_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
966 struct sco_conninfo info;
970 if (getsockopt(sock, SOL_SCO, SCO_CONNINFO, &info, &len) < 0)
974 *handle = info.hci_handle;
977 memcpy(dev_class, info.dev_class, 3);
982 static gboolean sco_get(int sock, GError **err, BtIOOption opt1, va_list args)
984 BtIOOption opt = opt1;
985 struct sockaddr_sco src, dst;
986 struct sco_options sco_opt;
988 uint8_t dev_class[3];
991 len = sizeof(sco_opt);
992 memset(&sco_opt, 0, len);
993 if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) {
994 ERROR_FAILED(err, "getsockopt(SCO_OPTIONS)", errno);
998 if (!get_peers(sock, (struct sockaddr *) &src,
999 (struct sockaddr *) &dst, sizeof(src), err))
1002 while (opt != BT_IO_OPT_INVALID) {
1004 case BT_IO_OPT_SOURCE:
1005 ba2str(&src.sco_bdaddr, va_arg(args, char *));
1007 case BT_IO_OPT_SOURCE_BDADDR:
1008 bacpy(va_arg(args, bdaddr_t *), &src.sco_bdaddr);
1010 case BT_IO_OPT_DEST:
1011 ba2str(&dst.sco_bdaddr, va_arg(args, char *));
1013 case BT_IO_OPT_DEST_BDADDR:
1014 bacpy(va_arg(args, bdaddr_t *), &dst.sco_bdaddr);
1017 case BT_IO_OPT_IMTU:
1018 case BT_IO_OPT_OMTU:
1019 *(va_arg(args, uint16_t *)) = sco_opt.mtu;
1021 case BT_IO_OPT_HANDLE:
1022 if (sco_get_info(sock, &handle, dev_class) < 0) {
1023 ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
1026 *(va_arg(args, uint16_t *)) = handle;
1028 case BT_IO_OPT_CLASS:
1029 if (sco_get_info(sock, &handle, dev_class) < 0) {
1030 ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
1033 memcpy(va_arg(args, uint8_t *), dev_class, 3);
1036 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1037 "Unknown option %d", opt);
1041 opt = va_arg(args, int);
1047 static gboolean get_valist(GIOChannel *io, BtIOType type, GError **err,
1048 BtIOOption opt1, va_list args)
1052 sock = g_io_channel_unix_get_fd(io);
1057 return l2cap_get(sock, err, opt1, args);
1059 return rfcomm_get(sock, err, opt1, args);
1061 return sco_get(sock, err, opt1, args);
1064 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1065 "Unknown BtIO type %d", type);
1069 gboolean bt_io_accept(GIOChannel *io, BtIOConnect connect, gpointer user_data,
1070 GDestroyNotify destroy, GError **err)
1076 sock = g_io_channel_unix_get_fd(io);
1078 memset(&pfd, 0, sizeof(pfd));
1080 pfd.events = POLLOUT;
1082 if (poll(&pfd, 1, 0) < 0) {
1083 ERROR_FAILED(err, "poll", errno);
1087 if (!(pfd.revents & POLLOUT)) {
1089 ret = read(sock, &c, 1);
1092 accept_add(io, connect, user_data, destroy);
1097 gboolean bt_io_set(GIOChannel *io, BtIOType type, GError **err,
1098 BtIOOption opt1, ...)
1102 struct set_opts opts;
1105 va_start(args, opt1);
1106 ret = parse_set_opts(&opts, err, opt1, args);
1112 sock = g_io_channel_unix_get_fd(io);
1117 return l2cap_set(sock, opts.sec_level, opts.imtu, opts.omtu,
1118 opts.mode, opts.master, err);
1120 return rfcomm_set(sock, opts.sec_level, opts.master, err);
1122 return sco_set(sock, opts.mtu, err);
1125 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1126 "Unknown BtIO type %d", type);
1130 gboolean bt_io_get(GIOChannel *io, BtIOType type, GError **err,
1131 BtIOOption opt1, ...)
1136 va_start(args, opt1);
1137 ret = get_valist(io, type, err, opt1, args);
1143 static GIOChannel *create_io(BtIOType type, gboolean server,
1144 struct set_opts *opts, GError **err)
1151 sock = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP);
1153 ERROR_FAILED(err, "socket(RAW, L2CAP)", errno);
1156 if (l2cap_bind(sock, &opts->src, server ? opts->psm : 0,
1157 opts->cid, err) < 0)
1159 if (!l2cap_set(sock, opts->sec_level, 0, 0, 0, -1, err))
1163 sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
1165 ERROR_FAILED(err, "socket(SEQPACKET, L2CAP)", errno);
1168 if (l2cap_bind(sock, &opts->src, server ? opts->psm : 0,
1169 opts->cid, err) < 0)
1171 if (!l2cap_set(sock, opts->sec_level, opts->imtu, opts->omtu,
1172 opts->mode, opts->master, err))
1176 sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
1178 ERROR_FAILED(err, "socket(STREAM, RFCOMM)", errno);
1181 if (rfcomm_bind(sock, &opts->src,
1182 server ? opts->channel : 0, err) < 0)
1184 if (!rfcomm_set(sock, opts->sec_level, opts->master, err))
1188 sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
1190 ERROR_FAILED(err, "socket(SEQPACKET, SCO)", errno);
1193 if (sco_bind(sock, &opts->src, err) < 0)
1195 if (!sco_set(sock, opts->mtu, err))
1199 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1200 "Unknown BtIO type %d", type);
1204 io = g_io_channel_unix_new(sock);
1206 g_io_channel_set_close_on_unref(io, TRUE);
1207 g_io_channel_set_flags(io, G_IO_FLAG_NONBLOCK, NULL);
1217 GIOChannel *bt_io_connect(BtIOType type, BtIOConnect connect,
1218 gpointer user_data, GDestroyNotify destroy,
1219 GError **gerr, BtIOOption opt1, ...)
1223 struct set_opts opts;
1227 va_start(args, opt1);
1228 ret = parse_set_opts(&opts, gerr, opt1, args);
1234 io = create_io(type, FALSE, &opts, gerr);
1238 sock = g_io_channel_unix_get_fd(io);
1242 err = l2cap_connect(sock, &opts.dst, 0, opts.cid);
1245 err = l2cap_connect(sock, &opts.dst, opts.psm, opts.cid);
1248 err = rfcomm_connect(sock, &opts.dst, opts.channel);
1251 err = sco_connect(sock, &opts.dst);
1254 g_set_error(gerr, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1255 "Unknown BtIO type %d", type);
1260 g_set_error(gerr, BT_IO_ERROR, BT_IO_ERROR_CONNECT_FAILED,
1261 "connect: %s (%d)", strerror(-err), -err);
1262 g_io_channel_unref(io);
1266 connect_add(io, connect, user_data, destroy);
1271 GIOChannel *bt_io_listen(BtIOType type, BtIOConnect connect,
1272 BtIOConfirm confirm, gpointer user_data,
1273 GDestroyNotify destroy, GError **err,
1274 BtIOOption opt1, ...)
1278 struct set_opts opts;
1282 if (type == BT_IO_L2RAW) {
1283 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1284 "Server L2CAP RAW sockets not supported");
1288 va_start(args, opt1);
1289 ret = parse_set_opts(&opts, err, opt1, args);
1295 io = create_io(type, TRUE, &opts, err);
1299 sock = g_io_channel_unix_get_fd(io);
1302 setsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP, &opts.defer,
1303 sizeof(opts.defer));
1305 if (listen(sock, 5) < 0) {
1306 ERROR_FAILED(err, "listen", errno);
1307 g_io_channel_unref(io);
1311 server_add(io, connect, confirm, user_data, destroy);
1316 GQuark bt_io_error_quark(void)
1318 return g_quark_from_static_string("bt-io-error-quark");