static int open_monitor(const char *path) { struct sockaddr_hci addr; int opt = 1; snoop = btsnoop_create(path, BTSNOOP_TYPE_HCI); if (!snoop) return -1; monitor_fd = socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI); if (monitor_fd < 0) goto failed; memset(&addr, 0, sizeof(addr)); addr.hci_family = AF_BLUETOOTH; addr.hci_dev = HCI_DEV_NONE; addr.hci_channel = HCI_CHANNEL_MONITOR; if (bind(monitor_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) goto failed_close; if (setsockopt(monitor_fd, SOL_SOCKET, SO_TIMESTAMP, &opt, sizeof(opt)) < 0) goto failed_close; mainloop_add_fd(monitor_fd, EPOLLIN, data_callback, NULL, NULL); return 0; failed_close: close(monitor_fd); monitor_fd = -1; failed: btsnoop_unref(snoop); snoop = NULL; return -1; }
bool control_writer(const char *path) { btsnoop_file = btsnoop_create(path, 0, 0, BTSNOOP_FORMAT_MONITOR); return !!btsnoop_file; }