int main(int argc, char *argv[]) { unsigned long filter_mask = 0; sigset_t mask; mainloop_init(); for (;;) { int opt; opt = getopt_long(argc, argv, "b:vh", main_options, NULL); if (opt < 0) break; switch (opt) { case 'b': btsnoop_open(optarg); break; case 'v': printf("%s\n", VERSION); return EXIT_SUCCESS; case 'h': usage(); return EXIT_SUCCESS; default: return EXIT_FAILURE; } } sigemptyset(&mask); sigaddset(&mask, SIGINT); sigaddset(&mask, SIGTERM); mainloop_set_signal(&mask, signal_callback, NULL, NULL); filter_mask |= PACKET_FILTER_SHOW_INDEX; filter_mask |= PACKET_FILTER_SHOW_TIME; filter_mask |= PACKET_FILTER_SHOW_ACL_DATA; packet_set_filter(filter_mask); printf("Bluetooth monitor ver %s\n", VERSION); if (control_tracing() < 0) { if (hcidump_tracing() < 0) return EXIT_FAILURE; } return mainloop_run(); }
int control_tracing(void) { packet_add_filter(PACKET_FILTER_SHOW_INDEX); if (server_fd >= 0) return 0; if (open_channel(HCI_CHANNEL_MONITOR) < 0) { if (!hcidump_fallback) return -1; if (hcidump_tracing() < 0) return -1; return 0; } open_channel(HCI_CHANNEL_CONTROL); return 0; }