summaryrefslogtreecommitdiffstats
path: root/usb.c
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>2000-12-16 18:22:32 +0000
committerPascal Rigaux <pixel@mandriva.com>2000-12-16 18:22:32 +0000
commit1f8893a6cd761f9ef87d4cb9c8d8baecf17b4352 (patch)
tree9db1d895d506145757dff083c0f75ec3252d30f2 /usb.c
parent9f8ce02a3814161d80ae8430282eeb58ae75cbb8 (diff)
downloadldetect-1f8893a6cd761f9ef87d4cb9c8d8baecf17b4352.tar
ldetect-1f8893a6cd761f9ef87d4cb9c8d8baecf17b4352.tar.gz
ldetect-1f8893a6cd761f9ef87d4cb9c8d8baecf17b4352.tar.bz2
ldetect-1f8893a6cd761f9ef87d4cb9c8d8baecf17b4352.tar.xz
ldetect-1f8893a6cd761f9ef87d4cb9c8d8baecf17b4352.zip
now detect usb
Diffstat (limited to 'usb.c')
-rw-r--r--usb.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/usb.c b/usb.c
new file mode 100644
index 0000000..fbb23a3
--- /dev/null
+++ b/usb.c
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "libldetect.h"
+#include "libldetect-private.h"
+#include "common.h"
+
+static void usb_find_modules(struct pciusb_entries entries) {
+ pciusb_find_modules(entries, "/usr/share/ldetect-lst/usbtable");
+}
+
+extern struct pciusb_entries usb_probe(void) {
+ FILE *f;
+ char buf[512];
+ int line;
+ const char *file = "/proc/bus/usb/devices";
+ struct pciusb_entry t[100];
+ struct pciusb_entries r;
+ struct pciusb_entry *e = NULL;
+
+ if (!(f = fopen(file, "r"))) {
+ fprintf(stderr, "can't open %s\n", file);
+ exit(1);
+ }
+
+ for(r.nb = line = 0; fgets(buf, sizeof(buf) - 1, f) && r.nb < psizeof(t); line++) {
+ if (buf[0] == 'P') {
+ e = &t[r.nb++];
+ pciusb_initialize(e);
+
+ if (sscanf(buf, "P: Vendor=%hx ProdID=%hx", &e->vendor, &e->device) != 2) {
+ fprintf(stderr, "%s %d: unknown ``P'' line\n", file, line);
+ pciusb_initialize(e);
+ }
+ } else if (e && buf[0] == 'I' && e->class == 0) {
+ int class, prot = 0;
+ if (sscanf(buf, "I: If#=%*2d Alt=%*2d #EPs=%*2d Cls=%02x(%*5c) Sub=%*02x Prot=%02x", &class, &prot) == 2) {
+ /* we fake a class based on class and proto, subclass unneeded? */
+ e->class = class * 0x100 + prot;
+ } else {
+ fprintf(stderr, "%s %d: unknown ``I'' line\n", file, line);
+ }
+ } else if (e && buf[0] == 'S') {
+ int offset;
+ char dummy;
+ if (sscanf(buf, "S: Manufacturer=%n%c", &offset, &dummy) == 1) {
+ buf[strlen(buf) - 1] = '|'; /* replacing '\n' by '|' */
+ e->text = strdup(buf + offset);
+ } else if (sscanf(buf, "S: Product=%n%c", &offset, &dummy) == 1) {
+ if (!e->text) e->text = strdup("Unknown|");
+ buf[strlen(buf) - 1] = 0; /* removing '\n' */
+ e->text = realloc(e->text, strlen(e->text) + strlen(buf + offset) + 1);
+ strcat(e->text, buf + offset);
+ }
+ }
+ }
+ fclose(f);
+ r.entries = memdup(t, sizeof(struct pciusb_entry) * r.nb);
+
+ usb_find_modules(r);
+ return r;
+}
+