int usb_close(usb_dev_handle * udev) { struct usb_device *dev; int err; err = libusb20_dev_close((void *)udev); if (err) return (-1); if (usb_backend != NULL) { /* * Enqueue USB device to backend queue so that it gets freed * when the backend is re-scanned: */ libusb20_be_enqueue_device(usb_backend, (void *)udev); } else { /* * The backend is gone. Free device data so that we * don't start leaking memory! */ dev = usb_device(udev); libusb20_dev_free((void *)udev); LIST_DEL(usb_global_bus.devices, dev); free(dev); } return (0); }
static int ugen20_init_backend(struct libusb20_backend *pbe) { struct ugen20_urd_state state; struct libusb20_device *pdev; memset(&state, 0, sizeof(state)); state.f = open("/dev/" USB_DEVICE_NAME, O_RDONLY); if (state.f < 0) return (LIBUSB20_ERROR_OTHER); while (ugen20_readdir(&state) == 0) { if ((state.src[0] != 'u') || (state.src[1] != 'g') || (state.src[2] != 'e') || (state.src[3] != 'n')) { continue; } pdev = libusb20_dev_alloc(); if (pdev == NULL) { continue; } if (ugen20_enumerate(pdev, state.src + 4)) { libusb20_dev_free(pdev); continue; } /* put the device on the backend list */ libusb20_be_enqueue_device(pbe, pdev); } close(state.f); return (0); /* success */ }