summaryrefslogtreecommitdiffstats
path: root/usb.c
diff options
context:
space:
mode:
authorThierry Vignaud <tvignaud@mandriva.org>2002-08-16 16:03:22 +0000
committerThierry Vignaud <tvignaud@mandriva.org>2002-08-16 16:03:22 +0000
commit8885505f1dd18a004b647a5f915edfd498911492 (patch)
treeb8dd8a7ce54d83766ed7172e1cf58dbfbd877d57 /usb.c
parent1398804b467ce1057db65d1628b1b9e79e099c4b (diff)
downloadldetect-8885505f1dd18a004b647a5f915edfd498911492.tar
ldetect-8885505f1dd18a004b647a5f915edfd498911492.tar.gz
ldetect-8885505f1dd18a004b647a5f915edfd498911492.tar.bz2
ldetect-8885505f1dd18a004b647a5f915edfd498911492.tar.xz
ldetect-8885505f1dd18a004b647a5f915edfd498911492.zip
- usb.c: allocate mem as pci.c does
- usb.c: kill dead code - usb.c: give url to get info on /proc/bus/usb/devices format - usb.c: the /proc/bus/usb/devices really is a state machine; use switch to make it clearer - {usb,pci}.c: r.nb is zeroed in all path, let's do it only time
Diffstat (limited to 'usb.c')
-rw-r--r--usb.c63
1 files changed, 31 insertions, 32 deletions
diff --git a/usb.c b/usb.c
index 75712b4..7a8f751 100644
--- a/usb.c
+++ b/usb.c
@@ -14,12 +14,11 @@ extern struct pciusb_entries usb_probe(void) {
FILE *f;
char buf[BUF_SIZE];
int line;
- struct pciusb_entry t[MAX_DEVICES];
struct pciusb_entries r;
struct pciusb_entry *e = NULL;
-
+ r.nb = 0;
if (access(proc_pci_path, R_OK) != 0) {
- r.nb = 0; r.entries = NULL;
+ r.entries = NULL;
return r;
}
@@ -31,49 +30,48 @@ extern struct pciusb_entries usb_probe(void) {
"fopen() sets errno to", proc_usb_path);
perror(err_msg);
free(err_msg);
- } /*else {
- asprintf(&err_msg, "unable to open \"%s\"\n"
- "You should enable the usb service (as root, type 'service usb start'.\n"
- "fopen() sets errno to", proc_usb_path);
- perror(err_msg);
- free(err_msg);
- } */
- r.nb = 0; r.entries = NULL;
+ }
+ r.entries = NULL;
return r;
}
-
- for(r.nb = 0, line = 1; fgets(buf, sizeof(buf) - 1, f) && r.nb < psizeof(t); line++) {
- if (buf[0] == 'T') {
- unsigned short pci_bus, pci_device;
- e = &t[r.nb++];
+
+ r.entries = malloc(sizeof(struct pciusb_entry) * MAX_DEVICES);
+ /* for further information on the format parsed by this state machine,
+ * read /usr/share/doc/kernel-doc-X.Y.Z/usb/proc_usb_info.txt */
+ for(line = 1; fgets(buf, sizeof(buf) - 1, f) && r.nb < MAX_DEVICES; line++) {
+
+ switch (buf[0]) {
+ case 'T': {
+ unsigned short pci_bus, pci_device;
+ e = &r.entries[r.nb++];
pciusb_initialize(e);
if (sscanf(buf, "T: Bus=%02hd Lev=%*02d Prnt=%*02d Port=%*02d Cnt=%*02d Dev#=%3hd Spd=%*3s MxCh=%*2d", &pci_bus, &pci_device) == 2) {
e->pci_bus = pci_bus;
e->pci_device = pci_device;
- } else {
- fprintf(stderr, "%s %d: unknown ``T'' line\n", proc_usb_path, line);
- }
-
- } else if (buf[0] == 'P') {
- unsigned short vendor, device;
+ } else fprintf(stderr, "%s %d: unknown ``T'' line\n", proc_usb_path, line);
+ break;
+ }
+ case 'P': {
+ unsigned short vendor, device;
if (sscanf(buf, "P: Vendor=%hx ProdID=%hx", &vendor, &device) == 2) {
e->vendor = vendor;
e->device = device;
- } else {
- fprintf(stderr, "%s %d: unknown ``P'' line\n", proc_usb_path, line);
- }
- } else if (e && buf[0] == 'I' && e->class_ == 0) {
+ } else fprintf(stderr, "%s %d: unknown ``P'' line\n", proc_usb_path, line);
+ break;
+ }
+ case 'I': if (e->class_ == 0) {
int class_, sub, prot = 0;
if (sscanf(buf, "I: If#=%*2d Alt=%*2d #EPs=%*2d Cls=%02x(%*5c) Sub=%02x Prot=%02x", &class_, &sub, &prot) == 3) {
e->class_ = (class_ * 0x100 + sub) * 0x100 + prot;
+ /* see linux/sound/usb/usbaudio.c::usb_audio_ids */
if (e->class_ == (0x1*0x100+ 0x01)) /* USB_AUDIO_CLASS*0x100 + USB_SUBCLASS_AUDIO_CONTROL*/
e->module = "snd-usb-audio";
- } else {
- fprintf(stderr, "%s %d: unknown ``I'' line\n", proc_usb_path, line);
- }
- } else if (e && buf[0] == 'S') {
+ } else fprintf(stderr, "%s %d: unknown ``I'' line\n", proc_usb_path, line);
+ break;
+ }
+ case 'S': {
int offset;
char dummy;
size_t length = strlen(buf) -1;
@@ -83,14 +81,15 @@ extern struct pciusb_entries usb_probe(void) {
} else if (sscanf(buf, "S: Product=%n%c", &offset, &dummy) == 1) {
if (!e->text)
e->text = strdup("Unknown|");
- buf[length - 1] = 0; /* removing '\n' */
+ buf[length - 1] = 0; /* removing '\n' */
e->text = realloc(e->text, strlen(e->text) + length-offset + 2);
strcat(e->text, buf + offset);
}
}
+ }
}
fclose(f);
- r.entries = memdup(t, sizeof(struct pciusb_entry) * r.nb);
+ realloc(r.entries, sizeof(struct pciusb_entry) * r.nb);
pciusb_find_modules(&r, "usbtable", 1 /* no_subid */);
return r;