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 int 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 246 return write(csk, buf, sizeof(buf)); 247 } 248 249 static int create_device(int ctl, int csk, int isk, uint8_t subclass, int nosdp, int nocheck, int bootonly, int encrypt, int timeout) 250 { 251 struct hidp_connadd_req req; 252 struct sockaddr_l2 addr; 253 socklen_t addrlen; 254 bdaddr_t src, dst; 255 char bda[18]; 256 int err; 257 258 memset(&addr, 0, sizeof(addr)); 259 addrlen = sizeof(addr); 260 261 if (getsockname(csk, (struct sockaddr *) &addr, &addrlen) < 0) 262 return -1; 263 264 bacpy(&src, &addr.l2_bdaddr); 265 266 memset(&addr, 0, sizeof(addr)); 267 addrlen = sizeof(addr); 268 269 if (getpeername(csk, (struct sockaddr *) &addr, &addrlen) < 0) 270 return -1; 271 272 bacpy(&dst, &addr.l2_bdaddr); 273 274 memset(&req, 0, sizeof(req)); 275 req.ctrl_sock = csk; 276 req.intr_sock = isk; 277 req.flags = 0; 278 req.idle_to = timeout * 60; 279 280 err = get_stored_device_info(&src, &dst, &req); 281 if (!err) 282 goto create; 283 284 if (!nocheck) { 285 ba2str(&dst, bda); 286 syslog(LOG_ERR, "Rejected connection from unknown device %s", bda); 287 /* Return no error to avoid run_server() complaining too */ 288 return 0; 289 } 290 291 if (!nosdp) { 292 err = get_sdp_device_info(&src, &dst, &req); 293 if (err < 0) 294 goto error; 295 } else { 296 struct l2cap_conninfo conn; 297 socklen_t size; 298 uint8_t class[3]; 299 300 memset(&conn, 0, sizeof(conn)); 301 size = sizeof(conn); 302 if (getsockopt(csk, SOL_L2CAP, L2CAP_CONNINFO, &conn, &size) < 0) 303 memset(class, 0, 3); 304 else 305 memcpy(class, conn.dev_class, 3); 306 307 if (class[1] == 0x25 && (class[2] == 0x00 || class[2] == 0x01)) 308 req.subclass = class[0]; 309 else 310 req.subclass = 0xc0; 311 } 312 313 create: 314 if (subclass != 0x00) 315 req.subclass = subclass; 316 317 ba2str(&dst, bda); 318 syslog(LOG_INFO, "New HID device %s (%s)", bda, req.name); 319 320 if (encrypt && (req.subclass & 0x40)) { 321 err = request_authentication(&src, &dst); 322 if (err < 0) { 323 syslog(LOG_ERR, "Authentication for %s failed", bda); 324 goto error; 325 } 326 327 err = request_encryption(&src, &dst); 328 if (err < 0) 329 syslog(LOG_ERR, "Encryption for %s failed", bda); 330 } 331 332 if (bootonly) { 333 req.rd_size = 0; 334 req.flags |= (1 << HIDP_BOOT_PROTOCOL_MODE); 335 } 336 337 if (req.vendor == 0x054c && req.product == 0x0268) 338 enable_sixaxis(csk); 339 340 err = ioctl(ctl, HIDPCONNADD, &req); 341 342 error: 343 free(req.rd_data); 344 345 return err; 346 } 347 348 static void run_server(int ctl, int csk, int isk, uint8_t subclass, int nosdp, int nocheck, int bootonly, int encrypt, int timeout) 349 { 350 struct pollfd p[2]; 351 sigset_t sigs; 352 short events; 353 int err, ncsk, nisk; 354 355 sigfillset(&sigs); 356 sigdelset(&sigs, SIGCHLD); 357 sigdelset(&sigs, SIGPIPE); 358 sigdelset(&sigs, SIGTERM); 359 sigdelset(&sigs, SIGINT); 360 sigdelset(&sigs, SIGHUP); 361 362 p[0].fd = csk; 363 p[0].events = POLLIN | POLLERR | POLLHUP; 364 365 p[1].fd = isk; 366 p[1].events = POLLIN | POLLERR | POLLHUP; 367 368 while (!__io_canceled) { 369 p[0].revents = 0; 370 p[1].revents = 0; 371 372 if (ppoll(p, 2, NULL, &sigs) < 1) 373 continue; 374 375 events = p[0].revents | p[1].revents; 376 377 if (events & POLLIN) { 378 ncsk = l2cap_accept(csk, NULL); 379 nisk = l2cap_accept(isk, NULL); 380 381 err = create_device(ctl, ncsk, nisk, subclass, nosdp, nocheck, bootonly, encrypt, timeout); 382 if (err < 0) 383 syslog(LOG_ERR, "HID create error %d (%s)", 384 errno, strerror(errno)); 385 386 close(nisk); 387 sleep(1); 388 close(ncsk); 389 } 390 } 391 } 392 393 static char *hidp_state[] = { 394 "unknown", 395 "connected", 396 "open", 397 "bound", 398 "listening", 399 "connecting", 400 "connecting", 401 "config", 402 "disconnecting", 403 "closed" 404 }; 405 406 static char *hidp_flagstostr(uint32_t flags) 407 { 408 static char str[100]; 409 str[0] = 0; 410 411 strcat(str, "["); 412 413 if (flags & (1 << HIDP_BOOT_PROTOCOL_MODE)) 414 strcat(str, "boot-protocol"); 415 416 strcat(str, "]"); 417 418 return str; 419 } 420 421 static void do_show(int ctl) 422 { 423 struct hidp_connlist_req req; 424 struct hidp_conninfo ci[16]; 425 char addr[18]; 426 unsigned int i; 427 428 req.cnum = 16; 429 req.ci = ci; 430 431 if (ioctl(ctl, HIDPGETCONNLIST, &req) < 0) { 432 perror("Can't get connection list"); 433 close(ctl); 434 exit(1); 435 } 436 437 for (i = 0; i < req.cnum; i++) { 438 ba2str(&ci[i].bdaddr, addr); 439 printf("%s %s [%04x:%04x] %s %s\n", addr, ci[i].name, 440 ci[i].vendor, ci[i].product, hidp_state[ci[i].state], 441 ci[i].flags ? hidp_flagstostr(ci[i].flags) : ""); 442 } 443 } 444 445 static void do_connect(int ctl, bdaddr_t *src, bdaddr_t *dst, uint8_t subclass, int fakehid, int bootonly, int encrypt, int timeout) 446 { 447 struct hidp_connadd_req req; 448 uint16_t uuid = HID_SVCLASS_ID; 449 uint8_t channel = 0; 450 char name[256]; 451 int csk, isk, err; 452 453 memset(&req, 0, sizeof(req)); 454 name[0] = '\0'; 455 456 err = get_sdp_device_info(src, dst, &req); 457 if (err < 0 && fakehid) 458 err = get_alternate_device_info(src, dst, 459 &uuid, &channel, name, sizeof(name) - 1); 460 461 if (err < 0) { 462 perror("Can't get device information"); 463 close(ctl); 464 exit(1); 465 } 466 467 switch (uuid) { 468 case HID_SVCLASS_ID: 469 goto connect; 470 471 case SERIAL_PORT_SVCLASS_ID: 472 if (subclass == 0x40 || !strcmp(name, "Cable Replacement")) { 473 if (epox_presenter(src, dst, channel) < 0) { 474 close(ctl); 475 exit(1); 476 } 477 break; 478 } 479 if (subclass == 0x1f || !strcmp(name, "SPP slave")) { 480 if (jthree_keyboard(src, dst, channel) < 0) { 481 close(ctl); 482 exit(1); 483 } 484 break; 485 } 486 if (subclass == 0x02 || !strcmp(name, "Serial Port")) { 487 if (celluon_keyboard(src, dst, channel) < 0) { 488 close(ctl); 489 exit(1); 490 } 491 break; 492 } 493 break; 494 495 case HEADSET_SVCLASS_ID: 496 case HANDSFREE_SVCLASS_ID: 497 if (headset_presenter(src, dst, channel) < 0) { 498 close(ctl); 499 exit(1); 500 } 501 break; 502 } 503 504 return; 505 506 connect: 507 csk = l2cap_connect(src, dst, L2CAP_PSM_HIDP_CTRL); 508 if (csk < 0) { 509 perror("Can't create HID control channel"); 510 close(ctl); 511 exit(1); 512 } 513 514 isk = l2cap_connect(src, dst, L2CAP_PSM_HIDP_INTR); 515 if (isk < 0) { 516 perror("Can't create HID interrupt channel"); 517 close(csk); 518 close(ctl); 519 exit(1); 520 } 521 522 err = create_device(ctl, csk, isk, subclass, 1, 1, bootonly, encrypt, timeout); 523 if (err < 0) { 524 fprintf(stderr, "HID create error %d (%s)\n", 525 errno, strerror(errno)); 526 close(isk); 527 sleep(1); 528 close(csk); 529 close(ctl); 530 exit(1); 531 } 532 } 533 534 static void do_search(int ctl, bdaddr_t *bdaddr, uint8_t subclass, int fakehid, int bootonly, int encrypt, int timeout) 535 { 536 inquiry_info *info = NULL; 537 bdaddr_t src, dst; 538 int i, dev_id, num_rsp, length, flags; 539 char addr[18]; 540 uint8_t class[3]; 541 542 ba2str(bdaddr, addr); 543 dev_id = hci_devid(addr); 544 if (dev_id < 0) { 545 dev_id = hci_get_route(NULL); 546 hci_devba(dev_id, &src); 547 } else 548 bacpy(&src, bdaddr); 549 550 length = 8; /* ~10 seconds */ 551 num_rsp = 0; 552 flags = IREQ_CACHE_FLUSH; 553 554 printf("Searching ...\n"); 555 556 num_rsp = hci_inquiry(dev_id, length, num_rsp, NULL, &info, flags); 557 558 for (i = 0; i < num_rsp; i++) { 559 memcpy(class, (info+i)->dev_class, 3); 560 if (class[1] == 0x25 && (class[2] == 0x00 || class[2] == 0x01)) { 561 bacpy(&dst, &(info+i)->bdaddr); 562 ba2str(&dst, addr); 563 564 printf("\tConnecting to device %s\n", addr); 565 do_connect(ctl, &src, &dst, subclass, fakehid, bootonly, encrypt, timeout); 566 } 567 } 568 569 if (!fakehid) 570 goto done; 571 572 for (i = 0; i < num_rsp; i++) { 573 memcpy(class, (info+i)->dev_class, 3); 574 if ((class[0] == 0x00 && class[2] == 0x00 && 575 (class[1] == 0x40 || class[1] == 0x1f)) || 576 (class[0] == 0x10 && class[1] == 0x02 && class[2] == 0x40)) { 577 bacpy(&dst, &(info+i)->bdaddr); 578 ba2str(&dst, addr); 579 580 printf("\tConnecting to device %s\n", addr); 581 do_connect(ctl, &src, &dst, subclass, 1, bootonly, 0, timeout); 582 } 583 } 584 585 done: 586 bt_free(info); 587 588 if (!num_rsp) { 589 fprintf(stderr, "\tNo devices in range or visible\n"); 590 close(ctl); 591 exit(1); 592 } 593 } 594 595 static void do_kill(int ctl, bdaddr_t *bdaddr, uint32_t flags) 596 { 597 struct hidp_conndel_req req; 598 struct hidp_connlist_req cl; 599 struct hidp_conninfo ci[16]; 600 unsigned int i; 601 602 if (!bacmp(bdaddr, BDADDR_ALL)) { 603 cl.cnum = 16; 604 cl.ci = ci; 605 606 if (ioctl(ctl, HIDPGETCONNLIST, &cl) < 0) { 607 perror("Can't get connection list"); 608 close(ctl); 609 exit(1); 610 } 611 612 for (i = 0; i < cl.cnum; i++) { 613 bacpy(&req.bdaddr, &ci[i].bdaddr); 614 req.flags = flags; 615 616 if (ioctl(ctl, HIDPCONNDEL, &req) < 0) { 617 perror("Can't release connection"); 618 close(ctl); 619 exit(1); 620 } 621 } 622 623 } else { 624 bacpy(&req.bdaddr, bdaddr); 625 req.flags = flags; 626 627 if (ioctl(ctl, HIDPCONNDEL, &req) < 0) { 628 perror("Can't release connection"); 629 close(ctl); 630 exit(1); 631 } 632 } 633 } 634 635 static void usage(void) 636 { 637 printf("hidd - Bluetooth HID daemon version %s\n\n", VERSION); 638 639 printf("Usage:\n" 640 "\thidd [options] [commands]\n" 641 "\n"); 642 643 printf("Options:\n" 644 "\t-i <hciX|bdaddr> Local HCI device or BD Address\n" 645 "\t-t <timeout> Set idle timeout (in minutes)\n" 646 "\t-b <subclass> Overwrite the boot mode subclass\n" 647 "\t-n, --nodaemon Don't fork daemon to background\n" 648 "\t-h, --help Display help\n" 649 "\n"); 650 651 printf("Commands:\n" 652 "\t--server Start HID server\n" 653 "\t--search Search for HID devices\n" 654 "\t--connect <bdaddr> Connect remote HID device\n" 655 "\t--unplug <bdaddr> Unplug the HID connection\n" 656 "\t--kill <bdaddr> Terminate HID connection\n" 657 "\t--killall Terminate all connections\n" 658 "\t--show List current HID connections\n" 659 "\n"); 660 } 661 662 static struct option main_options[] = { 663 { "help", 0, 0, 'h' }, 664 { "nodaemon", 0, 0, 'n' }, 665 { "subclass", 1, 0, 'b' }, 666 { "timeout", 1, 0, 't' }, 667 { "device", 1, 0, 'i' }, 668 { "master", 0, 0, 'M' }, 669 { "encrypt", 0, 0, 'E' }, 670 { "nosdp", 0, 0, 'D' }, 671 { "nocheck", 0, 0, 'Z' }, 672 { "bootonly", 0, 0, 'B' }, 673 { "hidonly", 0, 0, 'H' }, 674 { "show", 0, 0, 'l' }, 675 { "list", 0, 0, 'l' }, 676 { "server", 0, 0, 'd' }, 677 { "listen", 0, 0, 'd' }, 678 { "search", 0, 0, 's' }, 679 { "create", 1, 0, 'c' }, 680 { "connect", 1, 0, 'c' }, 681 { "disconnect", 1, 0, 'k' }, 682 { "terminate", 1, 0, 'k' }, 683 { "release", 1, 0, 'k' }, 684 { "kill", 1, 0, 'k' }, 685 { "killall", 0, 0, 'K' }, 686 { "unplug", 1, 0, 'u' }, 687 { 0, 0, 0, 0 } 688 }; 689 690 int main(int argc, char *argv[]) 691 { 692 struct sigaction sa; 693 bdaddr_t bdaddr, dev; 694 uint32_t flags = 0; 695 uint8_t subclass = 0x00; 696 char addr[18]; 697 int log_option = LOG_NDELAY | LOG_PID; 698 int opt, ctl, csk, isk; 699 int mode = SHOW, detach = 1, nosdp = 0, nocheck = 0, bootonly = 0; 700 int fakehid = 1, encrypt = 0, timeout = 30, lm = 0; 701 702 bacpy(&bdaddr, BDADDR_ANY); 703 704 while ((opt = getopt_long(argc, argv, "+i:nt:b:MEDZBHldsc:k:Ku:h", main_options, NULL)) != -1) { 705 switch(opt) { 706 case 'i': 707 if (!strncasecmp(optarg, "hci", 3)) 708 hci_devba(atoi(optarg + 3), &bdaddr); 709 else 710 str2ba(optarg, &bdaddr); 711 break; 712 case 'n': 713 detach = 0; 714 break; 715 case 't': 716 timeout = atoi(optarg); 717 break; 718 case 'b': 719 if (!strncasecmp(optarg, "0x", 2)) 720 subclass = (uint8_t) strtol(optarg, NULL, 16); 721 else 722 subclass = atoi(optarg); 723 break; 724 case 'M': 725 lm |= L2CAP_LM_MASTER; 726 break; 727 case 'E': 728 encrypt = 1; 729 break; 730 case 'D': 731 nosdp = 1; 732 break; 733 case 'Z': 734 nocheck = 1; 735 break; 736 case 'B': 737 bootonly = 1; 738 break; 739 case 'H': 740 fakehid = 0; 741 break; 742 case 'l': 743 mode = SHOW; 744 break; 745 case 'd': 746 mode = SERVER; 747 break; 748 case 's': 749 mode = SEARCH; 750 break; 751 case 'c': 752 str2ba(optarg, &dev); 753 mode = CONNECT; 754 break; 755 case 'k': 756 str2ba(optarg, &dev); 757 mode = KILL; 758 break; 759 case 'K': 760 bacpy(&dev, BDADDR_ALL); 761 mode = KILL; 762 break; 763 case 'u': 764 str2ba(optarg, &dev); 765 flags = (1 << HIDP_VIRTUAL_CABLE_UNPLUG); 766 mode = KILL; 767 break; 768 case 'h': 769 usage(); 770 exit(0); 771 default: 772 exit(0); 773 } 774 } 775 776 ba2str(&bdaddr, addr); 777 778 ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HIDP); 779 if (ctl < 0) { 780 perror("Can't open HIDP control socket"); 781 exit(1); 782 } 783 784 switch (mode) { 785 case SERVER: 786 csk = l2cap_listen(&bdaddr, L2CAP_PSM_HIDP_CTRL, lm, 10); 787 if (csk < 0) { 788 perror("Can't listen on HID control channel"); 789 close(ctl); 790 exit(1); 791 } 792 793 isk = l2cap_listen(&bdaddr, L2CAP_PSM_HIDP_INTR, lm, 10); 794 if (isk < 0) { 795 perror("Can't listen on HID interrupt channel"); 796 close(ctl); 797 close(csk); 798 exit(1); 799 } 800 break; 801 802 case SEARCH: 803 do_search(ctl, &bdaddr, subclass, fakehid, bootonly, encrypt, timeout); 804 close(ctl); 805 exit(0); 806 807 case CONNECT: 808 do_connect(ctl, &bdaddr, &dev, subclass, fakehid, bootonly, encrypt, timeout); 809 close(ctl); 810 exit(0); 811 812 case KILL: 813 do_kill(ctl, &dev, flags); 814 close(ctl); 815 exit(0); 816 817 default: 818 do_show(ctl); 819 close(ctl); 820 exit(0); 821 } 822 823 if (detach) { 824 if (daemon(0, 0)) { 825 perror("Can't start daemon"); 826 exit(1); 827 } 828 } else 829 log_option |= LOG_PERROR; 830 831 openlog("hidd", log_option, LOG_DAEMON); 832 833 if (bacmp(&bdaddr, BDADDR_ANY)) 834 syslog(LOG_INFO, "Bluetooth HID daemon (%s)", addr); 835 else 836 syslog(LOG_INFO, "Bluetooth HID daemon"); 837 838 memset(&sa, 0, sizeof(sa)); 839 sa.sa_flags = SA_NOCLDSTOP; 840 841 sa.sa_handler = sig_term; 842 sigaction(SIGTERM, &sa, NULL); 843 sigaction(SIGINT, &sa, NULL); 844 sa.sa_handler = sig_hup; 845 sigaction(SIGHUP, &sa, NULL); 846 847 sa.sa_handler = SIG_IGN; 848 sigaction(SIGCHLD, &sa, NULL); 849 sigaction(SIGPIPE, &sa, NULL); 850 851 run_server(ctl, csk, isk, subclass, nosdp, nocheck, bootonly, encrypt, timeout); 852 853 syslog(LOG_INFO, "Exit"); 854 855 close(csk); 856 close(isk); 857 close(ctl); 858 859 return 0; 860 } 861