Home | History | Annotate | Download | only in compat
      1 /*
      2  *
      3  *  BlueZ - Bluetooth protocol stack for Linux
      4  *
      5  *  Copyright (C) 2003-2010  Marcel Holtmann <marcel (at) holtmann.org>
      6  *
      7  *
      8  *  This program is free software; you can redistribute it and/or modify
      9  *  it under the terms of the GNU General Public License as published by
     10  *  the Free Software Foundation; either version 2 of the License, or
     11  *  (at your option) any later version.
     12  *
     13  *  This program is distributed in the hope that it will be useful,
     14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  *  GNU General Public License for more details.
     17  *
     18  *  You should have received a copy of the GNU General Public License
     19  *  along with this program; if not, write to the Free Software
     20  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     21  *
     22  */
     23 
     24 #ifdef HAVE_CONFIG_H
     25 #include <config.h>
     26 #endif
     27 
     28 #define _GNU_SOURCE
     29 #include <stdio.h>
     30 #include <errno.h>
     31 #include <fcntl.h>
     32 #include <unistd.h>
     33 #include <stdlib.h>
     34 #include <string.h>
     35 #include <syslog.h>
     36 #include <signal.h>
     37 #include <getopt.h>
     38 #include <sys/poll.h>
     39 #include <sys/ioctl.h>
     40 #include <sys/socket.h>
     41 
     42 #include <bluetooth/bluetooth.h>
     43 #include <bluetooth/hci.h>
     44 #include <bluetooth/hci_lib.h>
     45 #include <bluetooth/l2cap.h>
     46 #include <bluetooth/sdp.h>
     47 #include <bluetooth/hidp.h>
     48 
     49 #include "sdp.h"
     50 #include "hidd.h"
     51 
     52 #ifdef NEED_PPOLL
     53 #include "ppoll.h"
     54 #endif
     55 
     56 enum {
     57 	NONE,
     58 	SHOW,
     59 	SERVER,
     60 	SEARCH,
     61 	CONNECT,
     62 	KILL
     63 };
     64 
     65 static volatile sig_atomic_t __io_canceled = 0;
     66 
     67 static void sig_hup(int sig)
     68 {
     69 }
     70 
     71 static void sig_term(int sig)
     72 {
     73 	__io_canceled = 1;
     74 }
     75 
     76 static int l2cap_connect(bdaddr_t *src, bdaddr_t *dst, unsigned short psm)
     77 {
     78 	struct sockaddr_l2 addr;
     79 	struct l2cap_options opts;
     80 	int sk;
     81 
     82 	if ((sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)) < 0)
     83 		return -1;
     84 
     85 	memset(&addr, 0, sizeof(addr));
     86 	addr.l2_family  = AF_BLUETOOTH;
     87 	bacpy(&addr.l2_bdaddr, src);
     88 
     89 	if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
     90 		close(sk);
     91 		return -1;
     92 	}
     93 
     94 	memset(&opts, 0, sizeof(opts));
     95 	opts.imtu = HIDP_DEFAULT_MTU;
     96 	opts.omtu = HIDP_DEFAULT_MTU;
     97 	opts.flush_to = 0xffff;
     98 
     99 	setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, sizeof(opts));
    100 
    101 	memset(&addr, 0, sizeof(addr));
    102 	addr.l2_family  = AF_BLUETOOTH;
    103 	bacpy(&addr.l2_bdaddr, dst);
    104 	addr.l2_psm = htobs(psm);
    105 
    106 	if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
    107 		close(sk);
    108 		return -1;
    109 	}
    110 
    111 	return sk;
    112 }
    113 
    114 static int l2cap_listen(const bdaddr_t *bdaddr, unsigned short psm, int lm, int backlog)
    115 {
    116 	struct sockaddr_l2 addr;
    117 	struct l2cap_options opts;
    118 	int sk;
    119 
    120 	if ((sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)) < 0)
    121 		return -1;
    122 
    123 	memset(&addr, 0, sizeof(addr));
    124 	addr.l2_family = AF_BLUETOOTH;
    125 	bacpy(&addr.l2_bdaddr, bdaddr);
    126 	addr.l2_psm = htobs(psm);
    127 
    128 	if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
    129 		close(sk);
    130 		return -1;
    131 	}
    132 
    133 	setsockopt(sk, SOL_L2CAP, L2CAP_LM, &lm, sizeof(lm));
    134 
    135 	memset(&opts, 0, sizeof(opts));
    136 	opts.imtu = HIDP_DEFAULT_MTU;
    137 	opts.omtu = HIDP_DEFAULT_MTU;
    138 	opts.flush_to = 0xffff;
    139 
    140 	setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, sizeof(opts));
    141 
    142 	if (listen(sk, backlog) < 0) {
    143 		close(sk);
    144 		return -1;
    145 	}
    146 
    147 	return sk;
    148 }
    149 
    150 static int l2cap_accept(int sk, bdaddr_t *bdaddr)
    151 {
    152 	struct sockaddr_l2 addr;
    153 	socklen_t addrlen;
    154 	int nsk;
    155 
    156 	memset(&addr, 0, sizeof(addr));
    157 	addrlen = sizeof(addr);
    158 
    159 	if ((nsk = accept(sk, (struct sockaddr *) &addr, &addrlen)) < 0)
    160 		return -1;
    161 
    162 	if (bdaddr)
    163 		bacpy(bdaddr, &addr.l2_bdaddr);
    164 
    165 	return nsk;
    166 }
    167 
    168 static int request_authentication(bdaddr_t *src, bdaddr_t *dst)
    169 {
    170 	struct hci_conn_info_req *cr;
    171 	char addr[18];
    172 	int err, dd, dev_id;
    173 
    174 	ba2str(src, addr);
    175 	dev_id = hci_devid(addr);
    176 	if (dev_id < 0)
    177 		return dev_id;
    178 
    179 	dd = hci_open_dev(dev_id);
    180 	if (dd < 0)
    181 		return dd;
    182 
    183 	cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info));
    184 	if (!cr)
    185 		return -ENOMEM;
    186 
    187 	bacpy(&cr->bdaddr, dst);
    188 	cr->type = ACL_LINK;
    189 	err = ioctl(dd, HCIGETCONNINFO, (unsigned long) cr);
    190 	if (err < 0) {
    191 		free(cr);
    192 		hci_close_dev(dd);
    193 		return err;
    194 	}
    195 
    196 	err = hci_authenticate_link(dd, htobs(cr->conn_info->handle), 25000);
    197 
    198 	free(cr);
    199 	hci_close_dev(dd);
    200 
    201 	return err;
    202 }
    203 
    204 static int request_encryption(bdaddr_t *src, bdaddr_t *dst)
    205 {
    206 	struct hci_conn_info_req *cr;
    207 	char addr[18];
    208 	int err, dd, dev_id;
    209 
    210 	ba2str(src, addr);
    211 	dev_id = hci_devid(addr);
    212 	if (dev_id < 0)
    213 		return dev_id;
    214 
    215 	dd = hci_open_dev(dev_id);
    216 	if (dd < 0)
    217 		return dd;
    218 
    219 	cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info));
    220 	if (!cr)
    221 		return -ENOMEM;
    222 
    223 	bacpy(&cr->bdaddr, dst);
    224 	cr->type = ACL_LINK;
    225 	err = ioctl(dd, HCIGETCONNINFO, (unsigned long) cr);
    226 	if (err < 0) {
    227 		free(cr);
    228 		hci_close_dev(dd);
    229 		return err;
    230 	}
    231 
    232 	err = hci_encrypt_link(dd, htobs(cr->conn_info->handle), 1, 25000);
    233 
    234 	free(cr);
    235 	hci_close_dev(dd);
    236 
    237 	return err;
    238 }
    239 
    240 static void enable_sixaxis(int csk)
    241 {
    242 	const unsigned char buf[] = {
    243 		0x53 /*HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE*/,
    244 		0xf4,  0x42, 0x03, 0x00, 0x00 };
    245 	int err;
    246 
    247 	err = write(csk, buf, sizeof(buf));
    248 }
    249 
    250 static int create_device(int ctl, int csk, int isk, uint8_t subclass, int nosdp, int nocheck, int bootonly, int encrypt, int timeout)
    251 {
    252 	struct hidp_connadd_req req;
    253 	struct sockaddr_l2 addr;
    254 	socklen_t addrlen;
    255 	bdaddr_t src, dst;
    256 	char bda[18];
    257 	int err;
    258 
    259 	memset(&addr, 0, sizeof(addr));
    260 	addrlen = sizeof(addr);
    261 
    262 	if (getsockname(csk, (struct sockaddr *) &addr, &addrlen) < 0)
    263 		return -1;
    264 
    265 	bacpy(&src, &addr.l2_bdaddr);
    266 
    267 	memset(&addr, 0, sizeof(addr));
    268 	addrlen = sizeof(addr);
    269 
    270 	if (getpeername(csk, (struct sockaddr *) &addr, &addrlen) < 0)
    271 		return -1;
    272 
    273 	bacpy(&dst, &addr.l2_bdaddr);
    274 
    275 	memset(&req, 0, sizeof(req));
    276 	req.ctrl_sock = csk;
    277 	req.intr_sock = isk;
    278 	req.flags     = 0;
    279 	req.idle_to   = timeout * 60;
    280 
    281 	err = get_stored_device_info(&src, &dst, &req);
    282 	if (!err)
    283 		goto create;
    284 
    285 	if (!nocheck) {
    286 		ba2str(&dst, bda);
    287 		syslog(LOG_ERR, "Rejected connection from unknown device %s", bda);
    288 		/* Return no error to avoid run_server() complaining too */
    289 		return 0;
    290 	}
    291 
    292 	if (!nosdp) {
    293 		err = get_sdp_device_info(&src, &dst, &req);
    294 		if (err < 0)
    295 			goto error;
    296 	} else {
    297 		struct l2cap_conninfo conn;
    298 		socklen_t size;
    299 		uint8_t class[3];
    300 
    301 		memset(&conn, 0, sizeof(conn));
    302 		size = sizeof(conn);
    303 		if (getsockopt(csk, SOL_L2CAP, L2CAP_CONNINFO, &conn, &size) < 0)
    304 			memset(class, 0, 3);
    305 		else
    306 			memcpy(class, conn.dev_class, 3);
    307 
    308 		if (class[1] == 0x25 && (class[2] == 0x00 || class[2] == 0x01))
    309 			req.subclass = class[0];
    310 		else
    311 			req.subclass = 0xc0;
    312 	}
    313 
    314 create:
    315 	if (subclass != 0x00)
    316 		req.subclass = subclass;
    317 
    318 	ba2str(&dst, bda);
    319 	syslog(LOG_INFO, "New HID device %s (%s)", bda, req.name);
    320 
    321 	if (encrypt && (req.subclass & 0x40)) {
    322 		err = request_authentication(&src, &dst);
    323 		if (err < 0) {
    324 			syslog(LOG_ERR, "Authentication for %s failed", bda);
    325 			goto error;
    326 		}
    327 
    328 		err = request_encryption(&src, &dst);
    329 		if (err < 0)
    330 			syslog(LOG_ERR, "Encryption for %s failed", bda);
    331 	}
    332 
    333 	if (bootonly) {
    334 		req.rd_size = 0;
    335 		req.flags |= (1 << HIDP_BOOT_PROTOCOL_MODE);
    336 	}
    337 
    338 	if (req.vendor == 0x054c && req.product == 0x0268)
    339 		enable_sixaxis(csk);
    340 
    341 	err = ioctl(ctl, HIDPCONNADD, &req);
    342 
    343 error:
    344 	if (req.rd_data)
    345 		free(req.rd_data);
    346 
    347 	return err;
    348 }
    349 
    350 static void run_server(int ctl, int csk, int isk, uint8_t subclass, int nosdp, int nocheck, int bootonly, int encrypt, int timeout)
    351 {
    352 	struct pollfd p[2];
    353 	sigset_t sigs;
    354 	short events;
    355 	int err, ncsk, nisk;
    356 
    357 	sigfillset(&sigs);
    358 	sigdelset(&sigs, SIGCHLD);
    359 	sigdelset(&sigs, SIGPIPE);
    360 	sigdelset(&sigs, SIGTERM);
    361 	sigdelset(&sigs, SIGINT);
    362 	sigdelset(&sigs, SIGHUP);
    363 
    364 	p[0].fd = csk;
    365 	p[0].events = POLLIN | POLLERR | POLLHUP;
    366 
    367 	p[1].fd = isk;
    368 	p[1].events = POLLIN | POLLERR | POLLHUP;
    369 
    370 	while (!__io_canceled) {
    371 		p[0].revents = 0;
    372 		p[1].revents = 0;
    373 
    374 		if (ppoll(p, 2, NULL, &sigs) < 1)
    375 			continue;
    376 
    377 		events = p[0].revents | p[1].revents;
    378 
    379 		if (events & POLLIN) {
    380 			ncsk = l2cap_accept(csk, NULL);
    381 			nisk = l2cap_accept(isk, NULL);
    382 
    383 			err = create_device(ctl, ncsk, nisk, subclass, nosdp, nocheck, bootonly, encrypt, timeout);
    384 			if (err < 0)
    385 				syslog(LOG_ERR, "HID create error %d (%s)",
    386 						errno, strerror(errno));
    387 
    388 			close(nisk);
    389 			sleep(1);
    390 			close(ncsk);
    391 		}
    392 	}
    393 }
    394 
    395 static char *hidp_state[] = {
    396 	"unknown",
    397 	"connected",
    398 	"open",
    399 	"bound",
    400 	"listening",
    401 	"connecting",
    402 	"connecting",
    403 	"config",
    404 	"disconnecting",
    405 	"closed"
    406 };
    407 
    408 static char *hidp_flagstostr(uint32_t flags)
    409 {
    410 	static char str[100];
    411 	str[0] = 0;
    412 
    413 	strcat(str, "[");
    414 
    415 	if (flags & (1 << HIDP_BOOT_PROTOCOL_MODE))
    416 		strcat(str, "boot-protocol");
    417 
    418 	strcat(str, "]");
    419 
    420 	return str;
    421 }
    422 
    423 static void do_show(int ctl)
    424 {
    425 	struct hidp_connlist_req req;
    426 	struct hidp_conninfo ci[16];
    427 	char addr[18];
    428 	unsigned int i;
    429 
    430 	req.cnum = 16;
    431 	req.ci   = ci;
    432 
    433 	if (ioctl(ctl, HIDPGETCONNLIST, &req) < 0) {
    434 		perror("Can't get connection list");
    435 		close(ctl);
    436 		exit(1);
    437 	}
    438 
    439 	for (i = 0; i < req.cnum; i++) {
    440 		ba2str(&ci[i].bdaddr, addr);
    441 		printf("%s %s [%04x:%04x] %s %s\n", addr, ci[i].name,
    442 			ci[i].vendor, ci[i].product, hidp_state[ci[i].state],
    443 			ci[i].flags ? hidp_flagstostr(ci[i].flags) : "");
    444 	}
    445 }
    446 
    447 static void do_connect(int ctl, bdaddr_t *src, bdaddr_t *dst, uint8_t subclass, int fakehid, int bootonly, int encrypt, int timeout)
    448 {
    449 	struct hidp_connadd_req req;
    450 	uint16_t uuid = HID_SVCLASS_ID;
    451 	uint8_t channel = 0;
    452 	char name[256];
    453 	int csk, isk, err;
    454 
    455 	memset(&req, 0, sizeof(req));
    456 	name[0] = '\0';
    457 
    458 	err = get_sdp_device_info(src, dst, &req);
    459 	if (err < 0 && fakehid)
    460 		err = get_alternate_device_info(src, dst,
    461 				&uuid, &channel, name, sizeof(name) - 1);
    462 
    463 	if (err < 0) {
    464 		perror("Can't get device information");
    465 		close(ctl);
    466 		exit(1);
    467 	}
    468 
    469 	switch (uuid) {
    470 	case HID_SVCLASS_ID:
    471 		goto connect;
    472 
    473 	case SERIAL_PORT_SVCLASS_ID:
    474 		if (subclass == 0x40 || !strcmp(name, "Cable Replacement")) {
    475 			if (epox_presenter(src, dst, channel) < 0) {
    476 				close(ctl);
    477 				exit(1);
    478 			}
    479 			break;
    480 		}
    481 		if (subclass == 0x1f || !strcmp(name, "SPP slave")) {
    482 			if (jthree_keyboard(src, dst, channel) < 0) {
    483 				close(ctl);
    484 				exit(1);
    485 			}
    486 			break;
    487 		}
    488 		if (subclass == 0x02 || !strcmp(name, "Serial Port")) {
    489 			if (celluon_keyboard(src, dst, channel) < 0) {
    490 				close(ctl);
    491 				exit(1);
    492 			}
    493 			break;
    494 		}
    495 		break;
    496 
    497 	case HEADSET_SVCLASS_ID:
    498 	case HANDSFREE_SVCLASS_ID:
    499 		if (headset_presenter(src, dst, channel) < 0) {
    500 			close(ctl);
    501 			exit(1);
    502 		}
    503 		break;
    504 	}
    505 
    506 	return;
    507 
    508 connect:
    509 	csk = l2cap_connect(src, dst, L2CAP_PSM_HIDP_CTRL);
    510 	if (csk < 0) {
    511 		perror("Can't create HID control channel");
    512 		close(ctl);
    513 		exit(1);
    514 	}
    515 
    516 	isk = l2cap_connect(src, dst, L2CAP_PSM_HIDP_INTR);
    517 	if (isk < 0) {
    518 		perror("Can't create HID interrupt channel");
    519 		close(csk);
    520 		close(ctl);
    521 		exit(1);
    522 	}
    523 
    524 	err = create_device(ctl, csk, isk, subclass, 1, 1, bootonly, encrypt, timeout);
    525 	if (err < 0) {
    526 		fprintf(stderr, "HID create error %d (%s)\n",
    527 						errno, strerror(errno));
    528 		close(isk);
    529 		sleep(1);
    530 		close(csk);
    531 		close(ctl);
    532 		exit(1);
    533 	}
    534 }
    535 
    536 static void do_search(int ctl, bdaddr_t *bdaddr, uint8_t subclass, int fakehid, int bootonly, int encrypt, int timeout)
    537 {
    538 	inquiry_info *info = NULL;
    539 	bdaddr_t src, dst;
    540 	int i, dev_id, num_rsp, length, flags;
    541 	char addr[18];
    542 	uint8_t class[3];
    543 
    544 	ba2str(bdaddr, addr);
    545 	dev_id = hci_devid(addr);
    546 	if (dev_id < 0) {
    547 		dev_id = hci_get_route(NULL);
    548 		hci_devba(dev_id, &src);
    549 	} else
    550 		bacpy(&src, bdaddr);
    551 
    552 	length  = 8;	/* ~10 seconds */
    553 	num_rsp = 0;
    554 	flags   = IREQ_CACHE_FLUSH;
    555 
    556 	printf("Searching ...\n");
    557 
    558 	num_rsp = hci_inquiry(dev_id, length, num_rsp, NULL, &info, flags);
    559 
    560 	for (i = 0; i < num_rsp; i++) {
    561 		memcpy(class, (info+i)->dev_class, 3);
    562 		if (class[1] == 0x25 && (class[2] == 0x00 || class[2] == 0x01)) {
    563 			bacpy(&dst, &(info+i)->bdaddr);
    564 			ba2str(&dst, addr);
    565 
    566 			printf("\tConnecting to device %s\n", addr);
    567 			do_connect(ctl, &src, &dst, subclass, fakehid, bootonly, encrypt, timeout);
    568 		}
    569 	}
    570 
    571 	if (!fakehid)
    572 		goto done;
    573 
    574 	for (i = 0; i < num_rsp; i++) {
    575 		memcpy(class, (info+i)->dev_class, 3);
    576 		if ((class[0] == 0x00 && class[2] == 0x00 &&
    577 				(class[1] == 0x40 || class[1] == 0x1f)) ||
    578 				(class[0] == 0x10 && class[1] == 0x02 && class[2] == 0x40)) {
    579 			bacpy(&dst, &(info+i)->bdaddr);
    580 			ba2str(&dst, addr);
    581 
    582 			printf("\tConnecting to device %s\n", addr);
    583 			do_connect(ctl, &src, &dst, subclass, 1, bootonly, 0, timeout);
    584 		}
    585 	}
    586 
    587 done:
    588 	bt_free(info);
    589 
    590 	if (!num_rsp) {
    591 		fprintf(stderr, "\tNo devices in range or visible\n");
    592 		close(ctl);
    593 		exit(1);
    594 	}
    595 }
    596 
    597 static void do_kill(int ctl, bdaddr_t *bdaddr, uint32_t flags)
    598 {
    599 	struct hidp_conndel_req req;
    600 	struct hidp_connlist_req cl;
    601 	struct hidp_conninfo ci[16];
    602 	unsigned int i;
    603 
    604 	if (!bacmp(bdaddr, BDADDR_ALL)) {
    605 		cl.cnum = 16;
    606 		cl.ci   = ci;
    607 
    608 		if (ioctl(ctl, HIDPGETCONNLIST, &cl) < 0) {
    609 			perror("Can't get connection list");
    610 			close(ctl);
    611 			exit(1);
    612 		}
    613 
    614 		for (i = 0; i < cl.cnum; i++) {
    615 			bacpy(&req.bdaddr, &ci[i].bdaddr);
    616 			req.flags = flags;
    617 
    618 			if (ioctl(ctl, HIDPCONNDEL, &req) < 0) {
    619 				perror("Can't release connection");
    620 				close(ctl);
    621 				exit(1);
    622 			}
    623 		}
    624 
    625 	} else {
    626 		bacpy(&req.bdaddr, bdaddr);
    627 		req.flags = flags;
    628 
    629 		if (ioctl(ctl, HIDPCONNDEL, &req) < 0) {
    630 			perror("Can't release connection");
    631 			close(ctl);
    632 			exit(1);
    633 		}
    634 	}
    635 }
    636 
    637 static void usage(void)
    638 {
    639 	printf("hidd - Bluetooth HID daemon version %s\n\n", VERSION);
    640 
    641 	printf("Usage:\n"
    642 		"\thidd [options] [commands]\n"
    643 		"\n");
    644 
    645 	printf("Options:\n"
    646 		"\t-i <hciX|bdaddr>     Local HCI device or BD Address\n"
    647 		"\t-t <timeout>         Set idle timeout (in minutes)\n"
    648 		"\t-b <subclass>        Overwrite the boot mode subclass\n"
    649 		"\t-n, --nodaemon       Don't fork daemon to background\n"
    650 		"\t-h, --help           Display help\n"
    651 		"\n");
    652 
    653 	printf("Commands:\n"
    654 		"\t--server             Start HID server\n"
    655 		"\t--search             Search for HID devices\n"
    656 		"\t--connect <bdaddr>   Connect remote HID device\n"
    657 		"\t--unplug <bdaddr>    Unplug the HID connection\n"
    658 		"\t--kill <bdaddr>      Terminate HID connection\n"
    659 		"\t--killall            Terminate all connections\n"
    660 		"\t--show               List current HID connections\n"
    661 		"\n");
    662 }
    663 
    664 static struct option main_options[] = {
    665 	{ "help",	0, 0, 'h' },
    666 	{ "nodaemon",	0, 0, 'n' },
    667 	{ "subclass",	1, 0, 'b' },
    668 	{ "timeout",	1, 0, 't' },
    669 	{ "device",	1, 0, 'i' },
    670 	{ "master",	0, 0, 'M' },
    671 	{ "encrypt",	0, 0, 'E' },
    672 	{ "nosdp",	0, 0, 'D' },
    673 	{ "nocheck",	0, 0, 'Z' },
    674 	{ "bootonly",	0, 0, 'B' },
    675 	{ "hidonly",	0, 0, 'H' },
    676 	{ "show",	0, 0, 'l' },
    677 	{ "list",	0, 0, 'l' },
    678 	{ "server",	0, 0, 'd' },
    679 	{ "listen",	0, 0, 'd' },
    680 	{ "search",	0, 0, 's' },
    681 	{ "create",	1, 0, 'c' },
    682 	{ "connect",	1, 0, 'c' },
    683 	{ "disconnect",	1, 0, 'k' },
    684 	{ "terminate",	1, 0, 'k' },
    685 	{ "release",	1, 0, 'k' },
    686 	{ "kill",	1, 0, 'k' },
    687 	{ "killall",	0, 0, 'K' },
    688 	{ "unplug",	1, 0, 'u' },
    689 	{ 0, 0, 0, 0 }
    690 };
    691 
    692 int main(int argc, char *argv[])
    693 {
    694 	struct sigaction sa;
    695 	bdaddr_t bdaddr, dev;
    696 	uint32_t flags = 0;
    697 	uint8_t subclass = 0x00;
    698 	char addr[18];
    699 	int log_option = LOG_NDELAY | LOG_PID;
    700 	int opt, ctl, csk, isk;
    701 	int mode = SHOW, detach = 1, nosdp = 0, nocheck = 0, bootonly = 0;
    702 	int fakehid = 1, encrypt = 0, timeout = 30, lm = 0;
    703 
    704 	bacpy(&bdaddr, BDADDR_ANY);
    705 
    706 	while ((opt = getopt_long(argc, argv, "+i:nt:b:MEDZBHldsc:k:Ku:h", main_options, NULL)) != -1) {
    707 		switch(opt) {
    708 		case 'i':
    709 			if (!strncasecmp(optarg, "hci", 3))
    710 				hci_devba(atoi(optarg + 3), &bdaddr);
    711 			else
    712 				str2ba(optarg, &bdaddr);
    713 			break;
    714 		case 'n':
    715 			detach = 0;
    716 			break;
    717 		case 't':
    718 			timeout = atoi(optarg);
    719 			break;
    720 		case 'b':
    721 			if (!strncasecmp(optarg, "0x", 2))
    722 				subclass = (uint8_t) strtol(optarg, NULL, 16);
    723 			else
    724 				subclass = atoi(optarg);
    725 			break;
    726 		case 'M':
    727 			lm |= L2CAP_LM_MASTER;
    728 			break;
    729 		case 'E':
    730 			encrypt = 1;
    731 			break;
    732 		case 'D':
    733 			nosdp = 1;
    734 			break;
    735 		case 'Z':
    736 			nocheck = 1;
    737 			break;
    738 		case 'B':
    739 			bootonly = 1;
    740 			break;
    741 		case 'H':
    742 			fakehid = 0;
    743 			break;
    744 		case 'l':
    745 			mode = SHOW;
    746 			break;
    747 		case 'd':
    748 			mode = SERVER;
    749 			break;
    750 		case 's':
    751 			mode = SEARCH;
    752 			break;
    753 		case 'c':
    754 			str2ba(optarg, &dev);
    755 			mode = CONNECT;
    756 			break;
    757 		case 'k':
    758 			str2ba(optarg, &dev);
    759 			mode = KILL;
    760 			break;
    761 		case 'K':
    762 			bacpy(&dev, BDADDR_ALL);
    763 			mode = KILL;
    764 			break;
    765 		case 'u':
    766 			str2ba(optarg, &dev);
    767 			flags = (1 << HIDP_VIRTUAL_CABLE_UNPLUG);
    768 			mode = KILL;
    769 			break;
    770 		case 'h':
    771 			usage();
    772 			exit(0);
    773 		default:
    774 			exit(0);
    775 		}
    776 	}
    777 
    778 	ba2str(&bdaddr, addr);
    779 
    780 	ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HIDP);
    781 	if (ctl < 0) {
    782 		perror("Can't open HIDP control socket");
    783 		exit(1);
    784 	}
    785 
    786 	switch (mode) {
    787 	case SERVER:
    788 		csk = l2cap_listen(&bdaddr, L2CAP_PSM_HIDP_CTRL, lm, 10);
    789 		if (csk < 0) {
    790 			perror("Can't listen on HID control channel");
    791 			close(ctl);
    792 			exit(1);
    793 		}
    794 
    795 		isk = l2cap_listen(&bdaddr, L2CAP_PSM_HIDP_INTR, lm, 10);
    796 		if (isk < 0) {
    797 			perror("Can't listen on HID interrupt channel");
    798 			close(ctl);
    799 			close(csk);
    800 			exit(1);
    801 		}
    802 		break;
    803 
    804 	case SEARCH:
    805 		do_search(ctl, &bdaddr, subclass, fakehid, bootonly, encrypt, timeout);
    806 		close(ctl);
    807 		exit(0);
    808 
    809 	case CONNECT:
    810 		do_connect(ctl, &bdaddr, &dev, subclass, fakehid, bootonly, encrypt, timeout);
    811 		close(ctl);
    812 		exit(0);
    813 
    814 	case KILL:
    815 		do_kill(ctl, &dev, flags);
    816 		close(ctl);
    817 		exit(0);
    818 
    819 	default:
    820 		do_show(ctl);
    821 		close(ctl);
    822 		exit(0);
    823 	}
    824 
    825         if (detach) {
    826 		if (daemon(0, 0)) {
    827 			perror("Can't start daemon");
    828         	        exit(1);
    829 		}
    830 	} else
    831 		log_option |= LOG_PERROR;
    832 
    833 	openlog("hidd", log_option, LOG_DAEMON);
    834 
    835 	if (bacmp(&bdaddr, BDADDR_ANY))
    836 		syslog(LOG_INFO, "Bluetooth HID daemon (%s)", addr);
    837 	else
    838 		syslog(LOG_INFO, "Bluetooth HID daemon");
    839 
    840 	memset(&sa, 0, sizeof(sa));
    841 	sa.sa_flags = SA_NOCLDSTOP;
    842 
    843 	sa.sa_handler = sig_term;
    844 	sigaction(SIGTERM, &sa, NULL);
    845 	sigaction(SIGINT,  &sa, NULL);
    846 	sa.sa_handler = sig_hup;
    847 	sigaction(SIGHUP, &sa, NULL);
    848 
    849 	sa.sa_handler = SIG_IGN;
    850 	sigaction(SIGCHLD, &sa, NULL);
    851 	sigaction(SIGPIPE, &sa, NULL);
    852 
    853 	run_server(ctl, csk, isk, subclass, nosdp, nocheck, bootonly, encrypt, timeout);
    854 
    855 	syslog(LOG_INFO, "Exit");
    856 
    857 	close(csk);
    858 	close(isk);
    859 	close(ctl);
    860 
    861 	return 0;
    862 }
    863