int obsd_set_configuration(struct libusb_device_handle *handle, int config) { struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; usbi_dbg("configuration %d", config); if (ioctl(dpriv->fd, USB_SET_CONFIG, &config) < 0) return _errno_to_libusb(errno); return _cache_active_config_descriptor(handle->dev, dpriv->fd); }
int obsd_set_configuration(struct libusb_device_handle *handle, int config) { struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; if (dpriv->devname == NULL) return (LIBUSB_ERROR_NOT_SUPPORTED); usbi_dbg("bConfigurationValue %d", config); if (ioctl(dpriv->fd, USB_SET_CONFIG, &config) < 0) return _errno_to_libusb(errno); return _cache_active_config_descriptor(handle->dev); }
int obsd_get_device_list(struct libusb_context * ctx, struct discovered_devs **discdevs) { struct libusb_device *dev; struct device_priv *dpriv; struct usb_device_info di; unsigned long session_id; char devnode[16]; int fd, err, i; usbi_dbg(""); for (i = 0; i < USB_MAX_DEVICES; i++) { snprintf(devnode, sizeof(devnode), "/dev/ugen%d.00", i); if ((fd = open(devnode, O_RDONLY)) < 0) { if (errno != ENOENT && errno != ENXIO) usbi_err(ctx, "could not open %s", devnode); continue; } if (ioctl(fd, USB_GET_DEVICEINFO, &di) < 0) continue; session_id = (di.udi_bus << 8 | di.udi_addr); dev = usbi_get_device_by_session_id(ctx, session_id); if (dev == NULL) { dev = usbi_alloc_device(ctx, session_id); if (dev == NULL) return (LIBUSB_ERROR_NO_MEM); dev->bus_number = di.udi_bus; dev->device_address = di.udi_addr; dev->speed = di.udi_speed; dpriv = (struct device_priv *)dev->os_priv; strlcpy(dpriv->devnode, devnode, sizeof(devnode)); dpriv->fd = -1; if (ioctl(fd, USB_GET_DEVICE_DESC, &dpriv->ddesc) < 0) { err = errno; goto error; } dpriv->cdesc = NULL; if (_cache_active_config_descriptor(dev, fd)) { err = errno; goto error; } if ((err = usbi_sanitize_device(dev))) goto error; } close(fd); if (discovered_devs_append(*discdevs, dev) == NULL) return (LIBUSB_ERROR_NO_MEM); } return (LIBUSB_SUCCESS); error: close(fd); libusb_unref_device(dev); return _errno_to_libusb(err); }
int obsd_get_device_list(struct libusb_context * ctx, struct discovered_devs **discdevs) { struct discovered_devs *ddd; struct libusb_device *dev; struct device_priv *dpriv; struct usb_device_info di; struct usb_device_ddesc dd; unsigned long session_id; char devices[USB_MAX_DEVICES]; char busnode[16]; char *udevname; int fd, addr, i, j; usbi_dbg(""); for (i = 0; i < 8; i++) { snprintf(busnode, sizeof(busnode), USBDEV "%d", i); if ((fd = open(busnode, O_RDWR)) < 0) { if (errno != ENOENT && errno != ENXIO) usbi_err(ctx, "could not open %s", busnode); continue; } bzero(devices, sizeof(devices)); for (addr = 1; addr < USB_MAX_DEVICES; addr++) { if (devices[addr]) continue; di.udi_addr = addr; if (ioctl(fd, USB_DEVICEINFO, &di) < 0) continue; /* * XXX If ugen(4) is attached to the USB device * it will be used. */ udevname = NULL; for (j = 0; j < USB_MAX_DEVNAMES; j++) if (!strncmp("ugen", di.udi_devnames[j], 4)) { udevname = strdup(di.udi_devnames[j]); break; } session_id = (di.udi_bus << 8 | di.udi_addr); dev = usbi_get_device_by_session_id(ctx, session_id); if (dev == NULL) { dev = usbi_alloc_device(ctx, session_id); if (dev == NULL) { close(fd); return (LIBUSB_ERROR_NO_MEM); } dev->bus_number = di.udi_bus; dev->device_address = di.udi_addr; dev->speed = di.udi_speed; dpriv = (struct device_priv *)dev->os_priv; dpriv->fd = -1; dpriv->cdesc = NULL; dpriv->devname = udevname; dd.udd_bus = di.udi_bus; dd.udd_addr = di.udi_addr; if (ioctl(fd, USB_DEVICE_GET_DDESC, &dd) < 0) { libusb_unref_device(dev); continue; } dpriv->ddesc = dd.udd_desc; if (_cache_active_config_descriptor(dev)) { libusb_unref_device(dev); continue; } if (usbi_sanitize_device(dev)) { libusb_unref_device(dev); continue; } } ddd = discovered_devs_append(*discdevs, dev); if (ddd == NULL) { close(fd); return (LIBUSB_ERROR_NO_MEM); } libusb_unref_device(dev); *discdevs = ddd; devices[addr] = 1; } close(fd); } return (LIBUSB_SUCCESS); }