summaryrefslogtreecommitdiffstats
path: root/pci.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 /pci.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 'pci.c')
-rw-r--r--pci.c93
1 files changed, 22 insertions, 71 deletions
diff --git a/pci.c b/pci.c
index 6b44e67..e9bf606 100644
--- a/pci.c
+++ b/pci.c
@@ -2,102 +2,53 @@
#include <stdlib.h>
#include <string.h>
#include "libldetect.h"
+#include "libldetect-private.h"
+#include "common.h"
-#define psizeof(a) (sizeof(a) / sizeof(*(a)))
-
-void *memdup(void *src, size_t size) {
- void *r = malloc(size);
- memcpy(r, src, size);
- return r;
-}
-void ifree(void *p) {
- if (p) { free(p); p = NULL; }
-}
-
-static void pci_find_modules(struct pci_entries entries) {
- FILE *f;
- const char *fpcitable = "/usr/share/ldetect-lst/pcitable";
- char buf[2048];
- int line;
-
- if (!(f = fopen(fpcitable, "r"))) {
- fprintf(stderr, "Missing pcitable (should be %s)\n", fpcitable);
- exit(1);
- }
- for (line = 1; fgets(buf, sizeof(buf) - 1, f); line++) {
- unsigned short vendor, device, subvendor, subdevice;
- int offset, i;
- int nb = sscanf(buf, "0x%hx\t0x%hx\t0x%hx\t0x%hx\t%n", &vendor, &device, &subvendor, &subdevice, &offset);
- if (nb != 4) {
- nb = sscanf(buf, "0x%hx\t0x%hx\t%n", &vendor, &device, &offset);
- if (nb != 2 && buf[0] != '#') {
- fprintf(stderr, "%s %d: bad line\n", fpcitable, line);
- continue;
- }
- }
- for (i = 0; i < entries.nb; i++) {
- struct pci_entry *e = &entries.entries[i];
- if (vendor == e->vendor && device == e->device &&
- (nb != 4 || (subvendor == e->subvendor && subdevice == e->subdevice)) && !e->module) {
- char *p = buf + offset + 1;
- char *q = strchr(p, '\t');
- if (q) {
- q[-1] = 0;
- q[strlen(q)-1] = 0;
- e->module = strcmp(p, "unknown") ? strdup(p) : NULL;
- e->text = strdup(q+2);
- }
- }
- }
- }
+static void pci_find_modules(struct pciusb_entries entries) {
+ pciusb_find_modules(entries, "/usr/share/ldetect-lst/pcitable");
}
-extern struct pci_entries pci_probe(int probe_type) {
+extern struct pciusb_entries pci_probe(int probe_type) {
FILE *f;
char buf[512];
unsigned short devbusfn;
unsigned int id;
- struct pci_entry t[100];
- struct pci_entries r;
+ struct pciusb_entry t[100];
+ struct pciusb_entries r;
if (!(f = fopen("/proc/bus/pci/devices", "r"))) exit(1);
for (r.nb = 0; fgets(buf, sizeof(buf) - 1, f) && r.nb < psizeof(t); r.nb++) {
+ struct pciusb_entry e;
+ pciusb_initialize(&e);
+
sscanf(buf, "%hx %x", &devbusfn, &id);
- t[r.nb].vendor = id >> 16;
- t[r.nb].device = id & 0xffff;
- t[r.nb].module = NULL;
- t[r.nb].text = NULL;
+ e.vendor = id >> 16;
+ e.device = id & 0xffff;
{
char file[25];
FILE *f;
snprintf(file, sizeof(file), "/proc/bus/pci/%02x/%02x.%d", devbusfn >> 8, (devbusfn & 0xff) >> 3, (devbusfn & 0xff) & 0x7);
if (probe_type && (f = fopen(file, "r"))) {
if (fseek(f, 10, SEEK_SET) == 0)
- fread(&t[r.nb].class, 2, 1, f);
+ fread(&e.class, 2, 1, f);
if (fseek(f, 0x2c, SEEK_SET) == 0)
- fread(&t[r.nb].subvendor, 2, 1, f), fread(&t[r.nb].subdevice, 2, 1, f);
- } else {
- t[r.nb].subvendor = 0xffff;
- t[r.nb].subdevice = 0xffff;
- t[r.nb].class = 0;
+ fread(&e.subvendor, 2, 1, f), fread(&e.subdevice, 2, 1, f);
+
+ if ((e.subvendor == 0 && e.subdevice == 0) ||
+ (e.subvendor == e.vendor && e.subdevice == e.device)) {
+ e.subvendor = 0xffff;
+ e.subdevice = 0xffff;
+ }
}
}
+ t[r.nb] = e;
}
fclose(f);
- r.entries = memdup(t, sizeof(struct pci_entry) * r.nb);
+ r.entries = memdup(t, sizeof(struct pciusb_entry) * r.nb);
pci_find_modules(r);
return r;
}
-extern void pci_free(struct pci_entries entries) {
- int i;
- for (i = 0; i < entries.nb; i++) {
- struct pci_entry e = entries.entries[i];
- ifree(e.module);
- ifree(e.text);
- }
- ifree(entries.entries);
-}
-