Home | History | Annotate | Download | only in common
      1 /*
      2  *
      3  *  BlueZ - Bluetooth protocol stack for Linux
      4  *
      5  *  Copyright (C) 2009  Marcel Holtmann <marcel (at) holtmann.org>
      6  *  Copyright (C) 2009  Nokia Corporation
      7  *
      8  *
      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.
     13  *
     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.
     18  *
     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
     22  *
     23  */
     24 #include <stdarg.h>
     25 #include <stdlib.h>
     26 #include <unistd.h>
     27 #include <errno.h>
     28 #include <poll.h>
     29 #include <sys/types.h>
     30 #include <sys/socket.h>
     31 
     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>
     38 
     39 #include <glib.h>
     40 
     41 #include "logging.h"
     42 #include "btio.h"
     43 
     44 #define ERROR_FAILED(gerr, str, err) \
     45 		g_set_error(gerr, BT_IO_ERROR, BT_IO_ERROR_FAILED, \
     46 				str ": %s (%d)", strerror(err), err)
     47 
     48 #define DEFAULT_DEFER_TIMEOUT 30
     49 
     50 struct set_opts {
     51 	bdaddr_t src;
     52 	bdaddr_t dst;
     53 	int defer;
     54 	int sec_level;
     55 	uint8_t channel;
     56 	uint16_t psm;
     57 	uint16_t mtu;
     58 	uint16_t imtu;
     59 	uint16_t omtu;
     60 	int master;
     61 };
     62 
     63 struct connect {
     64 	BtIOConnect connect;
     65 	gpointer user_data;
     66 	GDestroyNotify destroy;
     67 };
     68 
     69 struct accept {
     70 	BtIOConnect connect;
     71 	gpointer user_data;
     72 	GDestroyNotify destroy;
     73 };
     74 
     75 struct server {
     76 	BtIOConnect connect;
     77 	BtIOConfirm confirm;
     78 	gpointer user_data;
     79 	GDestroyNotify destroy;
     80 };
     81 
     82 static void server_remove(struct server *server)
     83 {
     84 	if (server->destroy)
     85 		server->destroy(server->user_data);
     86 	g_free(server);
     87 }
     88 
     89 static void connect_remove(struct connect *conn)
     90 {
     91 	if (conn->destroy)
     92 		conn->destroy(conn->user_data);
     93 	g_free(conn);
     94 }
     95 
     96 static void accept_remove(struct accept *accept)
     97 {
     98 	if (accept->destroy)
     99 		accept->destroy(accept->user_data);
    100 	g_free(accept);
    101 }
    102 
    103 static gboolean check_nval(GIOChannel *io)
    104 {
    105 	struct pollfd fds;
    106 
    107 	memset(&fds, 0, sizeof(fds));
    108 	fds.fd = g_io_channel_unix_get_fd(io);
    109 	fds.events = POLLNVAL;
    110 
    111 	if (poll(&fds, 1, 0) > 0 && (fds.revents & POLLNVAL))
    112 		return TRUE;
    113 
    114 	return FALSE;
    115 }
    116 
    117 static gboolean accept_cb(GIOChannel *io, GIOCondition cond,
    118 							gpointer user_data)
    119 {
    120 	struct accept *accept = user_data;
    121 	GError *err = NULL;
    122 
    123 	/* If the user aborted this accept attempt */
    124 	if ((cond & G_IO_NVAL) || check_nval(io))
    125 		return FALSE;
    126 
    127 	if (cond & (G_IO_HUP | G_IO_ERR))
    128 		g_set_error(&err, BT_IO_ERROR, BT_IO_ERROR_DISCONNECTED,
    129 				"HUP or ERR on socket");
    130 
    131 	accept->connect(io, err, accept->user_data);
    132 
    133 	g_clear_error(&err);
    134 
    135 	return FALSE;
    136 }
    137 
    138 static gboolean connect_cb(GIOChannel *io, GIOCondition cond,
    139 							gpointer user_data)
    140 {
    141 	struct connect *conn = user_data;
    142 	GError *gerr = NULL;
    143 
    144 	/* If the user aborted this connect attempt */
    145 	if ((cond & G_IO_NVAL) || check_nval(io))
    146 		return FALSE;
    147 
    148 	if (cond & G_IO_OUT) {
    149 		int err = 0, sock = g_io_channel_unix_get_fd(io);
    150 		socklen_t len = sizeof(err);
    151 
    152 		if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &err, &len) < 0)
    153 			err = errno;
    154 
    155 		if (err)
    156 			g_set_error(&gerr, BT_IO_ERROR,
    157 					BT_IO_ERROR_CONNECT_FAILED, "%s (%d)",
    158 					strerror(err), err);
    159 	} else if (cond & (G_IO_HUP | G_IO_ERR))
    160 		g_set_error(&gerr, BT_IO_ERROR, BT_IO_ERROR_CONNECT_FAILED,
    161 				"HUP or ERR on socket");
    162 
    163 	conn->connect(io, gerr, conn->user_data);
    164 
    165 	if (gerr)
    166 		g_error_free(gerr);
    167 
    168 	return FALSE;
    169 }
    170 
    171 static gboolean server_cb(GIOChannel *io, GIOCondition cond,
    172 							gpointer user_data)
    173 {
    174 	struct server *server = user_data;
    175 	int srv_sock, cli_sock;
    176 	GIOChannel *cli_io;
    177 
    178 	/* If the user closed the server */
    179 	if ((cond & G_IO_NVAL) || check_nval(io))
    180 		return FALSE;
    181 
    182 	srv_sock = g_io_channel_unix_get_fd(io);
    183 
    184 	cli_sock = accept(srv_sock, NULL, NULL);
    185 	if (cli_sock < 0) {
    186 		error("accept: %s (%d)", strerror(errno), errno);
    187 		return TRUE;
    188 	}
    189 
    190 	cli_io = g_io_channel_unix_new(cli_sock);
    191 
    192 	g_io_channel_set_close_on_unref(cli_io, TRUE);
    193 	g_io_channel_set_flags(cli_io, G_IO_FLAG_NONBLOCK, NULL);
    194 
    195 	if (server->confirm)
    196 		server->confirm(cli_io, server->user_data);
    197 	else
    198 		server->connect(cli_io, NULL, server->user_data);
    199 
    200 	g_io_channel_unref(cli_io);
    201 
    202 	return TRUE;
    203 }
    204 
    205 static void server_add(GIOChannel *io, BtIOConnect connect,
    206 				BtIOConfirm confirm, gpointer user_data,
    207 				GDestroyNotify destroy)
    208 {
    209 	struct server *server;
    210 	GIOCondition cond;
    211 
    212 	server = g_new0(struct server, 1);
    213 	server->connect = connect;
    214 	server->confirm = confirm;
    215 	server->user_data = user_data;
    216 	server->destroy = destroy;
    217 
    218 	cond = G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
    219 	g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, server_cb, server,
    220 					(GDestroyNotify) server_remove);
    221 }
    222 
    223 static void connect_add(GIOChannel *io, BtIOConnect connect,
    224 				gpointer user_data, GDestroyNotify destroy)
    225 {
    226 	struct connect *conn;
    227 	GIOCondition cond;
    228 
    229 	conn = g_new0(struct connect, 1);
    230 	conn->connect = connect;
    231 	conn->user_data = user_data;
    232 	conn->destroy = destroy;
    233 
    234 	cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
    235 	g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, connect_cb, conn,
    236 					(GDestroyNotify) connect_remove);
    237 }
    238 
    239 static void accept_add(GIOChannel *io, BtIOConnect connect, gpointer user_data,
    240 							GDestroyNotify destroy)
    241 {
    242 	struct accept *accept;
    243 	GIOCondition cond;
    244 
    245 	accept = g_new0(struct accept, 1);
    246 	accept->connect = connect;
    247 	accept->user_data = user_data;
    248 	accept->destroy = destroy;
    249 
    250 	cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
    251 	g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, accept_cb, accept,
    252 					(GDestroyNotify) accept_remove);
    253 }
    254 
    255 static int l2cap_bind(int sock, const bdaddr_t *src, uint16_t psm)
    256 {
    257 	struct sockaddr_l2 addr;
    258 
    259 	memset(&addr, 0, sizeof(addr));
    260 	addr.l2_family = AF_BLUETOOTH;
    261 	bacpy(&addr.l2_bdaddr, src);
    262 	addr.l2_psm = htobs(psm);
    263 
    264 	return bind(sock, (struct sockaddr *) &addr, sizeof(addr));
    265 }
    266 
    267 static int l2cap_connect(int sock, const bdaddr_t *dst, uint16_t psm)
    268 {
    269 	int err;
    270 	struct sockaddr_l2 addr;
    271 
    272 	memset(&addr, 0, sizeof(addr));
    273 	addr.l2_family = AF_BLUETOOTH;
    274 	bacpy(&addr.l2_bdaddr, dst);
    275 	addr.l2_psm = htobs(psm);
    276 
    277 	err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
    278 	if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
    279 		return err;
    280 
    281 	return 0;
    282 }
    283 
    284 static int l2cap_set_master(int sock, int master)
    285 {
    286 	int flags;
    287 	socklen_t len;
    288 
    289 	len = sizeof(flags);
    290 	if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags, &len) < 0)
    291 		return -errno;
    292 
    293 	if (master) {
    294 		if (flags & L2CAP_LM_MASTER)
    295 			return 0;
    296 		flags |= L2CAP_LM_MASTER;
    297 	} else {
    298 		if (!(flags & L2CAP_LM_MASTER))
    299 			return 0;
    300 		flags &= ~L2CAP_LM_MASTER;
    301 	}
    302 
    303 	if (setsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags, sizeof(flags)) < 0)
    304 		return -errno;
    305 
    306 	return 0;
    307 }
    308 
    309 static int rfcomm_set_master(int sock, int master)
    310 {
    311 	int flags;
    312 	socklen_t len;
    313 
    314 	len = sizeof(flags);
    315 	if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags, &len) < 0)
    316 		return -errno;
    317 
    318 	if (master) {
    319 		if (flags & RFCOMM_LM_MASTER)
    320 			return 0;
    321 		flags |= RFCOMM_LM_MASTER;
    322 	} else {
    323 		if (!(flags & RFCOMM_LM_MASTER))
    324 			return 0;
    325 		flags &= ~RFCOMM_LM_MASTER;
    326 	}
    327 
    328 	if (setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags, sizeof(flags)) < 0)
    329 		return -errno;
    330 
    331 	return 0;
    332 }
    333 
    334 static int l2cap_set_lm(int sock, int level)
    335 {
    336 	int lm_map[] = {
    337 		0,
    338 		L2CAP_LM_AUTH,
    339 		L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT,
    340 		L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT | L2CAP_LM_SECURE,
    341 	}, opt = lm_map[level];
    342 
    343 	if (setsockopt(sock, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)) < 0)
    344 		return -errno;
    345 
    346 	return 0;
    347 }
    348 
    349 static int rfcomm_set_lm(int sock, int level)
    350 {
    351 	int lm_map[] = {
    352 		0,
    353 		RFCOMM_LM_AUTH,
    354 		RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT,
    355 		RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT | RFCOMM_LM_SECURE,
    356 	}, opt = lm_map[level];
    357 
    358 	if (setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, sizeof(opt)) < 0)
    359 		return -errno;
    360 
    361 	return 0;
    362 }
    363 
    364 static gboolean set_sec_level(int sock, BtIOType type, int level, GError **err)
    365 {
    366 	struct bt_security sec;
    367 	int ret;
    368 
    369 	if (level < BT_SECURITY_LOW || level > BT_SECURITY_HIGH) {
    370 		g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
    371 				"Valid security level range is %d-%d",
    372 				BT_SECURITY_LOW, BT_SECURITY_HIGH);
    373 		return FALSE;
    374 	}
    375 
    376 	memset(&sec, 0, sizeof(sec));
    377 	sec.level = level;
    378 
    379 	if (setsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec,
    380 							sizeof(sec)) == 0)
    381 		return TRUE;
    382 
    383 	if (errno != ENOPROTOOPT) {
    384 		ERROR_FAILED(err, "setsockopt(BT_SECURITY)", errno);
    385 		return FALSE;
    386 	}
    387 
    388 	if (type == BT_IO_L2CAP)
    389 		ret = l2cap_set_lm(sock, level);
    390 	else
    391 		ret = rfcomm_set_lm(sock, level);
    392 
    393 	if (ret < 0) {
    394 		ERROR_FAILED(err, "setsockopt(LM)", -ret);
    395 		return FALSE;
    396 	}
    397 
    398 	return TRUE;
    399 }
    400 
    401 static int l2cap_get_lm(int sock, int *sec_level)
    402 {
    403 	int opt;
    404 	socklen_t len;
    405 
    406 	len = sizeof(opt);
    407 	if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &opt, &len) < 0)
    408 		return -errno;
    409 
    410 	*sec_level = 0;
    411 
    412 	if (opt & L2CAP_LM_AUTH)
    413 		*sec_level = BT_SECURITY_LOW;
    414 	if (opt & L2CAP_LM_ENCRYPT)
    415 		*sec_level = BT_SECURITY_MEDIUM;
    416 	if (opt & L2CAP_LM_SECURE)
    417 		*sec_level = BT_SECURITY_HIGH;
    418 
    419 	return 0;
    420 }
    421 
    422 static int rfcomm_get_lm(int sock, int *sec_level)
    423 {
    424 	int opt;
    425 	socklen_t len;
    426 
    427 	len = sizeof(opt);
    428 	if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, &len) < 0)
    429 		return -errno;
    430 
    431 	*sec_level = 0;
    432 
    433 	if (opt & RFCOMM_LM_AUTH)
    434 		*sec_level = BT_SECURITY_LOW;
    435 	if (opt & RFCOMM_LM_ENCRYPT)
    436 		*sec_level = BT_SECURITY_MEDIUM;
    437 	if (opt & RFCOMM_LM_SECURE)
    438 		*sec_level = BT_SECURITY_HIGH;
    439 
    440 	return 0;
    441 }
    442 
    443 static gboolean get_sec_level(int sock, BtIOType type, int *level,
    444 								GError **err)
    445 {
    446 	struct bt_security sec;
    447 	socklen_t len;
    448 	int ret;
    449 
    450 	memset(&sec, 0, sizeof(sec));
    451 	len = sizeof(sec);
    452 	if (getsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec, &len) == 0) {
    453 		*level = sec.level;
    454 		return TRUE;
    455 	}
    456 
    457 	if (errno != ENOPROTOOPT) {
    458 		ERROR_FAILED(err, "getsockopt(BT_SECURITY)", errno);
    459 		return FALSE;
    460 	}
    461 
    462 	if (type == BT_IO_L2CAP)
    463 		ret = l2cap_get_lm(sock, level);
    464 	else
    465 		ret = rfcomm_get_lm(sock, level);
    466 
    467 	if (ret < 0) {
    468 		ERROR_FAILED(err, "getsockopt(LM)", -ret);
    469 		return FALSE;
    470 	}
    471 
    472 	return TRUE;
    473 }
    474 
    475 static gboolean l2cap_set(int sock, int sec_level, uint16_t imtu,
    476 				uint16_t omtu, int master, GError **err)
    477 {
    478 	if (imtu || omtu) {
    479 		struct l2cap_options l2o;
    480 		socklen_t len;
    481 
    482 		memset(&l2o, 0, sizeof(l2o));
    483 		len = sizeof(l2o);
    484 		if (getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o,
    485 								&len) < 0) {
    486 			ERROR_FAILED(err, "getsockopt(L2CAP_OPTIONS)", errno);
    487 			return FALSE;
    488 		}
    489 
    490 		if (imtu)
    491 			l2o.imtu = imtu;
    492 		if (omtu)
    493 			l2o.omtu = omtu;
    494 
    495 		if (setsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o,
    496 							sizeof(l2o)) < 0) {
    497 			ERROR_FAILED(err, "setsockopt(L2CAP_OPTIONS)", errno);
    498 			return FALSE;
    499 		}
    500 	}
    501 
    502 	if (master >= 0 && l2cap_set_master(sock, master) < 0) {
    503 		ERROR_FAILED(err, "l2cap_set_master", errno);
    504 		return FALSE;
    505 	}
    506 
    507 	if (sec_level && !set_sec_level(sock, BT_IO_L2CAP, sec_level, err))
    508 		return FALSE;
    509 
    510 	return TRUE;
    511 }
    512 
    513 static int rfcomm_bind(int sock, const bdaddr_t *src, uint8_t channel)
    514 {
    515 	struct sockaddr_rc addr;
    516 
    517 	memset(&addr, 0, sizeof(addr));
    518 	addr.rc_family = AF_BLUETOOTH;
    519 	bacpy(&addr.rc_bdaddr, src);
    520 	addr.rc_channel = channel;
    521 
    522 	return bind(sock, (struct sockaddr *) &addr, sizeof(addr));
    523 }
    524 
    525 static int rfcomm_connect(int sock, const bdaddr_t *dst, uint8_t channel)
    526 {
    527 	int err;
    528 	struct sockaddr_rc addr;
    529 
    530 	memset(&addr, 0, sizeof(addr));
    531 	addr.rc_family = AF_BLUETOOTH;
    532 	bacpy(&addr.rc_bdaddr, dst);
    533 	addr.rc_channel = channel;
    534 
    535 	err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
    536 	if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
    537 		return err;
    538 
    539 	return 0;
    540 }
    541 
    542 static gboolean rfcomm_set(int sock, int sec_level, int master, GError **err)
    543 {
    544 	if (sec_level && !set_sec_level(sock, BT_IO_RFCOMM, sec_level, err))
    545 		return FALSE;
    546 
    547 	if (master >= 0 && rfcomm_set_master(sock, master) < 0) {
    548 		ERROR_FAILED(err, "rfcomm_set_master", errno);
    549 		return FALSE;
    550 	}
    551 
    552 	return TRUE;
    553 }
    554 
    555 static int sco_bind(int sock, const bdaddr_t *src)
    556 {
    557 	struct sockaddr_sco addr;
    558 
    559 	memset(&addr, 0, sizeof(addr));
    560 	addr.sco_family = AF_BLUETOOTH;
    561 	bacpy(&addr.sco_bdaddr, src);
    562 
    563 	return bind(sock, (struct sockaddr *) &addr, sizeof(addr));
    564 }
    565 
    566 static int sco_connect(int sock, const bdaddr_t *dst)
    567 {
    568 	struct sockaddr_sco addr;
    569 	int err;
    570 
    571 	memset(&addr, 0, sizeof(addr));
    572 	addr.sco_family = AF_BLUETOOTH;
    573 	bacpy(&addr.sco_bdaddr, dst);
    574 
    575 	err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
    576 	if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
    577 		return err;
    578 
    579 	return 0;
    580 }
    581 
    582 static gboolean sco_set(int sock, uint16_t mtu, GError **err)
    583 {
    584 	struct sco_options sco_opt;
    585 	socklen_t len;
    586 
    587 	if (!mtu)
    588 		return TRUE;
    589 
    590 	len = sizeof(sco_opt);
    591 	memset(&sco_opt, 0, len);
    592 	if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) {
    593 		ERROR_FAILED(err, "getsockopt(SCO_OPTIONS)", errno);
    594 		return FALSE;
    595 	}
    596 
    597 	sco_opt.mtu = mtu;
    598 	if (setsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt,
    599 						sizeof(sco_opt)) < 0) {
    600 		ERROR_FAILED(err, "setsockopt(SCO_OPTIONS)", errno);
    601 		return FALSE;
    602 	}
    603 
    604 	return TRUE;
    605 }
    606 
    607 static gboolean parse_set_opts(struct set_opts *opts, GError **err,
    608 						BtIOOption opt1, va_list args)
    609 {
    610 	BtIOOption opt = opt1;
    611 	const char *str;
    612 
    613 	memset(opts, 0, sizeof(*opts));
    614 
    615 	/* Set defaults */
    616 	opts->defer = DEFAULT_DEFER_TIMEOUT;
    617 	opts->master = -1;
    618 
    619 	while (opt != BT_IO_OPT_INVALID) {
    620 		switch (opt) {
    621 		case BT_IO_OPT_SOURCE:
    622 			str = va_arg(args, const char *);
    623 			if (strncasecmp(str, "hci", 3) == 0)
    624 				hci_devba(atoi(str + 3), &opts->src);
    625 			else
    626 				str2ba(str, &opts->src);
    627 			break;
    628 		case BT_IO_OPT_SOURCE_BDADDR:
    629 			bacpy(&opts->src, va_arg(args, const bdaddr_t *));
    630 			break;
    631 		case BT_IO_OPT_DEST:
    632 			str2ba(va_arg(args, const char *), &opts->dst);
    633 			break;
    634 		case BT_IO_OPT_DEST_BDADDR:
    635 			bacpy(&opts->dst, va_arg(args, const bdaddr_t *));
    636 			break;
    637 		case BT_IO_OPT_DEFER_TIMEOUT:
    638 			opts->defer = va_arg(args, int);
    639 			break;
    640 		case BT_IO_OPT_SEC_LEVEL:
    641 			opts->sec_level = va_arg(args, int);
    642 			break;
    643 		case BT_IO_OPT_CHANNEL:
    644 			opts->channel = va_arg(args, int);
    645 			break;
    646 		case BT_IO_OPT_PSM:
    647 			opts->psm = va_arg(args, int);
    648 			break;
    649 		case BT_IO_OPT_MTU:
    650 			opts->mtu = va_arg(args, int);
    651 			opts->imtu = opts->mtu;
    652 			opts->omtu = opts->mtu;
    653 			break;
    654 		case BT_IO_OPT_OMTU:
    655 			opts->omtu = va_arg(args, int);
    656 			if (!opts->mtu)
    657 				opts->mtu = opts->omtu;
    658 			break;
    659 		case BT_IO_OPT_IMTU:
    660 			opts->imtu = va_arg(args, int);
    661 			if (!opts->mtu)
    662 				opts->mtu = opts->imtu;
    663 			break;
    664 		case BT_IO_OPT_MASTER:
    665 			opts->master = va_arg(args, gboolean);
    666 			break;
    667 		default:
    668 			g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
    669 					"Unknown option %d", opt);
    670 			return FALSE;
    671 		}
    672 
    673 		opt = va_arg(args, int);
    674 	}
    675 
    676 	return TRUE;
    677 }
    678 
    679 static gboolean get_peers(int sock, struct sockaddr *src, struct sockaddr *dst,
    680 				socklen_t len, GError **err)
    681 {
    682 	socklen_t olen;
    683 
    684 	memset(src, 0, len);
    685 	olen = len;
    686 	if (getsockname(sock, src, &olen) < 0) {
    687 		ERROR_FAILED(err, "getsockname", errno);
    688 		return FALSE;
    689 	}
    690 
    691 	memset(dst, 0, len);
    692 	olen = len;
    693 	if (getpeername(sock, dst, &olen) < 0) {
    694 		ERROR_FAILED(err, "getpeername", errno);
    695 		return FALSE;
    696 	}
    697 
    698 	return TRUE;
    699 }
    700 
    701 static int l2cap_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
    702 {
    703 	struct l2cap_conninfo info;
    704 	socklen_t len;
    705 
    706 	len = sizeof(info);
    707 	if (getsockopt(sock, SOL_L2CAP, L2CAP_CONNINFO, &info, &len) < 0)
    708 		return -errno;
    709 
    710 	if (handle)
    711 		*handle = info.hci_handle;
    712 
    713 	if (dev_class)
    714 		memcpy(dev_class, info.dev_class, 3);
    715 
    716 	return 0;
    717 }
    718 
    719 static gboolean l2cap_get(int sock, GError **err, BtIOOption opt1,
    720 								va_list args)
    721 {
    722 	BtIOOption opt = opt1;
    723 	struct sockaddr_l2 src, dst;
    724 	struct l2cap_options l2o;
    725 	int flags;
    726 	uint8_t dev_class[3];
    727 	uint16_t handle;
    728 	socklen_t len;
    729 
    730 	len = sizeof(l2o);
    731 	memset(&l2o, 0, len);
    732 	if (getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &len) < 0) {
    733 		ERROR_FAILED(err, "getsockopt(L2CAP_OPTIONS)", errno);
    734 		return FALSE;
    735 	}
    736 
    737 	if (!get_peers(sock, (struct sockaddr *) &src,
    738 				(struct sockaddr *) &dst, sizeof(src), err))
    739 		return FALSE;
    740 
    741 	while (opt != BT_IO_OPT_INVALID) {
    742 		switch (opt) {
    743 		case BT_IO_OPT_SOURCE:
    744 			ba2str(&src.l2_bdaddr, va_arg(args, char *));
    745 			break;
    746 		case BT_IO_OPT_SOURCE_BDADDR:
    747 			bacpy(va_arg(args, bdaddr_t *), &src.l2_bdaddr);
    748 			break;
    749 		case BT_IO_OPT_DEST:
    750 			ba2str(&dst.l2_bdaddr, va_arg(args, char *));
    751 			break;
    752 		case BT_IO_OPT_DEST_BDADDR:
    753 			bacpy(va_arg(args, bdaddr_t *), &dst.l2_bdaddr);
    754 			break;
    755 		case BT_IO_OPT_DEFER_TIMEOUT:
    756 			len = sizeof(int);
    757 			if (getsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
    758 					va_arg(args, int *), &len) < 0) {
    759 				ERROR_FAILED(err, "getsockopt(DEFER_SETUP)",
    760 									errno);
    761 				return FALSE;
    762 			}
    763 			break;
    764 		case BT_IO_OPT_SEC_LEVEL:
    765 			if (!get_sec_level(sock, BT_IO_L2CAP,
    766 						va_arg(args, int *), err))
    767 				return FALSE;
    768 			break;
    769 		case BT_IO_OPT_PSM:
    770 			*(va_arg(args, uint16_t *)) = src.l2_psm ?
    771 						src.l2_psm : dst.l2_psm;
    772 			break;
    773 		case BT_IO_OPT_OMTU:
    774 			*(va_arg(args, uint16_t *)) = l2o.omtu;
    775 			break;
    776 		case BT_IO_OPT_IMTU:
    777 			*(va_arg(args, uint16_t *)) = l2o.imtu;
    778 			break;
    779 		case BT_IO_OPT_MASTER:
    780 			len = sizeof(flags);
    781 			if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags,
    782 								&len) < 0) {
    783 				ERROR_FAILED(err, "getsockopt(L2CAP_LM)",
    784 									errno);
    785 				return FALSE;
    786 			}
    787 			*(va_arg(args, gboolean *)) =
    788 				(flags & L2CAP_LM_MASTER) ? TRUE : FALSE;
    789 			break;
    790 		case BT_IO_OPT_HANDLE:
    791 			if (l2cap_get_info(sock, &handle, dev_class) < 0) {
    792 				ERROR_FAILED(err, "L2CAP_CONNINFO", errno);
    793 				return FALSE;
    794 			}
    795 			*(va_arg(args, uint16_t *)) = handle;
    796 			break;
    797 		case BT_IO_OPT_CLASS:
    798 			if (l2cap_get_info(sock, &handle, dev_class) < 0) {
    799 				ERROR_FAILED(err, "L2CAP_CONNINFO", errno);
    800 				return FALSE;
    801 			}
    802 			memcpy(va_arg(args, uint8_t *), dev_class, 3);
    803 			break;
    804 		default:
    805 			g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
    806 					"Unknown option %d", opt);
    807 			return FALSE;
    808 		}
    809 
    810 		opt = va_arg(args, int);
    811 	}
    812 
    813 	return TRUE;
    814 }
    815 
    816 static int rfcomm_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
    817 {
    818 	struct rfcomm_conninfo info;
    819 	socklen_t len;
    820 
    821 	len = sizeof(info);
    822 	if (getsockopt(sock, SOL_RFCOMM, RFCOMM_CONNINFO, &info, &len) < 0)
    823 		return -errno;
    824 
    825 	if (handle)
    826 		*handle = info.hci_handle;
    827 
    828 	if (dev_class)
    829 		memcpy(dev_class, info.dev_class, 3);
    830 
    831 	return 0;
    832 }
    833 
    834 static gboolean rfcomm_get(int sock, GError **err, BtIOOption opt1,
    835 								va_list args)
    836 {
    837 	BtIOOption opt = opt1;
    838 	struct sockaddr_rc src, dst;
    839 	int flags;
    840 	socklen_t len;
    841 	uint8_t dev_class[3];
    842 	uint16_t handle;
    843 
    844 	if (!get_peers(sock, (struct sockaddr *) &src,
    845 				(struct sockaddr *) &dst, sizeof(src), err))
    846 		return FALSE;
    847 
    848 	while (opt != BT_IO_OPT_INVALID) {
    849 		switch (opt) {
    850 		case BT_IO_OPT_SOURCE:
    851 			ba2str(&src.rc_bdaddr, va_arg(args, char *));
    852 			break;
    853 		case BT_IO_OPT_SOURCE_BDADDR:
    854 			bacpy(va_arg(args, bdaddr_t *), &src.rc_bdaddr);
    855 			break;
    856 		case BT_IO_OPT_DEST:
    857 			ba2str(&dst.rc_bdaddr, va_arg(args, char *));
    858 			break;
    859 		case BT_IO_OPT_DEST_BDADDR:
    860 			bacpy(va_arg(args, bdaddr_t *), &dst.rc_bdaddr);
    861 			break;
    862 		case BT_IO_OPT_DEFER_TIMEOUT:
    863 			len = sizeof(int);
    864 			if (getsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
    865 					va_arg(args, int *), &len) < 0) {
    866 				ERROR_FAILED(err, "getsockopt(DEFER_SETUP)",
    867 									errno);
    868 				return FALSE;
    869 			}
    870 			break;
    871 		case BT_IO_OPT_SEC_LEVEL:
    872 			if (!get_sec_level(sock, BT_IO_RFCOMM,
    873 						va_arg(args, int *), err))
    874 				return FALSE;
    875 			break;
    876 		case BT_IO_OPT_CHANNEL:
    877 			*(va_arg(args, uint8_t *)) = src.rc_channel ?
    878 					src.rc_channel : dst.rc_channel;
    879 			break;
    880 		case BT_IO_OPT_MASTER:
    881 			len = sizeof(flags);
    882 			if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags,
    883 								&len) < 0) {
    884 				ERROR_FAILED(err, "getsockopt(RFCOMM_LM)",
    885 									errno);
    886 				return FALSE;
    887 			}
    888 			*(va_arg(args, gboolean *)) =
    889 				(flags & RFCOMM_LM_MASTER) ? TRUE : FALSE;
    890 			break;
    891 		case BT_IO_OPT_HANDLE:
    892 			if (rfcomm_get_info(sock, &handle, dev_class) < 0) {
    893 				ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
    894 				return FALSE;
    895 			}
    896 			*(va_arg(args, uint16_t *)) = handle;
    897 			break;
    898 		case BT_IO_OPT_CLASS:
    899 			if (rfcomm_get_info(sock, &handle, dev_class) < 0) {
    900 				ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
    901 				return FALSE;
    902 			}
    903 			memcpy(va_arg(args, uint8_t *), dev_class, 3);
    904 			break;
    905 		default:
    906 			g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
    907 					"Unknown option %d", opt);
    908 			return FALSE;
    909 		}
    910 
    911 		opt = va_arg(args, int);
    912 	}
    913 
    914 	return TRUE;
    915 }
    916 
    917 static int sco_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
    918 {
    919 	struct sco_conninfo info;
    920 	socklen_t len;
    921 
    922 	len = sizeof(info);
    923 	if (getsockopt(sock, SOL_SCO, SCO_CONNINFO, &info, &len) < 0)
    924 		return -errno;
    925 
    926 	if (handle)
    927 		*handle = info.hci_handle;
    928 
    929 	if (dev_class)
    930 		memcpy(dev_class, info.dev_class, 3);
    931 
    932 	return 0;
    933 }
    934 
    935 static gboolean sco_get(int sock, GError **err, BtIOOption opt1, va_list args)
    936 {
    937 	BtIOOption opt = opt1;
    938 	struct sockaddr_sco src, dst;
    939 	struct sco_options sco_opt;
    940 	socklen_t len;
    941 	uint8_t dev_class[3];
    942 	uint16_t handle;
    943 
    944 	len = sizeof(sco_opt);
    945 	memset(&sco_opt, 0, len);
    946 	if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) {
    947 		ERROR_FAILED(err, "getsockopt(SCO_OPTIONS)", errno);
    948 		return FALSE;
    949 	}
    950 
    951 	if (!get_peers(sock, (struct sockaddr *) &src,
    952 				(struct sockaddr *) &dst, sizeof(src), err))
    953 		return FALSE;
    954 
    955 	while (opt != BT_IO_OPT_INVALID) {
    956 		switch (opt) {
    957 		case BT_IO_OPT_SOURCE:
    958 			ba2str(&src.sco_bdaddr, va_arg(args, char *));
    959 			break;
    960 		case BT_IO_OPT_SOURCE_BDADDR:
    961 			bacpy(va_arg(args, bdaddr_t *), &src.sco_bdaddr);
    962 			break;
    963 		case BT_IO_OPT_DEST:
    964 			ba2str(&dst.sco_bdaddr, va_arg(args, char *));
    965 			break;
    966 		case BT_IO_OPT_DEST_BDADDR:
    967 			bacpy(va_arg(args, bdaddr_t *), &dst.sco_bdaddr);
    968 			break;
    969 		case BT_IO_OPT_MTU:
    970 		case BT_IO_OPT_IMTU:
    971 		case BT_IO_OPT_OMTU:
    972 			*(va_arg(args, uint16_t *)) = sco_opt.mtu;
    973 			break;
    974 		case BT_IO_OPT_HANDLE:
    975 			if (sco_get_info(sock, &handle, dev_class) < 0) {
    976 				ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
    977 				return FALSE;
    978 			}
    979 			*(va_arg(args, uint16_t *)) = handle;
    980 			break;
    981 		case BT_IO_OPT_CLASS:
    982 			if (sco_get_info(sock, &handle, dev_class) < 0) {
    983 				ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
    984 				return FALSE;
    985 			}
    986 			memcpy(va_arg(args, uint8_t *), dev_class, 3);
    987 			break;
    988 		default:
    989 			g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
    990 					"Unknown option %d", opt);
    991 			return FALSE;
    992 		}
    993 
    994 		opt = va_arg(args, int);
    995 	}
    996 
    997 	return TRUE;
    998 }
    999 
   1000 static gboolean get_valist(GIOChannel *io, BtIOType type, GError **err,
   1001 						BtIOOption opt1, va_list args)
   1002 {
   1003 	int sock;
   1004 
   1005 	sock = g_io_channel_unix_get_fd(io);
   1006 
   1007 	switch (type) {
   1008 	case BT_IO_L2RAW:
   1009 	case BT_IO_L2CAP:
   1010 		return l2cap_get(sock, err, opt1, args);
   1011 	case BT_IO_RFCOMM:
   1012 		return rfcomm_get(sock, err, opt1, args);
   1013 	case BT_IO_SCO:
   1014 		return sco_get(sock, err, opt1, args);
   1015 	}
   1016 
   1017 	g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
   1018 			"Unknown BtIO type %d", type);
   1019 	return FALSE;
   1020 }
   1021 
   1022 gboolean bt_io_accept(GIOChannel *io, BtIOConnect connect, gpointer user_data,
   1023 					GDestroyNotify destroy, GError **err)
   1024 {
   1025 	int sock;
   1026 	char c;
   1027 	struct pollfd pfd;
   1028 
   1029 	sock = g_io_channel_unix_get_fd(io);
   1030 
   1031 	memset(&pfd, 0, sizeof(pfd));
   1032 	pfd.fd = sock;
   1033 	pfd.events = POLLOUT;
   1034 
   1035 	if (poll(&pfd, 1, 0) < 0) {
   1036 		ERROR_FAILED(err, "poll", errno);
   1037 		return FALSE;
   1038 	}
   1039 
   1040 	if (!(pfd.revents & POLLOUT)) {
   1041 		int ret;
   1042 		ret = read(sock, &c, 1);
   1043 	}
   1044 
   1045 	accept_add(io, connect, user_data, destroy);
   1046 
   1047 	return TRUE;
   1048 }
   1049 
   1050 gboolean bt_io_set(GIOChannel *io, BtIOType type, GError **err,
   1051 							BtIOOption opt1, ...)
   1052 {
   1053 	va_list args;
   1054 	gboolean ret;
   1055 	struct set_opts opts;
   1056 	int sock;
   1057 
   1058 	va_start(args, opt1);
   1059 	ret = parse_set_opts(&opts, err, opt1, args);
   1060 	va_end(args);
   1061 
   1062 	if (!ret)
   1063 		return ret;
   1064 
   1065 	sock = g_io_channel_unix_get_fd(io);
   1066 
   1067 	switch (type) {
   1068 	case BT_IO_L2RAW:
   1069 	case BT_IO_L2CAP:
   1070 		return l2cap_set(sock, opts.sec_level, opts.imtu, opts.omtu,
   1071 							opts.master, err);
   1072 	case BT_IO_RFCOMM:
   1073 		return rfcomm_set(sock, opts.sec_level, opts.master, err);
   1074 	case BT_IO_SCO:
   1075 		return sco_set(sock, opts.mtu, err);
   1076 	}
   1077 
   1078 	g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
   1079 			"Unknown BtIO type %d", type);
   1080 	return FALSE;
   1081 }
   1082 
   1083 gboolean bt_io_get(GIOChannel *io, BtIOType type, GError **err,
   1084 							BtIOOption opt1, ...)
   1085 {
   1086 	va_list args;
   1087 	gboolean ret;
   1088 
   1089 	va_start(args, opt1);
   1090 	ret = get_valist(io, type, err, opt1, args);
   1091 	va_end(args);
   1092 
   1093 	return ret;
   1094 }
   1095 
   1096 static GIOChannel *create_io(BtIOType type, gboolean server,
   1097 					struct set_opts *opts, GError **err)
   1098 {
   1099 	int sock;
   1100 	GIOChannel *io;
   1101 
   1102 	switch (type) {
   1103 	case BT_IO_L2RAW:
   1104 		sock = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP);
   1105 		if (sock < 0) {
   1106 			ERROR_FAILED(err, "socket(RAW, L2CAP)", errno);
   1107 			return NULL;
   1108 		}
   1109 		if (l2cap_bind(sock, &opts->src, server ? opts->psm : 0) < 0) {
   1110 			ERROR_FAILED(err, "l2cap_bind", errno);
   1111 			return NULL;
   1112 		}
   1113 		if (!l2cap_set(sock, opts->sec_level, 0, 0, -1, err))
   1114 			return NULL;
   1115 		break;
   1116 	case BT_IO_L2CAP:
   1117 		sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
   1118 		if (sock < 0) {
   1119 			ERROR_FAILED(err, "socket(SEQPACKET, L2CAP)", errno);
   1120 			return NULL;
   1121 		}
   1122 		if (l2cap_bind(sock, &opts->src, server ? opts->psm : 0) < 0) {
   1123 			ERROR_FAILED(err, "l2cap_bind", errno);
   1124 			return NULL;
   1125 		}
   1126 		if (!l2cap_set(sock, opts->sec_level, opts->imtu, opts->omtu,
   1127 							opts->master, err))
   1128 			return NULL;
   1129 		break;
   1130 	case BT_IO_RFCOMM:
   1131 		sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
   1132 		if (sock < 0) {
   1133 			ERROR_FAILED(err, "socket(STREAM, RFCOMM)", errno);
   1134 			return NULL;
   1135 		}
   1136 		if (rfcomm_bind(sock, &opts->src,
   1137 					server ? opts->channel : 0) < 0) {
   1138 			ERROR_FAILED(err, "rfcomm_bind", errno);
   1139 			return NULL;
   1140 		}
   1141 		if (!rfcomm_set(sock, opts->sec_level, opts->master, err))
   1142 			return NULL;
   1143 		break;
   1144 	case BT_IO_SCO:
   1145 		sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
   1146 		if (sock < 0) {
   1147 			ERROR_FAILED(err, "socket(SEQPACKET, SCO)", errno);
   1148 			return NULL;
   1149 		}
   1150 		if (sco_bind(sock, &opts->src) < 0) {
   1151 			ERROR_FAILED(err, "sco_bind", errno);
   1152 			return NULL;
   1153 		}
   1154 		if (!sco_set(sock, opts->mtu, err))
   1155 			return NULL;
   1156 		break;
   1157 	default:
   1158 		g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
   1159 				"Unknown BtIO type %d", type);
   1160 		return NULL;
   1161 	}
   1162 
   1163 	io = g_io_channel_unix_new(sock);
   1164 
   1165 	g_io_channel_set_close_on_unref(io, TRUE);
   1166 	g_io_channel_set_flags(io, G_IO_FLAG_NONBLOCK, NULL);
   1167 
   1168 	return io;
   1169 }
   1170 
   1171 GIOChannel *bt_io_connect(BtIOType type, BtIOConnect connect,
   1172 				gpointer user_data, GDestroyNotify destroy,
   1173 				GError **gerr, BtIOOption opt1, ...)
   1174 {
   1175 	GIOChannel *io;
   1176 	va_list args;
   1177 	struct set_opts opts;
   1178 	int err, sock;
   1179 	gboolean ret;
   1180 
   1181 	va_start(args, opt1);
   1182 	ret = parse_set_opts(&opts, gerr, opt1, args);
   1183 	va_end(args);
   1184 
   1185 	if (ret == FALSE)
   1186 		return NULL;
   1187 
   1188 	io = create_io(type, FALSE, &opts, gerr);
   1189 	if (io == NULL)
   1190 		return NULL;
   1191 
   1192 	sock = g_io_channel_unix_get_fd(io);
   1193 
   1194 	switch (type) {
   1195 	case BT_IO_L2RAW:
   1196 		err = l2cap_connect(sock, &opts.dst, 0);
   1197 		break;
   1198 	case BT_IO_L2CAP:
   1199 		err = l2cap_connect(sock, &opts.dst, opts.psm);
   1200 		break;
   1201 	case BT_IO_RFCOMM:
   1202 		err = rfcomm_connect(sock, &opts.dst, opts.channel);
   1203 		break;
   1204 	case BT_IO_SCO:
   1205 		err = sco_connect(sock, &opts.dst);
   1206 		break;
   1207 	default:
   1208 		g_set_error(gerr, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
   1209 						"Unknown BtIO type %d", type);
   1210 		return NULL;
   1211 	}
   1212 
   1213 	if (err < 0) {
   1214 		g_set_error(gerr, BT_IO_ERROR, BT_IO_ERROR_CONNECT_FAILED,
   1215 				"connect: %s (%d)", strerror(-err), -err);
   1216 		g_io_channel_unref(io);
   1217 		return NULL;
   1218 	}
   1219 
   1220 	connect_add(io, connect, user_data, destroy);
   1221 
   1222 	return io;
   1223 }
   1224 
   1225 GIOChannel *bt_io_listen(BtIOType type, BtIOConnect connect,
   1226 				BtIOConfirm confirm, gpointer user_data,
   1227 				GDestroyNotify destroy, GError **err,
   1228 				BtIOOption opt1, ...)
   1229 {
   1230 	GIOChannel *io;
   1231 	va_list args;
   1232 	struct set_opts opts;
   1233 	int sock;
   1234 	gboolean ret;
   1235 
   1236 	if (type == BT_IO_L2RAW) {
   1237 		g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
   1238 				"Server L2CAP RAW sockets not supported");
   1239 		return NULL;
   1240 	}
   1241 
   1242 	va_start(args, opt1);
   1243 	ret = parse_set_opts(&opts, err, opt1, args);
   1244 	va_end(args);
   1245 
   1246 	if (ret == FALSE)
   1247 		return NULL;
   1248 
   1249 	io = create_io(type, TRUE, &opts, err);
   1250 	if (io == NULL)
   1251 		return NULL;
   1252 
   1253 	sock = g_io_channel_unix_get_fd(io);
   1254 
   1255 	if (confirm)
   1256 		setsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP, &opts.defer,
   1257 							sizeof(opts.defer));
   1258 
   1259 	if (listen(sock, 5) < 0) {
   1260 		ERROR_FAILED(err, "listen", errno);
   1261 		g_io_channel_unref(io);
   1262 		return NULL;
   1263 	}
   1264 
   1265 	server_add(io, connect, confirm, user_data, destroy);
   1266 
   1267 	return io;
   1268 }
   1269 
   1270 GQuark bt_io_error_quark(void)
   1271 {
   1272 	return g_quark_from_static_string("bt-io-error-quark");
   1273 }
   1274 
   1275