Changeset 1039

Show
Ignore:
Timestamp:
05/08/08 00:01:33 (7 months ago)
Author:
alonbl
Message:

Linux - Allow minimal usb coldplug using sysfs
Drop libusb requirement for most of cases.

Scan one level of /sys/bus/usb/devices, search for
valid and known usb devices.

Location:
trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/etc/openct_usb.mdev.in

    r1035 r1039  
    1111[ "$ACTION" = "add" ] || exit 0 
    1212[ "$DEVTYPE" = "usb_device" ] || exit 0 
    13 [ -e /var/run/openct/status ] || exit 0 
    1413 
    1514DEVICE="$(echo "${DEVICE}" | sed 's/proc/dev/')" 
     
    2019fi 
    2120 
     21[ -e /var/run/openct/status ] || exit 0 
     22 
    2223# Don't know why... 
    2324sleep 1 
  • trunk/src/ifd/sys-linux.c

    r1028 r1039  
    1818#include <sys/stat.h> 
    1919#include <sys/file.h> 
     20#include <dirent.h> 
    2021#include <string.h> 
    2122#include <stdio.h> 
     
    379380        return open(device, O_RDWR); 
    380381} 
     382 
     383#ifndef ENABLE_LIBUSB 
     384static int read_number (const char *base, const char *name, const char *file, const char *format) { 
     385        char full[PATH_MAX]; 
     386        FILE *fp = NULL; 
     387        int n = -1; 
     388 
     389        snprintf (full, sizeof (full), "%s/%s/%s", base, name, file); 
     390 
     391        if ((fp = fopen (full, "r")) == NULL) { 
     392                goto out; 
     393        } 
     394 
     395        fscanf (fp, format, &n); 
     396 
     397out: 
     398        if (fp != NULL) { 
     399                fclose (fp); 
     400        } 
     401 
     402        return n; 
     403} 
     404#endif 
    381405 
    382406/* 
     
    450474                } 
    451475        } 
     476#else 
     477        const char *base = "/sys/bus/usb/devices"; 
     478        DIR *dir = NULL; 
     479        struct dirent *ent; 
     480 
     481        dir = opendir (base); 
     482 
     483        if (dir == NULL) { 
     484                goto out; 
     485        } 
     486 
     487        while ((ent = readdir (dir)) != NULL) { 
     488                if (ent->d_name[0] != '.') { 
     489                        char buffer[1024]; 
     490                        FILE *fp = NULL; 
     491                        int idProduct = -1; 
     492                        int idVendor = -1; 
     493                        int busnum = -1; 
     494                        int devnum = -1; 
     495 
     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"); 
     500 
     501                        ifd_debug (6, "coldplug: %s usb: %04x:%04x bus: %03d:%03d\n", ent->d_name, idProduct, idVendor, busnum, devnum); 
     502 
     503                        if (idProduct != -1 && idVendor != -1 && busnum != -1 && devnum != -1) { 
     504                                const char *driver; 
     505                                ifd_devid_t id; 
     506 
     507                                id.type = IFD_DEVICE_TYPE_USB; 
     508                                id.num = 2; 
     509                                id.val[0] = idVendor; 
     510                                id.val[1] = idProduct; 
     511 
     512                                if ((driver = ifd_driver_for_id(&id)) != NULL) { 
     513                                        char typedev[1024]; 
     514 
     515                                        snprintf(typedev, sizeof(typedev), 
     516                                                "usb:/dev/bus/usb/%03d/%03d", 
     517                                                busnum, devnum); 
     518                                        ifd_spawn_handler(driver, typedev, -1); 
     519                                } 
     520                        } 
     521                } 
     522        } 
     523 
     524out: 
     525        if (dir != NULL) { 
     526                closedir (dir); 
     527        } 
    452528#endif 
    453529        return 0;