int main(int argc, char *argv[]) { const char *bredr_path = NULL, *amp_path = NULL, *proto = NULL; bool raw_device = false; sigset_t mask; int exit_status, count = 0, proto_id = HCI_UART_H4; for (;;) { int opt; opt = getopt_long(argc, argv, "B:A:P:Rvh", main_options, NULL); if (opt < 0) break; switch (opt) { case 'B': bredr_path = optarg; break; case 'A': amp_path = optarg; break; case 'P': proto = optarg; break; case 'R': raw_device = true; break; case 'v': printf("%s\n", VERSION); return EXIT_SUCCESS; case 'h': usage(); return EXIT_SUCCESS; default: return EXIT_FAILURE; } } if (argc - optind > 0) { fprintf(stderr, "Invalid command line parameters\n"); return EXIT_FAILURE; } mainloop_init(); sigemptyset(&mask); sigaddset(&mask, SIGINT); sigaddset(&mask, SIGTERM); mainloop_set_signal(&mask, signal_callback, NULL, NULL); if (proto) { unsigned int i; for (i = 0; proto_table[i].name; i++) { if (!strcmp(proto_table[i].name, proto)) { proto_id = proto_table[i].id; break; } } if (!proto_table[i].name) { fprintf(stderr, "Invalid protocol\n"); return EXIT_FAILURE; } } if (bredr_path) { unsigned long flags; int fd; printf("Attaching BR/EDR controller to %s\n", bredr_path); flags = (1 << HCI_UART_RESET_ON_INIT); if (raw_device) flags = (1 << HCI_UART_RAW_DEVICE); fd = attach_proto(bredr_path, proto_id, flags); if (fd >= 0) { mainloop_add_fd(fd, 0, uart_callback, NULL, NULL); count++; } } if (amp_path) { unsigned long flags; int fd; printf("Attaching AMP controller to %s\n", amp_path); flags = (1 << HCI_UART_RESET_ON_INIT) | (1 << HCI_UART_CREATE_AMP); if (raw_device) flags = (1 << HCI_UART_RAW_DEVICE); fd = attach_proto(amp_path, proto_id, flags); if (fd >= 0) { mainloop_add_fd(fd, 0, uart_callback, NULL, NULL); count++; } } if (count < 1) { fprintf(stderr, "No controller attached\n"); return EXIT_FAILURE; } exit_status = mainloop_run(); return exit_status; }
int main(int argc, char *argv[]) { const char *bredr_path = NULL, *amp_path = NULL, *proto = NULL; bool flowctl = true, raw_device = false; int exit_status, count = 0, proto_id = HCI_UART_H4; unsigned int speed = B115200; for (;;) { int opt; opt = getopt_long(argc, argv, "B:A:P:S:NRvh", main_options, NULL); if (opt < 0) break; switch (opt) { case 'B': bredr_path = optarg; break; case 'A': amp_path = optarg; break; case 'P': proto = optarg; break; case 'S': speed = tty_get_speed(atoi(optarg)); if (!speed) { fprintf(stderr, "Invalid speed: %s\n", optarg); return EXIT_FAILURE; } break; case 'N': flowctl = false; break; case 'R': raw_device = true; break; case 'v': printf("%s\n", VERSION); return EXIT_SUCCESS; case 'h': usage(); return EXIT_SUCCESS; default: return EXIT_FAILURE; } } if (argc - optind > 0) { fprintf(stderr, "Invalid command line parameters\n"); return EXIT_FAILURE; } mainloop_init(); if (proto) { unsigned int i; for (i = 0; proto_table[i].name; i++) { if (!strcmp(proto_table[i].name, proto)) { proto_id = proto_table[i].id; break; } } if (!proto_table[i].name) { fprintf(stderr, "Invalid protocol\n"); return EXIT_FAILURE; } } if (bredr_path) { unsigned long flags; int fd; printf("Attaching Primary controller to %s\n", bredr_path); flags = (1 << HCI_UART_RESET_ON_INIT); if (raw_device) flags = (1 << HCI_UART_RAW_DEVICE); fd = attach_proto(bredr_path, proto_id, speed, flowctl, flags); if (fd >= 0) { mainloop_add_fd(fd, 0, uart_callback, NULL, NULL); count++; } } if (amp_path) { unsigned long flags; int fd; printf("Attaching AMP controller to %s\n", amp_path); flags = (1 << HCI_UART_RESET_ON_INIT) | (1 << HCI_UART_CREATE_AMP); if (raw_device) flags = (1 << HCI_UART_RAW_DEVICE); fd = attach_proto(amp_path, proto_id, speed, flowctl, flags); if (fd >= 0) { mainloop_add_fd(fd, 0, uart_callback, NULL, NULL); count++; } } if (count < 1) { fprintf(stderr, "No controller attached\n"); return EXIT_FAILURE; } exit_status = mainloop_run_with_signal(signal_callback, NULL); return exit_status; }