3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2009-2010 Marcel Holtmann <marcel@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>
42 #define BT_FLUSHABLE 8
45 #define ERROR_FAILED(gerr, str, err) \
46 g_set_error(gerr, BT_IO_ERROR, BT_IO_ERROR_FAILED, \
47 str ": %s (%d)", strerror(err), err)
49 #define DEFAULT_DEFER_TIMEOUT 30
71 GDestroyNotify destroy;
77 GDestroyNotify destroy;
84 GDestroyNotify destroy;
87 static void server_remove(struct server *server)
90 server->destroy(server->user_data);
94 static void connect_remove(struct connect *conn)
97 conn->destroy(conn->user_data);
101 static void accept_remove(struct accept *accept)
104 accept->destroy(accept->user_data);
108 static gboolean check_nval(GIOChannel *io)
112 memset(&fds, 0, sizeof(fds));
113 fds.fd = g_io_channel_unix_get_fd(io);
114 fds.events = POLLNVAL;
116 if (poll(&fds, 1, 0) > 0 && (fds.revents & POLLNVAL))
122 static gboolean accept_cb(GIOChannel *io, GIOCondition cond,
125 struct accept *accept = user_data;
128 /* If the user aborted this accept attempt */
129 if ((cond & G_IO_NVAL) || check_nval(io))
132 if (cond & (G_IO_HUP | G_IO_ERR))
133 g_set_error(&err, BT_IO_ERROR, BT_IO_ERROR_DISCONNECTED,
134 "HUP or ERR on socket");
136 accept->connect(io, err, accept->user_data);
143 static gboolean connect_cb(GIOChannel *io, GIOCondition cond,
146 struct connect *conn = user_data;
149 /* If the user aborted this connect attempt */
150 if ((cond & G_IO_NVAL) || check_nval(io))
153 if (cond & G_IO_OUT) {
154 int err, sk_err = 0, sock = g_io_channel_unix_get_fd(io);
155 socklen_t len = sizeof(sk_err);
157 if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &sk_err, &len) < 0)
163 g_set_error(&gerr, BT_IO_ERROR,
164 BT_IO_ERROR_CONNECT_FAILED, "%s (%d)",
165 strerror(-err), -err);
166 } else if (cond & (G_IO_HUP | G_IO_ERR))
167 g_set_error(&gerr, BT_IO_ERROR, BT_IO_ERROR_CONNECT_FAILED,
168 "HUP or ERR on socket");
170 conn->connect(io, gerr, conn->user_data);
178 static gboolean server_cb(GIOChannel *io, GIOCondition cond,
181 struct server *server = user_data;
182 int srv_sock, cli_sock;
185 /* If the user closed the server */
186 if ((cond & G_IO_NVAL) || check_nval(io))
189 srv_sock = g_io_channel_unix_get_fd(io);
191 cli_sock = accept(srv_sock, NULL, NULL);
195 cli_io = g_io_channel_unix_new(cli_sock);
197 g_io_channel_set_close_on_unref(cli_io, TRUE);
198 g_io_channel_set_flags(cli_io, G_IO_FLAG_NONBLOCK, NULL);
201 server->confirm(cli_io, server->user_data);
203 server->connect(cli_io, NULL, server->user_data);
205 g_io_channel_unref(cli_io);
210 static void server_add(GIOChannel *io, BtIOConnect connect,
211 BtIOConfirm confirm, gpointer user_data,
212 GDestroyNotify destroy)
214 struct server *server;
217 server = g_new0(struct server, 1);
218 server->connect = connect;
219 server->confirm = confirm;
220 server->user_data = user_data;
221 server->destroy = destroy;
223 cond = G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
224 g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, server_cb, server,
225 (GDestroyNotify) server_remove);
228 static void connect_add(GIOChannel *io, BtIOConnect connect,
229 gpointer user_data, GDestroyNotify destroy)
231 struct connect *conn;
234 conn = g_new0(struct connect, 1);
235 conn->connect = connect;
236 conn->user_data = user_data;
237 conn->destroy = destroy;
239 cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
240 g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, connect_cb, conn,
241 (GDestroyNotify) connect_remove);
244 static void accept_add(GIOChannel *io, BtIOConnect connect, gpointer user_data,
245 GDestroyNotify destroy)
247 struct accept *accept;
250 accept = g_new0(struct accept, 1);
251 accept->connect = connect;
252 accept->user_data = user_data;
253 accept->destroy = destroy;
255 cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
256 g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, accept_cb, accept,
257 (GDestroyNotify) accept_remove);
260 static int l2cap_bind(int sock, const bdaddr_t *src, uint16_t psm,
261 uint16_t cid, GError **err)
263 struct sockaddr_l2 addr;
265 memset(&addr, 0, sizeof(addr));
266 addr.l2_family = AF_BLUETOOTH;
267 bacpy(&addr.l2_bdaddr, src);
270 addr.l2_cid = htobs(cid);
272 addr.l2_psm = htobs(psm);
274 if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
276 ERROR_FAILED(err, "l2cap_bind", errno);
283 static int l2cap_connect(int sock, const bdaddr_t *dst,
284 uint16_t psm, uint16_t cid)
287 struct sockaddr_l2 addr;
289 memset(&addr, 0, sizeof(addr));
290 addr.l2_family = AF_BLUETOOTH;
291 bacpy(&addr.l2_bdaddr, dst);
293 addr.l2_cid = htobs(cid);
295 addr.l2_psm = htobs(psm);
297 err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
298 if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
304 static int l2cap_set_master(int sock, int master)
310 if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags, &len) < 0)
314 if (flags & L2CAP_LM_MASTER)
316 flags |= L2CAP_LM_MASTER;
318 if (!(flags & L2CAP_LM_MASTER))
320 flags &= ~L2CAP_LM_MASTER;
323 if (setsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags, sizeof(flags)) < 0)
329 static int rfcomm_set_master(int sock, int master)
335 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags, &len) < 0)
339 if (flags & RFCOMM_LM_MASTER)
341 flags |= RFCOMM_LM_MASTER;
343 if (!(flags & RFCOMM_LM_MASTER))
345 flags &= ~RFCOMM_LM_MASTER;
348 if (setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags, sizeof(flags)) < 0)
354 static int l2cap_set_lm(int sock, int level)
359 L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT,
360 L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT | L2CAP_LM_SECURE,
361 }, opt = lm_map[level];
363 if (setsockopt(sock, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)) < 0)
369 static int rfcomm_set_lm(int sock, int level)
374 RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT,
375 RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT | RFCOMM_LM_SECURE,
376 }, opt = lm_map[level];
378 if (setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, sizeof(opt)) < 0)
384 static gboolean set_sec_level(int sock, BtIOType type, int level, GError **err)
386 struct bt_security sec;
389 if (level < BT_SECURITY_LOW || level > BT_SECURITY_HIGH) {
390 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
391 "Valid security level range is %d-%d",
392 BT_SECURITY_LOW, BT_SECURITY_HIGH);
396 memset(&sec, 0, sizeof(sec));
399 if (setsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec,
403 if (errno != ENOPROTOOPT) {
404 ERROR_FAILED(err, "setsockopt(BT_SECURITY)", errno);
408 if (type == BT_IO_L2CAP)
409 ret = l2cap_set_lm(sock, level);
411 ret = rfcomm_set_lm(sock, level);
414 ERROR_FAILED(err, "setsockopt(LM)", -ret);
421 static int l2cap_get_lm(int sock, int *sec_level)
427 if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &opt, &len) < 0)
432 if (opt & L2CAP_LM_AUTH)
433 *sec_level = BT_SECURITY_LOW;
434 if (opt & L2CAP_LM_ENCRYPT)
435 *sec_level = BT_SECURITY_MEDIUM;
436 if (opt & L2CAP_LM_SECURE)
437 *sec_level = BT_SECURITY_HIGH;
442 static int rfcomm_get_lm(int sock, int *sec_level)
448 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, &len) < 0)
453 if (opt & RFCOMM_LM_AUTH)
454 *sec_level = BT_SECURITY_LOW;
455 if (opt & RFCOMM_LM_ENCRYPT)
456 *sec_level = BT_SECURITY_MEDIUM;
457 if (opt & RFCOMM_LM_SECURE)
458 *sec_level = BT_SECURITY_HIGH;
463 static gboolean get_sec_level(int sock, BtIOType type, int *level,
466 struct bt_security sec;
470 memset(&sec, 0, sizeof(sec));
472 if (getsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec, &len) == 0) {
477 if (errno != ENOPROTOOPT) {
478 ERROR_FAILED(err, "getsockopt(BT_SECURITY)", errno);
482 if (type == BT_IO_L2CAP)
483 ret = l2cap_get_lm(sock, level);
485 ret = rfcomm_get_lm(sock, level);
488 ERROR_FAILED(err, "getsockopt(LM)", -ret);
495 static int l2cap_set_flushable(int sock, gboolean flushable)
500 if (setsockopt(sock, SOL_BLUETOOTH, BT_FLUSHABLE, &f, sizeof(f)) < 0)
506 static int set_priority(int sock, uint32_t prio)
508 if (setsockopt(sock, SOL_SOCKET, SO_PRIORITY, &prio, sizeof(prio)) < 0)
514 static gboolean get_key_size(int sock, int *size, GError **err)
516 struct bt_security sec;
519 memset(&sec, 0, sizeof(sec));
521 if (getsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec, &len) == 0) {
522 *size = sec.key_size;
529 static gboolean l2cap_set(int sock, int sec_level, uint16_t imtu,
530 uint16_t omtu, uint8_t mode, int master,
531 int flushable, uint32_t priority, GError **err)
533 if (imtu || omtu || mode) {
534 struct l2cap_options l2o;
537 memset(&l2o, 0, sizeof(l2o));
539 if (getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o,
541 ERROR_FAILED(err, "getsockopt(L2CAP_OPTIONS)", errno);
552 if (setsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o,
554 ERROR_FAILED(err, "setsockopt(L2CAP_OPTIONS)", errno);
559 if (master >= 0 && l2cap_set_master(sock, master) < 0) {
560 ERROR_FAILED(err, "l2cap_set_master", errno);
564 if (flushable >= 0 && l2cap_set_flushable(sock, flushable) < 0) {
565 ERROR_FAILED(err, "l2cap_set_flushable", errno);
569 if (priority > 0 && set_priority(sock, priority) < 0) {
570 ERROR_FAILED(err, "set_priority", errno);
574 if (sec_level && !set_sec_level(sock, BT_IO_L2CAP, sec_level, err))
580 static int rfcomm_bind(int sock,
581 const bdaddr_t *src, uint8_t channel, GError **err)
583 struct sockaddr_rc addr;
585 memset(&addr, 0, sizeof(addr));
586 addr.rc_family = AF_BLUETOOTH;
587 bacpy(&addr.rc_bdaddr, src);
588 addr.rc_channel = channel;
590 if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
592 ERROR_FAILED(err, "rfcomm_bind", errno);
599 static int rfcomm_connect(int sock, const bdaddr_t *dst, uint8_t channel)
602 struct sockaddr_rc addr;
604 memset(&addr, 0, sizeof(addr));
605 addr.rc_family = AF_BLUETOOTH;
606 bacpy(&addr.rc_bdaddr, dst);
607 addr.rc_channel = channel;
609 err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
610 if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
616 static gboolean rfcomm_set(int sock, int sec_level, int master, GError **err)
618 if (sec_level && !set_sec_level(sock, BT_IO_RFCOMM, sec_level, err))
621 if (master >= 0 && rfcomm_set_master(sock, master) < 0) {
622 ERROR_FAILED(err, "rfcomm_set_master", errno);
629 static int sco_bind(int sock, const bdaddr_t *src, GError **err)
631 struct sockaddr_sco addr;
633 memset(&addr, 0, sizeof(addr));
634 addr.sco_family = AF_BLUETOOTH;
635 bacpy(&addr.sco_bdaddr, src);
637 if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
639 ERROR_FAILED(err, "sco_bind", errno);
646 static int sco_connect(int sock, const bdaddr_t *dst)
648 struct sockaddr_sco addr;
651 memset(&addr, 0, sizeof(addr));
652 addr.sco_family = AF_BLUETOOTH;
653 bacpy(&addr.sco_bdaddr, dst);
655 err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
656 if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
662 static gboolean sco_set(int sock, uint16_t mtu, GError **err)
664 struct sco_options sco_opt;
670 len = sizeof(sco_opt);
671 memset(&sco_opt, 0, len);
672 if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) {
673 ERROR_FAILED(err, "getsockopt(SCO_OPTIONS)", errno);
678 if (setsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt,
679 sizeof(sco_opt)) < 0) {
680 ERROR_FAILED(err, "setsockopt(SCO_OPTIONS)", errno);
687 static gboolean parse_set_opts(struct set_opts *opts, GError **err,
688 BtIOOption opt1, va_list args)
690 BtIOOption opt = opt1;
693 memset(opts, 0, sizeof(*opts));
696 opts->defer = DEFAULT_DEFER_TIMEOUT;
698 opts->mode = L2CAP_MODE_BASIC;
699 opts->flushable = -1;
702 while (opt != BT_IO_OPT_INVALID) {
704 case BT_IO_OPT_SOURCE:
705 str = va_arg(args, const char *);
706 str2ba(str, &opts->src);
708 case BT_IO_OPT_SOURCE_BDADDR:
709 bacpy(&opts->src, va_arg(args, const bdaddr_t *));
712 str2ba(va_arg(args, const char *), &opts->dst);
714 case BT_IO_OPT_DEST_BDADDR:
715 bacpy(&opts->dst, va_arg(args, const bdaddr_t *));
717 case BT_IO_OPT_DEFER_TIMEOUT:
718 opts->defer = va_arg(args, int);
720 case BT_IO_OPT_SEC_LEVEL:
721 opts->sec_level = va_arg(args, int);
723 case BT_IO_OPT_CHANNEL:
724 opts->channel = va_arg(args, int);
727 opts->psm = va_arg(args, int);
730 opts->cid = va_arg(args, int);
733 opts->mtu = va_arg(args, int);
734 opts->imtu = opts->mtu;
735 opts->omtu = opts->mtu;
738 opts->omtu = va_arg(args, int);
740 opts->mtu = opts->omtu;
743 opts->imtu = va_arg(args, int);
745 opts->mtu = opts->imtu;
747 case BT_IO_OPT_MASTER:
748 opts->master = va_arg(args, gboolean);
751 opts->mode = va_arg(args, int);
753 case BT_IO_OPT_FLUSHABLE:
754 opts->flushable = va_arg(args, gboolean);
756 case BT_IO_OPT_PRIORITY:
757 opts->priority = va_arg(args, int);
760 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
761 "Unknown option %d", opt);
765 opt = va_arg(args, int);
771 static gboolean get_peers(int sock, struct sockaddr *src, struct sockaddr *dst,
772 socklen_t len, GError **err)
778 if (getsockname(sock, src, &olen) < 0) {
779 ERROR_FAILED(err, "getsockname", errno);
785 if (getpeername(sock, dst, &olen) < 0) {
786 ERROR_FAILED(err, "getpeername", errno);
793 static int l2cap_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
795 struct l2cap_conninfo info;
799 if (getsockopt(sock, SOL_L2CAP, L2CAP_CONNINFO, &info, &len) < 0)
803 *handle = info.hci_handle;
806 memcpy(dev_class, info.dev_class, 3);
811 static int l2cap_get_flushable(int sock, gboolean *flushable)
818 if (getsockopt(sock, SOL_BLUETOOTH, BT_FLUSHABLE, &f, &len) < 0)
829 static int get_priority(int sock, uint32_t *prio)
834 if (getsockopt(sock, SOL_SOCKET, SO_PRIORITY, prio, &len) < 0)
840 static gboolean l2cap_get(int sock, GError **err, BtIOOption opt1,
843 BtIOOption opt = opt1;
844 struct sockaddr_l2 src, dst;
845 struct l2cap_options l2o;
847 uint8_t dev_class[3];
850 gboolean flushable = FALSE;
854 memset(&l2o, 0, len);
855 if (getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &len) < 0) {
856 ERROR_FAILED(err, "getsockopt(L2CAP_OPTIONS)", errno);
860 if (!get_peers(sock, (struct sockaddr *) &src,
861 (struct sockaddr *) &dst, sizeof(src), err))
864 while (opt != BT_IO_OPT_INVALID) {
866 case BT_IO_OPT_SOURCE:
867 ba2str(&src.l2_bdaddr, va_arg(args, char *));
869 case BT_IO_OPT_SOURCE_BDADDR:
870 bacpy(va_arg(args, bdaddr_t *), &src.l2_bdaddr);
873 ba2str(&dst.l2_bdaddr, va_arg(args, char *));
875 case BT_IO_OPT_DEST_BDADDR:
876 bacpy(va_arg(args, bdaddr_t *), &dst.l2_bdaddr);
878 case BT_IO_OPT_DEFER_TIMEOUT:
880 if (getsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
881 va_arg(args, int *), &len) < 0) {
882 ERROR_FAILED(err, "getsockopt(DEFER_SETUP)",
887 case BT_IO_OPT_SEC_LEVEL:
888 if (!get_sec_level(sock, BT_IO_L2CAP,
889 va_arg(args, int *), err))
892 case BT_IO_OPT_KEY_SIZE:
893 if (!get_key_size(sock, va_arg(args, int *), err))
897 *(va_arg(args, uint16_t *)) = src.l2_psm ?
898 btohs(src.l2_psm) : btohs(dst.l2_psm);
901 *(va_arg(args, uint16_t *)) = src.l2_cid ?
902 btohs(src.l2_cid) : btohs(dst.l2_cid);
905 *(va_arg(args, uint16_t *)) = l2o.omtu;
908 *(va_arg(args, uint16_t *)) = l2o.imtu;
910 case BT_IO_OPT_MASTER:
912 if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags,
914 ERROR_FAILED(err, "getsockopt(L2CAP_LM)",
918 *(va_arg(args, gboolean *)) =
919 (flags & L2CAP_LM_MASTER) ? TRUE : FALSE;
921 case BT_IO_OPT_HANDLE:
922 if (l2cap_get_info(sock, &handle, dev_class) < 0) {
923 ERROR_FAILED(err, "L2CAP_CONNINFO", errno);
926 *(va_arg(args, uint16_t *)) = handle;
928 case BT_IO_OPT_CLASS:
929 if (l2cap_get_info(sock, &handle, dev_class) < 0) {
930 ERROR_FAILED(err, "L2CAP_CONNINFO", errno);
933 memcpy(va_arg(args, uint8_t *), dev_class, 3);
936 *(va_arg(args, uint8_t *)) = l2o.mode;
938 case BT_IO_OPT_FLUSHABLE:
939 if (l2cap_get_flushable(sock, &flushable) < 0) {
940 ERROR_FAILED(err, "get_flushable", errno);
943 *(va_arg(args, gboolean *)) = flushable;
945 case BT_IO_OPT_PRIORITY:
946 if (get_priority(sock, &priority) < 0) {
947 ERROR_FAILED(err, "get_priority", errno);
950 *(va_arg(args, uint32_t *)) = priority;
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 rfcomm_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
966 struct rfcomm_conninfo info;
970 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_CONNINFO, &info, &len) < 0)
974 *handle = info.hci_handle;
977 memcpy(dev_class, info.dev_class, 3);
982 static gboolean rfcomm_get(int sock, GError **err, BtIOOption opt1,
985 BtIOOption opt = opt1;
986 struct sockaddr_rc src, dst;
989 uint8_t dev_class[3];
992 if (!get_peers(sock, (struct sockaddr *) &src,
993 (struct sockaddr *) &dst, sizeof(src), err))
996 while (opt != BT_IO_OPT_INVALID) {
998 case BT_IO_OPT_SOURCE:
999 ba2str(&src.rc_bdaddr, va_arg(args, char *));
1001 case BT_IO_OPT_SOURCE_BDADDR:
1002 bacpy(va_arg(args, bdaddr_t *), &src.rc_bdaddr);
1004 case BT_IO_OPT_DEST:
1005 ba2str(&dst.rc_bdaddr, va_arg(args, char *));
1007 case BT_IO_OPT_DEST_BDADDR:
1008 bacpy(va_arg(args, bdaddr_t *), &dst.rc_bdaddr);
1010 case BT_IO_OPT_DEFER_TIMEOUT:
1012 if (getsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
1013 va_arg(args, int *), &len) < 0) {
1014 ERROR_FAILED(err, "getsockopt(DEFER_SETUP)",
1019 case BT_IO_OPT_SEC_LEVEL:
1020 if (!get_sec_level(sock, BT_IO_RFCOMM,
1021 va_arg(args, int *), err))
1024 case BT_IO_OPT_CHANNEL:
1025 *(va_arg(args, uint8_t *)) = src.rc_channel ?
1026 src.rc_channel : dst.rc_channel;
1028 case BT_IO_OPT_SOURCE_CHANNEL:
1029 *(va_arg(args, uint8_t *)) = src.rc_channel;
1031 case BT_IO_OPT_DEST_CHANNEL:
1032 *(va_arg(args, uint8_t *)) = dst.rc_channel;
1034 case BT_IO_OPT_MASTER:
1035 len = sizeof(flags);
1036 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags,
1038 ERROR_FAILED(err, "getsockopt(RFCOMM_LM)",
1042 *(va_arg(args, gboolean *)) =
1043 (flags & RFCOMM_LM_MASTER) ? TRUE : FALSE;
1045 case BT_IO_OPT_HANDLE:
1046 if (rfcomm_get_info(sock, &handle, dev_class) < 0) {
1047 ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
1050 *(va_arg(args, uint16_t *)) = handle;
1052 case BT_IO_OPT_CLASS:
1053 if (rfcomm_get_info(sock, &handle, dev_class) < 0) {
1054 ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
1057 memcpy(va_arg(args, uint8_t *), dev_class, 3);
1060 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1061 "Unknown option %d", opt);
1065 opt = va_arg(args, int);
1071 static int sco_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
1073 struct sco_conninfo info;
1077 if (getsockopt(sock, SOL_SCO, SCO_CONNINFO, &info, &len) < 0)
1081 *handle = info.hci_handle;
1084 memcpy(dev_class, info.dev_class, 3);
1089 static gboolean sco_get(int sock, GError **err, BtIOOption opt1, va_list args)
1091 BtIOOption opt = opt1;
1092 struct sockaddr_sco src, dst;
1093 struct sco_options sco_opt;
1095 uint8_t dev_class[3];
1098 len = sizeof(sco_opt);
1099 memset(&sco_opt, 0, len);
1100 if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) {
1101 ERROR_FAILED(err, "getsockopt(SCO_OPTIONS)", errno);
1105 if (!get_peers(sock, (struct sockaddr *) &src,
1106 (struct sockaddr *) &dst, sizeof(src), err))
1109 while (opt != BT_IO_OPT_INVALID) {
1111 case BT_IO_OPT_SOURCE:
1112 ba2str(&src.sco_bdaddr, va_arg(args, char *));
1114 case BT_IO_OPT_SOURCE_BDADDR:
1115 bacpy(va_arg(args, bdaddr_t *), &src.sco_bdaddr);
1117 case BT_IO_OPT_DEST:
1118 ba2str(&dst.sco_bdaddr, va_arg(args, char *));
1120 case BT_IO_OPT_DEST_BDADDR:
1121 bacpy(va_arg(args, bdaddr_t *), &dst.sco_bdaddr);
1124 case BT_IO_OPT_IMTU:
1125 case BT_IO_OPT_OMTU:
1126 *(va_arg(args, uint16_t *)) = sco_opt.mtu;
1128 case BT_IO_OPT_HANDLE:
1129 if (sco_get_info(sock, &handle, dev_class) < 0) {
1130 ERROR_FAILED(err, "SCO_CONNINFO", errno);
1133 *(va_arg(args, uint16_t *)) = handle;
1135 case BT_IO_OPT_CLASS:
1136 if (sco_get_info(sock, &handle, dev_class) < 0) {
1137 ERROR_FAILED(err, "SCO_CONNINFO", errno);
1140 memcpy(va_arg(args, uint8_t *), dev_class, 3);
1143 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1144 "Unknown option %d", opt);
1148 opt = va_arg(args, int);
1154 static gboolean get_valist(GIOChannel *io, BtIOType type, GError **err,
1155 BtIOOption opt1, va_list args)
1159 sock = g_io_channel_unix_get_fd(io);
1165 return l2cap_get(sock, err, opt1, args);
1167 return rfcomm_get(sock, err, opt1, args);
1169 return sco_get(sock, err, opt1, args);
1172 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1173 "Unknown BtIO type %d", type);
1177 gboolean bt_io_accept(GIOChannel *io, BtIOConnect connect, gpointer user_data,
1178 GDestroyNotify destroy, GError **err)
1184 sock = g_io_channel_unix_get_fd(io);
1186 memset(&pfd, 0, sizeof(pfd));
1188 pfd.events = POLLOUT;
1190 if (poll(&pfd, 1, 0) < 0) {
1191 ERROR_FAILED(err, "poll", errno);
1195 if (!(pfd.revents & POLLOUT)) {
1196 if (read(sock, &c, 1) < 0) {
1197 ERROR_FAILED(err, "read", errno);
1202 accept_add(io, connect, user_data, destroy);
1207 gboolean bt_io_set(GIOChannel *io, BtIOType type, GError **err,
1208 BtIOOption opt1, ...)
1212 struct set_opts opts;
1215 va_start(args, opt1);
1216 ret = parse_set_opts(&opts, err, opt1, args);
1222 sock = g_io_channel_unix_get_fd(io);
1228 return l2cap_set(sock, opts.sec_level, opts.imtu, opts.omtu,
1229 opts.mode, opts.master, opts.flushable,
1230 opts.priority, err);
1232 return rfcomm_set(sock, opts.sec_level, opts.master, err);
1234 return sco_set(sock, opts.mtu, err);
1237 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1238 "Unknown BtIO type %d", type);
1242 gboolean bt_io_get(GIOChannel *io, BtIOType type, GError **err,
1243 BtIOOption opt1, ...)
1248 va_start(args, opt1);
1249 ret = get_valist(io, type, err, opt1, args);
1255 static GIOChannel *create_io(BtIOType type, gboolean server,
1256 struct set_opts *opts, GError **err)
1263 sock = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP);
1265 ERROR_FAILED(err, "socket(RAW, L2CAP)", errno);
1268 if (l2cap_bind(sock, &opts->src, server ? opts->psm : 0,
1269 opts->cid, err) < 0)
1271 if (!l2cap_set(sock, opts->sec_level, 0, 0, 0, -1, -1, 0, err))
1275 sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
1277 ERROR_FAILED(err, "socket(SEQPACKET, L2CAP)", errno);
1280 if (l2cap_bind(sock, &opts->src, server ? opts->psm : 0,
1281 opts->cid, err) < 0)
1283 if (!l2cap_set(sock, opts->sec_level, opts->imtu, opts->omtu,
1284 opts->mode, opts->master, opts->flushable,
1285 opts->priority, err))
1289 sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_L2CAP);
1291 ERROR_FAILED(err, "socket(STREAM, L2CAP)", errno);
1294 if (l2cap_bind(sock, &opts->src, server ? opts->psm : 0,
1295 opts->cid, err) < 0)
1297 if (!l2cap_set(sock, opts->sec_level, opts->imtu, opts->omtu,
1298 opts->mode, opts->master, opts->flushable,
1299 opts->priority, err))
1303 sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
1305 ERROR_FAILED(err, "socket(STREAM, RFCOMM)", errno);
1308 if (rfcomm_bind(sock, &opts->src,
1309 server ? opts->channel : 0, err) < 0)
1311 if (!rfcomm_set(sock, opts->sec_level, opts->master, err))
1315 sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
1317 ERROR_FAILED(err, "socket(SEQPACKET, SCO)", errno);
1320 if (sco_bind(sock, &opts->src, err) < 0)
1322 if (!sco_set(sock, opts->mtu, err))
1326 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1327 "Unknown BtIO type %d", type);
1331 io = g_io_channel_unix_new(sock);
1333 g_io_channel_set_close_on_unref(io, TRUE);
1334 g_io_channel_set_flags(io, G_IO_FLAG_NONBLOCK, NULL);
1344 GIOChannel *bt_io_connect(BtIOType type, BtIOConnect connect,
1345 gpointer user_data, GDestroyNotify destroy,
1346 GError **gerr, BtIOOption opt1, ...)
1350 struct set_opts opts;
1354 va_start(args, opt1);
1355 ret = parse_set_opts(&opts, gerr, opt1, args);
1361 io = create_io(type, FALSE, &opts, gerr);
1365 sock = g_io_channel_unix_get_fd(io);
1369 err = l2cap_connect(sock, &opts.dst, 0, opts.cid);
1373 err = l2cap_connect(sock, &opts.dst, opts.psm, opts.cid);
1376 err = rfcomm_connect(sock, &opts.dst, opts.channel);
1379 err = sco_connect(sock, &opts.dst);
1382 g_set_error(gerr, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1383 "Unknown BtIO type %d", type);
1388 g_set_error(gerr, BT_IO_ERROR, BT_IO_ERROR_CONNECT_FAILED,
1389 "connect: %s (%d)", strerror(-err), -err);
1390 g_io_channel_unref(io);
1394 connect_add(io, connect, user_data, destroy);
1399 GIOChannel *bt_io_listen(BtIOType type, BtIOConnect connect,
1400 BtIOConfirm confirm, gpointer user_data,
1401 GDestroyNotify destroy, GError **err,
1402 BtIOOption opt1, ...)
1406 struct set_opts opts;
1410 if (type == BT_IO_L2RAW) {
1411 g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
1412 "Server L2CAP RAW sockets not supported");
1416 va_start(args, opt1);
1417 ret = parse_set_opts(&opts, err, opt1, args);
1423 io = create_io(type, TRUE, &opts, err);
1427 sock = g_io_channel_unix_get_fd(io);
1430 setsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP, &opts.defer,
1431 sizeof(opts.defer));
1433 if (listen(sock, 5) < 0) {
1434 ERROR_FAILED(err, "listen", errno);
1435 g_io_channel_unref(io);
1439 server_add(io, connect, confirm, user_data, destroy);
1444 GQuark bt_io_error_quark(void)
1446 return g_quark_from_static_string("bt-io-error-quark");