void SDL_UDEV_Poll(void) { struct udev_device *dev = NULL; const char *action = NULL; if (_this == NULL) { return; } while (SDL_UDEV_hotplug_update_available()) { dev = _this->udev_monitor_receive_device(_this->udev_mon); if (dev == NULL) { break; } action = _this->udev_device_get_action(dev); if (SDL_strcmp(action, "add") == 0) { /* Wait for the device to finish initialization */ SDL_Delay(100); device_event(SDL_UDEV_DEVICEADDED, dev); } else if (SDL_strcmp(action, "remove") == 0) { device_event(SDL_UDEV_DEVICEREMOVED, dev); } _this->udev_device_unref(dev); } }
static int init_known_adapters(int ctl) { struct hci_dev_list_req *dl; struct hci_dev_req *dr; int i, err; dl = g_try_malloc0(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t)); if (!dl) { err = errno; error("Can't allocate devlist buffer: %s (%d)", strerror(err), err); return -err; } dl->dev_num = HCI_MAX_DEV; dr = dl->dev_req; if (ioctl(ctl, HCIGETDEVLIST, (void *) dl) < 0) { err = errno; error("Can't get device list: %s (%d)", strerror(err), err); g_free(dl); return -err; } for (i = 0; i < dl->dev_num; i++, dr++) { device_event(HCI_DEV_REG, dr->dev_id); if (hci_test_bit(HCI_UP, &dr->dev_opt)) device_event(HCI_DEV_UP, dr->dev_id); } g_free(dl); return 0; }
void SDL_UDEV_Scan(void) { struct udev_enumerate *enumerate = NULL; struct udev_list_entry *devs = NULL; struct udev_list_entry *item = NULL; if (_this == NULL) { return; } enumerate = _this->udev_enumerate_new(_this->udev); if (enumerate == NULL) { SDL_UDEV_Quit(); SDL_SetError("udev_monitor_new_from_netlink() failed"); return; } _this->udev_enumerate_add_match_subsystem(enumerate, "input"); _this->udev_enumerate_add_match_subsystem(enumerate, "sound"); _this->udev_enumerate_scan_devices(enumerate); devs = _this->udev_enumerate_get_list_entry(enumerate); for (item = devs; item; item = _this->udev_list_entry_get_next(item)) { const char *path = _this->udev_list_entry_get_name(item); struct udev_device *dev = _this->udev_device_new_from_syspath(_this->udev, path); if (dev != NULL) { device_event(SDL_UDEV_DEVICEADDED, dev); _this->udev_device_unref(dev); } } _this->udev_enumerate_unref(enumerate); }
static gboolean io_stack_event(GIOChannel *chan, GIOCondition cond, gpointer data) { unsigned char buf[HCI_MAX_FRAME_SIZE], *ptr; evt_stack_internal *si; evt_si_device *sd; hci_event_hdr *eh; int type; size_t len; GIOError err; ptr = buf; err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), &len); if (err) { if (err == G_IO_ERROR_AGAIN) return TRUE; error("Read from control socket failed: %s (%d)", strerror(errno), errno); return FALSE; } type = *ptr++; if (type != HCI_EVENT_PKT) return TRUE; eh = (hci_event_hdr *) ptr; if (eh->evt != EVT_STACK_INTERNAL) return TRUE; ptr += HCI_EVENT_HDR_SIZE; si = (evt_stack_internal *) ptr; switch (si->type) { case EVT_SI_DEVICE: sd = (void *) &si->data; device_event(sd->event, sd->dev_id); break; } return TRUE; }