Пример #1
0
/* 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;
}
Пример #2
0
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;
}
Пример #4
0
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;
}
Пример #5
0
/* 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;
}
Пример #6
0
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;
}