static usb_handle *find_usb_device(const char *base, ifc_match_func callback) { usb_handle *usb = 0; char devname[64]; char desc[1024]; int n, in, out, ifc; DIR *busdir; struct dirent *de; int fd; int writable; busdir = opendir(base); if(busdir == 0) return 0; while((de = readdir(busdir)) && (usb == 0)) { if(badname(de->d_name)) continue; if(!convert_to_devfs_name(de->d_name, devname, sizeof(devname))) { // DBG("[ scanning %s ]\n", devname); writable = 1; if((fd = open(devname, O_RDWR)) < 0) { // Check if we have read-only access, so we can give a helpful // diagnostic like "adb devices" does. writable = 0; if((fd = open(devname, O_RDONLY)) < 0) { continue; } } n = read(fd, desc, sizeof(desc)); if(filter_usb_device(de->d_name, desc, n, writable, callback, &in, &out, &ifc) == 0) { usb = calloc(1, sizeof(usb_handle)); strcpy(usb->fname, devname); usb->ep_in = in; usb->ep_out = out; usb->desc = fd; n = ioctl(fd, USBDEVFS_CLAIMINTERFACE, &ifc); if(n != 0) { close(fd); free(usb); usb = 0; continue; } } else { close(fd); } } } closedir(busdir); return usb; }
static int find_usb_device(const char *base, ifc_match_func callback) { int ret = 0; int n; char busname[64], devname[64]; char desc[1024]; DIR *busdir, *devdir; struct dirent *de; int fd; busdir = opendir(base); if(busdir == 0) return 0; while((de = readdir(busdir)) && (ret == 0)) { if(badname(de->d_name)) continue; sprintf(busname, "%s/%s", base, de->d_name); devdir = opendir(busname); if(devdir == 0) continue; DBG("[ scanning %s ]\n", busname); while((de = readdir(devdir)) && (ret == 0)) { if(badname(de->d_name)) continue; sprintf(devname, "%s/%s", busname, de->d_name); DBG("[ scanning %s ]\n", devname); if((fd = open(devname, O_RDONLY)) < 0) { continue; } n = read(fd, desc, sizeof(desc)); if(filter_usb_device(desc, n, callback)){ ret = 1; continue; } else { close(fd); } } closedir(devdir); } closedir(busdir); return ret; }