/* returns true if one of the callbacks indicates we are done */ static int find_existing_devices(usb_device_added_cb added_cb, usb_device_removed_cb removed_cb, void *client_data) { char busname[32], devname[32]; DIR *busdir , *devdir ; struct dirent *de; int done = 0; busdir = opendir(USB_FS_DIR); if(busdir == 0) return 1; while ((de = readdir(busdir)) != 0 && !done) { if(badname(de->d_name)) continue; snprintf(busname, sizeof busname, "%s/%s", USB_FS_DIR, de->d_name); devdir = opendir(busname); if(devdir == 0) continue; while ((de = readdir(devdir)) && !done) { if(badname(de->d_name)) continue; snprintf(devname, sizeof devname, "%s/%s", busname, de->d_name); done = added_cb(devname, client_data); } // end of devdir while closedir(devdir); } //end of busdir while closedir(busdir); return done; }
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; }
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_existing_devices_bus(char *busname, usb_device_added_cb added_cb, void *client_data) { char devname[32]; DIR *devdir; struct dirent *de; int done = 0; devdir = opendir(busname); if(devdir == 0) return 0; while ((de = readdir(devdir)) && !done) { if(badname(de->d_name)) continue; snprintf(devname, sizeof(devname), "%s/%s", busname, de->d_name); done = added_cb(devname, client_data); } // end of devdir while closedir(devdir); return done; }
/* returns true if one of the callbacks indicates we are done */ static int find_existing_devices(usb_device_added_cb added_cb, void *client_data) { char busname[32]; DIR *busdir; struct dirent *de; int done = 0; busdir = opendir(USB_FS_DIR); if(busdir == 0) return 0; while ((de = readdir(busdir)) != 0 && !done) { if(badname(de->d_name)) continue; snprintf(busname, sizeof(busname), USB_FS_DIR "/%s", de->d_name); done = find_existing_devices_bus(busname, added_cb, client_data); } //end of busdir while closedir(busdir); return done; }
int convert(char **db, int len) { int i, nu, keydblen, keydboff, keydbaes; char *p = *db; keydblen = KEYDBLEN; keydboff = KEYDBOFF; keydbaes = len > 24 && memcmp(p, "AES KEYS", 8) == 0; if(keydbaes) { keydblen += AESKEYLEN; keydboff = 8+16; /* signature[8] + iv[16] */ } len -= keydboff; if(len % keydblen) { fprint(2, "%s: file odd length; not converting %d bytes\n", argv0, len % keydblen); len -= len % keydblen; } len += keydboff; if(keydbaes) { AESstate s; /* make sure we have aes key for decryption */ if(memcmp(okey.aes, zeros, AESKEYLEN) == 0) { fprint(2, "%s: no aes key in NVRAM\n", argv0); exits("no aes key"); } setupAESstate(&s, okey.aes, AESKEYLEN, zeros); aesCBCdecrypt((uchar*)p+8, len-8, &s); } else { DESstate s; uchar k[8]; des56to64((uchar*)okey.des, k); setupDESstate(&s, k, zeros); desCBCdecrypt((uchar*)p, len, &s); } nu = 0; for(i = keydboff; i < len; i += keydblen) { if (badname(&p[i])) { fprint(2, "%s: bad name %.30s... - aborting\n", argv0, &p[i]); exits("bad name"); } nu++; } if(verb) { for(i = keydboff; i < len; i += keydblen) print("%s\n", &p[i]); exits(nil); } if(convaes && !keydbaes) { char *s, *d; keydboff = 8+16; keydblen += AESKEYLEN; len = keydboff + keydblen*nu; p = realloc(p, len); if(p == nil) error("out of memory"); *db = p; s = p + KEYDBOFF + nu*KEYDBLEN; d = p + keydboff + nu*keydblen; for(i=0; i<nu; i++) { s -= KEYDBLEN; d -= keydblen; memmove(d, s, KEYDBLEN); memset(d + KEYDBLEN, 0, keydblen-KEYDBLEN); } keydbaes = 1; } genrandom((uchar*)p, keydboff); if(keydbaes) { AESstate s; memmove(p, "AES KEYS", 8); setupAESstate(&s, nkey.aes, AESKEYLEN, zeros); aesCBCencrypt((uchar*)p+8, len-8, &s); } else { DESstate s; uchar k[8]; des56to64((uchar*)nkey.des, k); setupDESstate(&s, k, zeros); desCBCencrypt((uchar*)p, len, &s); } return len; }