Bugzilla – Attachment 117828 Details for
Bug 241950
fix for qemu without usbdevfs
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
IDP Log In
|
Forgot Password
[patch]
(cleaner) version of the patch using the kernel headers
qemu-0.8.2-nousbdevfs.patch (text/plain), 6.26 KB, created by
Forgotten User OS1JNCFbCX
on 2007-02-07 14:04:09 UTC
(
hide
)
Description:
(cleaner) version of the patch using the kernel headers
Filename:
MIME Type:
Creator:
Forgotten User OS1JNCFbCX
Created:
2007-02-07 14:04:09 UTC
Size:
6.26 KB
patch
obsolete
>--- usb-linux.c 2006-07-22 19:23:34.000000000 +0200 >+++ usb-linux.c 2007-02-03 09:26:48.000000000 +0100 >@@ -50,7 +50,7 @@ > > //#define DEBUG > >-#define USBDEVFS_PATH "/proc/bus/usb" >+#define USBDEVFS_PATH "/dev/bus/usb" > #define PRODUCT_NAME_SZ 32 > > typedef struct USBHostDevice { >@@ -257,102 +257,96 @@ > return (USBDevice *)dev; > } > >-static int get_tag_value(char *buf, int buf_size, >- const char *str, const char *tag, >- const char *stopchars) >-{ >- const char *p; >- char *q; >- p = strstr(str, tag); >- if (!p) >- return -1; >- p += strlen(tag); >- while (isspace(*p)) >- p++; >- q = buf; >- while (*p != '\0' && !strchr(stopchars, *p)) { >- if ((q - buf) < (buf_size - 1)) >- *q++ = *p; >- p++; >- } >- *q = '\0'; >- return q - buf; >-} >- > static int usb_host_scan(void *opaque, USBScanFunc *func) > { > FILE *f; > char line[1024]; >- char buf[1024]; >- int bus_num, addr, speed, device_count, class_id, product_id, vendor_id; >+ int bus_num, addr, speed, class_id, product_id, vendor_id; > int ret; > char product_name[512]; >+ DIR* d; >+ struct dirent* de; > >- f = fopen(USBDEVFS_PATH "/devices", "r"); >- if (!f) { >- term_printf("Could not open %s\n", USBDEVFS_PATH "/devices"); >+ d = opendir("/sys/bus/usb/devices"); >+ if (!d) { >+ term_printf("Could not open /sys/bus/usb/devices\n"); > return 0; > } >- device_count = 0; >- bus_num = addr = speed = class_id = product_id = vendor_id = 0; >- ret = 0; >- for(;;) { >- if (fgets(line, sizeof(line), f) == NULL) >- break; >- if (strlen(line) > 0) >- line[strlen(line) - 1] = '\0'; >- if (line[0] == 'T' && line[1] == ':') { >- if (device_count && (vendor_id || product_id)) { >- /* New device. Add the previously discovered device. */ >- ret = func(opaque, bus_num, addr, class_id, vendor_id, >- product_id, product_name, speed); >- if (ret) >- goto the_end; >- } >- if (get_tag_value(buf, sizeof(buf), line, "Bus=", " ") < 0) >- goto fail; >- bus_num = atoi(buf); >- if (get_tag_value(buf, sizeof(buf), line, "Dev#=", " ") < 0) >- goto fail; >- addr = atoi(buf); >- if (get_tag_value(buf, sizeof(buf), line, "Spd=", " ") < 0) >- goto fail; >- if (!strcmp(buf, "480")) >+ while ((de = readdir(d))) { >+ if (de->d_name[0] != '.' && ! strchr(de->d_name, ':')) { >+ char filename[PATH_MAX]; >+ char* tmpstr = de->d_name; >+ if (!strncmp(de->d_name, "usb", 3)) >+ tmpstr += 3; >+ bus_num = atoi(tmpstr); >+ snprintf(filename, PATH_MAX, "/sys/bus/usb/devices/%s/devnum", de->d_name); >+ f = fopen(filename, "r"); >+ if (!f) { >+ term_printf("Could not open %s\n", filename); >+ return 0; >+ } >+ fgets(line, sizeof(line), f); >+ fclose(f); >+ addr = atoi(line); >+ snprintf(filename, PATH_MAX, "/sys/bus/usb/devices/%s/bDeviceClass", de->d_name); >+ f = fopen(filename, "r"); >+ if (!f) { >+ term_printf("Could not open %s\n", filename); >+ return 0; >+ } >+ fgets(line, sizeof(line), f); >+ fclose(f); >+ class_id = strtoul(line, NULL, 16); >+ snprintf(filename, PATH_MAX, "/sys/bus/usb/devices/%s/idVendor", de->d_name); >+ f = fopen(filename, "r"); >+ if (!f) { >+ term_printf("Could not open %s\n", filename); >+ return 0; >+ } >+ fgets(line, sizeof(line), f); >+ fclose(f); >+ vendor_id = strtoul(line, NULL, 16); >+ snprintf(filename, PATH_MAX, "/sys/bus/usb/devices/%s/idProduct", de->d_name); >+ f = fopen(filename, "r"); >+ if (!f) { >+ term_printf("Could not open %s\n", filename); >+ return 0; >+ } >+ fgets(line, sizeof(line), f); >+ fclose(f); >+ product_id = strtoul(line, NULL, 16); >+ snprintf(filename, PATH_MAX, "/sys/bus/usb/devices/%s/product", de->d_name); >+ f = fopen(filename, "r"); >+ if (f) { >+ fgets(line, sizeof(line), f); >+ fclose(f); >+ if (strlen(line) > 0) >+ line[strlen(line) - 1] = '\0'; >+ pstrcpy(product_name, sizeof(product_name), line); >+ } else >+ *product_name = 0; >+ snprintf(filename, PATH_MAX, "/sys/bus/usb/devices/%s/speed", de->d_name); >+ f = fopen(filename, "r"); >+ if (!f) { >+ term_printf("Could not open %s\n", filename); >+ return 0; >+ } >+ fgets(line, sizeof(line), f); >+ fclose(f); >+ if (!strcmp(line, "480\n")) > speed = USB_SPEED_HIGH; >- else if (!strcmp(buf, "1.5")) >+ else if (!strcmp(line, "1.5\n")) > speed = USB_SPEED_LOW; > else > speed = USB_SPEED_FULL; >- product_name[0] = '\0'; >- class_id = 0xff; >- device_count++; >- product_id = 0; >- vendor_id = 0; >- } else if (line[0] == 'P' && line[1] == ':') { >- if (get_tag_value(buf, sizeof(buf), line, "Vendor=", " ") < 0) >- goto fail; >- vendor_id = strtoul(buf, NULL, 16); >- if (get_tag_value(buf, sizeof(buf), line, "ProdID=", " ") < 0) >- goto fail; >- product_id = strtoul(buf, NULL, 16); >- } else if (line[0] == 'S' && line[1] == ':') { >- if (get_tag_value(buf, sizeof(buf), line, "Product=", "") < 0) >- goto fail; >- pstrcpy(product_name, sizeof(product_name), buf); >- } else if (line[0] == 'D' && line[1] == ':') { >- if (get_tag_value(buf, sizeof(buf), line, "Cls=", " (") < 0) >- goto fail; >- class_id = strtoul(buf, NULL, 16); >- } >- fail: ; >- } >- if (device_count && (vendor_id || product_id)) { >- /* Add the last device. */ >- ret = func(opaque, bus_num, addr, class_id, vendor_id, >- product_id, product_name, speed); >+ ret = func(opaque, bus_num, addr, class_id, vendor_id, >+ product_id, product_name, speed); >+ if (ret) >+ goto the_end; >+ } > } > the_end: >- fclose(f); >+ closedir(d); > return ret; > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
Actions:
View
|
Diff
Attachments on
bug 241950
:
117226
|
117244
| 117828 |
120548