int main(int argc, char *argv[]) { unsigned long filter_mask = 0; const char *reader_path = NULL; const char *writer_path = NULL; const char *analyze_path = NULL; const char *ellisys_server = NULL; const char *tty = NULL; unsigned int tty_speed = B115200; unsigned short ellisys_port = 0; const char *str; int exit_status; sigset_t mask; mainloop_init(); filter_mask |= PACKET_FILTER_SHOW_TIME_OFFSET; for (;;) { int opt; opt = getopt_long(argc, argv, "d:r:w:a:s:p:i:tTSE:vh", main_options, NULL); if (opt < 0) break; switch (opt) { case 'd': tty= optarg; break; case 'B': tty_speed = tty_get_speed(atoi(optarg)); if (!tty_speed) { fprintf(stderr, "Unknown speed: %s\n", optarg); return EXIT_FAILURE; } break; case 'r': reader_path = optarg; break; case 'w': writer_path = optarg; break; case 'a': analyze_path = optarg; break; case 's': control_server(optarg); break; case 'p': packet_set_priority(optarg); break; case 'i': if (strlen(optarg) > 3 && !strncmp(optarg, "hci", 3)) str = optarg + 3; else str = optarg; if (!isdigit(*str)) { usage(); return EXIT_FAILURE; } packet_select_index(atoi(str)); break; case 't': filter_mask &= ~PACKET_FILTER_SHOW_TIME_OFFSET; filter_mask |= PACKET_FILTER_SHOW_TIME; break; case 'T': filter_mask &= ~PACKET_FILTER_SHOW_TIME_OFFSET; filter_mask |= PACKET_FILTER_SHOW_TIME; filter_mask |= PACKET_FILTER_SHOW_DATE; break; case 'S': filter_mask |= PACKET_FILTER_SHOW_SCO_DATA; break; case 'E': ellisys_server = optarg; ellisys_port = 24352; break; case '#': packet_todo(); lmp_todo(); return EXIT_SUCCESS; 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; } if (reader_path && analyze_path) { fprintf(stderr, "Display and analyze can't be combined\n"); return EXIT_FAILURE; } sigemptyset(&mask); sigaddset(&mask, SIGINT); sigaddset(&mask, SIGTERM); mainloop_set_signal(&mask, signal_callback, NULL, NULL); printf("Bluetooth monitor ver %s\n", VERSION); keys_setup(); packet_set_filter(filter_mask); if (analyze_path) { analyze_trace(analyze_path); return EXIT_SUCCESS; } if (reader_path) { if (ellisys_server) ellisys_enable(ellisys_server, ellisys_port); control_reader(reader_path); return EXIT_SUCCESS; } if (writer_path && !control_writer(writer_path)) { printf("Failed to open '%s'\n", writer_path); return EXIT_FAILURE; } if (ellisys_server) ellisys_enable(ellisys_server, ellisys_port); if (!tty && control_tracing() < 0) return EXIT_FAILURE; if (tty && control_tty(tty, tty_speed) < 0) return EXIT_FAILURE; exit_status = mainloop_run(); keys_cleanup(); 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; }