Changeset 1048
- Timestamp:
- 05/17/08 09:51:12 (7 months ago)
- Files:
-
- 1 modified
-
trunk/src/ifd/sys-linux.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ifd/sys-linux.c
r1039 r1048 21 21 #include <string.h> 22 22 #include <stdio.h> 23 #include <stdarg.h> 23 24 #include <signal.h> 24 25 #include <stdlib.h> … … 382 383 383 384 #ifndef ENABLE_LIBUSB 384 static int read_number (const char *base, const char *name, const char *file, const char *format) { 385 static int read_number (const char *read_format, const char *format, ...) { 386 va_list args; 385 387 char full[PATH_MAX]; 386 388 FILE *fp = NULL; 387 389 int n = -1; 388 390 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); 390 394 391 395 if ((fp = fopen (full, "r")) == NULL) { … … 393 397 } 394 398 395 fscanf (fp, format, &n);399 fscanf (fp, read_format, &n); 396 400 397 401 out: … … 422 426 for (bus = usb_busses; bus; bus = bus->next) { 423 427 for (dev = bus->devices; dev; dev = dev->next) { 424 const char *driver ;428 const char *driver = NULL; 425 429 char typedev[PATH_MAX]; 426 430 struct stat buf; … … 435 439 if (!(driver = ifd_driver_for_id(&id))) { 436 440 /* no driver found, check for interface class */ 437 int ccid=0;438 441 int conf; 439 for (conf = 0; conf < 440 dev->descriptor.bNumConfigurations; 442 for (conf = 0; conf < dev->descriptor.bNumConfigurations; 441 443 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 } 450 454 } 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); 451 471 } 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);473 472 } 474 473 } … … 479 478 struct dirent *ent; 480 479 481 dir = opendir (base); 482 483 if (dir == NULL) { 480 if ((dir = opendir (base)) == NULL) { 484 481 goto out; 485 482 } … … 487 484 while ((ent = readdir (dir)) != NULL) { 488 485 if (ent->d_name[0] != '.') { 489 char buffer[1024];490 FILE *fp = NULL;491 486 int idProduct = -1; 492 487 int idVendor = -1; … … 494 489 int devnum = -1; 495 490 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"); 500 495 501 496 ifd_debug (6, "coldplug: %s usb: %04x:%04x bus: %03d:%03d\n", ent->d_name, idProduct, idVendor, busnum, devnum); 502 497 503 498 if (idProduct != -1 && idVendor != -1 && busnum != -1 && devnum != -1) { 504 const char *driver ;499 const char *driver = NULL; 505 500 ifd_devid_t id; 506 501 … … 510 505 id.val[1] = idProduct; 511 506 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) { 513 529 char typedev[1024]; 514 530
