static int uhid_create(struct hid_device *dev) { GIOCondition cond = G_IO_IN | G_IO_ERR | G_IO_NVAL; struct uhid_event ev; GIOChannel *io; int err; dev->uhid_fd = open(UHID_DEVICE_FILE, O_RDWR | O_CLOEXEC); if (dev->uhid_fd < 0) { err = -errno; error("Failed to open uHID device: %s", strerror(errno)); return err; } memset(&ev, 0, sizeof(ev)); ev.type = UHID_CREATE; strcpy((char *) ev.u.create.name, "bluez-input-device"); ev.u.create.bus = BUS_BLUETOOTH; ev.u.create.vendor = dev->vendor; ev.u.create.product = dev->product; ev.u.create.version = dev->version; ev.u.create.country = dev->country; ev.u.create.rd_size = dev->rd_size; ev.u.create.rd_data = dev->rd_data; if (write(dev->uhid_fd, &ev, sizeof(ev)) < 0) { err = -errno; error("Failed to create uHID device: %s", strerror(errno)); close(dev->uhid_fd); dev->uhid_fd = -1; return err; } io = g_io_channel_unix_new(dev->uhid_fd); g_io_channel_set_encoding(io, NULL, NULL); dev->uhid_watch_id = g_io_add_watch(io, cond, uhid_event_cb, dev); g_io_channel_unref(io); bt_hid_set_info(dev); return 0; }
static int uhid_create(struct hid_device *dev) { struct uhid_event ev; int err; dev->uhid = bt_uhid_new_default(); if (!dev->uhid) { err = -errno; error("hidhost: Failed to create bt_uhid instance"); return err; } memset(&ev, 0, sizeof(ev)); ev.type = UHID_CREATE; strcpy((char *) ev.u.create.name, "bluez-input-device"); ev.u.create.bus = BUS_BLUETOOTH; ev.u.create.vendor = dev->vendor; ev.u.create.product = dev->product; ev.u.create.version = dev->version; ev.u.create.country = dev->country; ev.u.create.rd_size = dev->rd_size; ev.u.create.rd_data = dev->rd_data; err = bt_uhid_send(dev->uhid, &ev); if (err < 0) { error("hidhost: Failed to create uHID device: %s", strerror(-err)); bt_uhid_unref(dev->uhid); dev->uhid = NULL; return err; } bt_uhid_register(dev->uhid, UHID_OUTPUT, handle_uhid_output, dev); bt_hid_set_info(dev); return 0; }