static bool create_vhci(struct hciemu *hciemu) { struct btdev *btdev; uint8_t create_req[2]; ssize_t written; int fd; btdev = btdev_create(hciemu->btdev_type, 0x00); if (!btdev) return false; btdev_set_command_handler(btdev, master_command_callback, hciemu); fd = open("/dev/vhci", O_RDWR | O_NONBLOCK | O_CLOEXEC); if (fd < 0) { perror("Opening /dev/vhci failed"); btdev_destroy(btdev); return false; } create_req[0] = HCI_VENDOR_PKT; create_req[1] = HCI_BREDR; written = write(fd, create_req, sizeof(create_req)); if (written < 0) { close(fd); btdev_destroy(btdev); return false; } hciemu->master_dev = btdev; hciemu->master_source = create_source_btdev(fd, btdev); return true; }
static bool create_stack(struct hciemu *hciemu) { struct btdev *btdev; struct bthost *bthost; int sv[2]; btdev = btdev_create(hciemu->btdev_type, 0x00); if (!btdev) return false; bthost = bthost_create(); if (!bthost) { btdev_destroy(btdev); return false; } btdev_set_command_handler(btdev, client_command_callback, hciemu); if (socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_NONBLOCK | SOCK_CLOEXEC, 0, sv) < 0) { bthost_destroy(bthost); btdev_destroy(btdev); return false; } hciemu->client_dev = btdev; hciemu->host_stack = bthost; hciemu->client_source = create_source_btdev(sv[0], btdev); hciemu->host_source = create_source_bthost(sv[1], bthost); return true; }
static bool create_vhci(struct hciemu *hciemu) { struct btdev *btdev; uint8_t bdaddr[6]; const char *str; int fd, i; btdev = btdev_create(hciemu->btdev_type, 0x00); if (!btdev) return false; str = hciemu_get_address(hciemu); for (i = 5; i >= 0; i--, str += 3) bdaddr[i] = strtol(str, NULL, 16); btdev_set_bdaddr(btdev, bdaddr); btdev_set_command_handler(btdev, master_command_callback, hciemu); fd = open("/dev/vhci", O_RDWR | O_NONBLOCK | O_CLOEXEC); if (fd < 0) { btdev_destroy(btdev); return false; } hciemu->master_dev = btdev; hciemu->master_source = create_source_btdev(fd, btdev); return true; }