Changeset 1048

Show
Ignore:
Timestamp:
05/17/08 09:51:12 (7 months ago)
Author:
alonbl
Message:

Support linux mini-coldplug by CCID interface class

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/ifd/sys-linux.c

    r1039 r1048  
    2121#include <string.h> 
    2222#include <stdio.h> 
     23#include <stdarg.h> 
    2324#include <signal.h> 
    2425#include <stdlib.h> 
     
    382383 
    383384#ifndef ENABLE_LIBUSB 
    384 static int read_number (const char *base, const char *name, const char *file, const char *format) { 
     385static int read_number (const char *read_format, const char *format, ...) { 
     386        va_list args; 
    385387        char full[PATH_MAX]; 
    386388        FILE *fp = NULL; 
    387389        int n = -1; 
    388390 
    389         snprintf (full, sizeof (full), "%s/%s/%s", base, name, file); 
     391        va_start(args, format); 
     392        vsnprintf (full, sizeof(full), format, args); 
     393        va_end(args); 
    390394 
    391395        if ((fp = fopen (full, "r")) == NULL) { 
     
    393397        } 
    394398 
    395         fscanf (fp, format, &n); 
     399        fscanf (fp, read_format, &n); 
    396400 
    397401out: 
     
    422426        for (bus = usb_busses; bus; bus = bus->next) { 
    423427                for (dev = bus->devices; dev; dev = dev->next) { 
    424                         const char *driver; 
     428                        const char *driver = NULL; 
    425429                        char typedev[PATH_MAX]; 
    426430                        struct stat buf; 
     
    435439                        if (!(driver = ifd_driver_for_id(&id))) { 
    436440                                /* no driver found, check for interface class */ 
    437                                 int ccid=0; 
    438441                                int conf; 
    439                                 for (conf = 0; conf <  
    440                                         dev->descriptor.bNumConfigurations; 
     442                                for (conf = 0; conf < dev->descriptor.bNumConfigurations; 
    441443                                        conf++) { 
    442                                 int interf; 
    443                                 for (interf = 0; interf < 
    444                                         dev->config[conf].bNumInterfaces; 
    445                                         interf++) { 
    446                                 int alt; 
    447                                 for (alt = 0; alt < dev->config[conf].interface[interf].num_altsetting; alt++) { 
    448                                         if (dev->config[conf].interface[interf].altsetting[alt].bInterfaceClass == 0x0b) { 
    449                                         ccid=1; 
     444                                        int interf; 
     445                                        for (interf = 0; interf < dev->config[conf].bNumInterfaces; 
     446                                                interf++) { 
     447                                                int alt; 
     448                                                for (alt = 0; alt < dev->config[conf].interface[interf].num_altsetting; alt++) { 
     449                                                        if (dev->config[conf].interface[interf].altsetting[alt].bInterfaceClass == 0x0b) { 
     450                                                                driver = "ccid"; 
     451                                                        } 
     452                                                } 
     453                                        }        
    450454                                } 
     455                        } 
     456 
     457                        if (driver != NULL) { 
     458                                snprintf(typedev, sizeof(typedev), 
     459                                         "/dev/bus/usb/%s/%s", 
     460                                         bus->dirname, dev->filename); 
     461                                if (stat(typedev, &buf) == 0) { 
     462                                        snprintf(typedev, sizeof(typedev), 
     463                                                "usb:/dev/bus/usb/%s/%s", 
     464                                                bus->dirname, dev->filename); 
     465                                        ifd_spawn_handler(driver, typedev, -1); 
     466                                } else { 
     467                                        snprintf(typedev, sizeof(typedev), 
     468                                                "usb:/proc/bus/usb/%s/%s", 
     469                                                bus->dirname, dev->filename); 
     470                                        ifd_spawn_handler(driver, typedev, -1); 
    451471                                } 
    452                                 }        
    453                                 } 
    454                                          
    455                                 /* not a ccid device */ 
    456                                 if (!ccid) 
    457                                         continue; 
    458                         } 
    459  
    460                         snprintf(typedev, sizeof(typedev), 
    461                                  "/dev/bus/usb/%s/%s", 
    462                                  bus->dirname, dev->filename); 
    463                         if (stat(typedev, &buf) == 0) { 
    464                                 snprintf(typedev, sizeof(typedev), 
    465                                         "usb:/dev/bus/usb/%s/%s", 
    466                                         bus->dirname, dev->filename); 
    467                                 ifd_spawn_handler(driver, typedev, -1); 
    468                         } else { 
    469                                 snprintf(typedev, sizeof(typedev), 
    470                                         "usb:/proc/bus/usb/%s/%s", 
    471                                         bus->dirname, dev->filename); 
    472                                 ifd_spawn_handler(driver, typedev, -1); 
    473472                        } 
    474473                } 
     
    479478        struct dirent *ent; 
    480479 
    481         dir = opendir (base); 
    482  
    483         if (dir == NULL) { 
     480        if ((dir = opendir (base)) == NULL) { 
    484481                goto out; 
    485482        } 
     
    487484        while ((ent = readdir (dir)) != NULL) { 
    488485                if (ent->d_name[0] != '.') { 
    489                         char buffer[1024]; 
    490                         FILE *fp = NULL; 
    491486                        int idProduct = -1; 
    492487                        int idVendor = -1; 
     
    494489                        int devnum = -1; 
    495490 
    496                         idProduct = read_number (base, ent->d_name, "idProduct", "%x"); 
    497                         idVendor = read_number (base, ent->d_name, "idVendor", "%x"); 
    498                         busnum = read_number (base, ent->d_name, "busnum", "%d"); 
    499                         devnum = read_number (base, ent->d_name, "devnum", "%d"); 
     491                        idProduct = read_number ("%x", "%s/%s/%s", base, ent->d_name, "idProduct"); 
     492                        idVendor = read_number ("%x", "%s/%s/%s", base, ent->d_name, "idVendor"); 
     493                        busnum = read_number ("%d", "%s/%s/%s", base, ent->d_name, "busnum"); 
     494                        devnum = read_number ("%d", "%s/%s/%s", base, ent->d_name, "devnum"); 
    500495 
    501496                        ifd_debug (6, "coldplug: %s usb: %04x:%04x bus: %03d:%03d\n", ent->d_name, idProduct, idVendor, busnum, devnum); 
    502497 
    503498                        if (idProduct != -1 && idVendor != -1 && busnum != -1 && devnum != -1) { 
    504                                 const char *driver; 
     499                                const char *driver = NULL; 
    505500                                ifd_devid_t id; 
    506501 
     
    510505                                id.val[1] = idProduct; 
    511506 
    512                                 if ((driver = ifd_driver_for_id(&id)) != NULL) { 
     507                                if ((driver = ifd_driver_for_id(&id)) == NULL) { 
     508                                        DIR *dir1 = NULL; 
     509                                        struct dirent *ent1; 
     510 
     511                                        if ((dir1 = opendir (base)) != NULL) { 
     512                                                while ((ent1 = readdir (dir1)) != NULL && driver == NULL) { 
     513                                                        /* skip all none bus elements */ 
     514                                                        if (strncmp (ent->d_name, ent1->d_name, strlen (ent->d_name))) { 
     515                                                                continue; 
     516                                                        } 
     517 
     518                                                        int bInterfaceClass = read_number ("%x", "%s/%s/%s/%s", base, ent->d_name, ent1->d_name, "bInterfaceClass"); 
     519 
     520                                                        if (bInterfaceClass == 0x0b) { 
     521                                                                driver = "ccid"; 
     522                                                        } 
     523                                                } 
     524                                                closedir (dir1); 
     525                                        } 
     526                                } 
     527 
     528                                if (driver != NULL) { 
    513529                                        char typedev[1024]; 
    514530