You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.8 KiB
113 lines
3.8 KiB
diff -up pciutils-3.2.1/lib/names-parse.c.dird pciutils-3.2.1/lib/names-parse.c |
|
--- pciutils-3.2.1/lib/names-parse.c.dird 2012-12-06 17:05:14.000000000 +0100 |
|
+++ pciutils-3.2.1/lib/names-parse.c 2014-01-03 18:12:22.856381553 +0100 |
|
@@ -6,10 +6,13 @@ |
|
* Can be freely distributed and used under the terms of the GNU GPL. |
|
*/ |
|
|
|
+#define _GNU_SOURCE |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <errno.h> |
|
+#include <dirent.h> |
|
+#include <libgen.h> |
|
|
|
#include "internal.h" |
|
#include "names.h" |
|
@@ -82,7 +85,7 @@ static inline int id_white_p(int c) |
|
} |
|
|
|
|
|
-static const char *id_parse_list(struct pci_access *a, pci_file f, int *lino) |
|
+static const char *id_parse_list(struct pci_access *a, pci_file f, int *lino, int flags) |
|
{ |
|
char line[MAX_LINE]; |
|
char *p; |
|
@@ -207,7 +210,7 @@ static const char *id_parse_list(struct |
|
p++; |
|
if (!*p) |
|
return parse_error; |
|
- if (pci_id_insert(a, cat, id1, id2, id3, id4, p, SRC_LOCAL)) |
|
+ if (pci_id_insert(a, cat, id1, id2, id3, id4, p, SRC_LOCAL) && flags) |
|
return "Duplicate entry"; |
|
} |
|
return NULL; |
|
@@ -223,13 +226,14 @@ pci_load_name_list(struct pci_access *a) |
|
pci_free_name_list(a); |
|
a->id_load_failed = 1; |
|
if (!(f = pci_open(a))) |
|
- return 0; |
|
- err = id_parse_list(a, f, &lino); |
|
+ return pci_new_load_name_list(a); |
|
+ err = id_parse_list(a, f, &lino, 0); |
|
PCI_ERROR(f, err); |
|
pci_close(f); |
|
if (err) |
|
a->error("%s at %s, line %d\n", err, a->id_file_name, lino); |
|
a->id_load_failed = 0; |
|
+ pci_new_load_name_list(a); |
|
return 1; |
|
} |
|
|
|
@@ -249,3 +253,49 @@ pci_set_name_list_path(struct pci_access |
|
a->id_file_name = name; |
|
a->free_id_name = to_be_freed; |
|
} |
|
+int pci_new_load_name_list(struct pci_access *a) |
|
+{ |
|
+ pci_file f; |
|
+ int lino, tempsize; |
|
+ const char *err; |
|
+ char *temp; |
|
+ char new_id_path[PATH_MAX+1] = {0,}; |
|
+ DIR *pci_ids_dir; |
|
+ struct dirent *dp; |
|
+ |
|
+ strncpy(new_id_path, a->id_file_name, PATH_MAX); |
|
+ new_id_path[PATH_MAX] = 0; |
|
+ strncat(new_id_path, ".d/", PATH_MAX - strnlen(new_id_path, PATH_MAX)); |
|
+ /* printf("new_id_path is %s\n", new_id_path); */ |
|
+ pci_ids_dir = opendir(new_id_path); |
|
+ if (pci_ids_dir == NULL) |
|
+ return 0; |
|
+ |
|
+ do |
|
+ { |
|
+ if ((dp = readdir(pci_ids_dir)) != NULL) |
|
+ { |
|
+ if (! strcmp(dp->d_name, "..") || ! strcmp(dp->d_name, ".")) |
|
+ continue; |
|
+ if (strstr(dp->d_name, ".ids")) |
|
+ { |
|
+ tempsize = strnlen(new_id_path, PATH_MAX) + dp->d_reclen + 1; |
|
+ temp = malloc(tempsize); /* This malloced memory is freed in the function pci_set_name_list_path() */ |
|
+ memset(temp, 0, tempsize); |
|
+ strncpy(temp, new_id_path, (strnlen(new_id_path, PATH_MAX))+1); |
|
+ strncat(temp, dp->d_name, PATH_MAX - strnlen(temp, PATH_MAX)); |
|
+ /* printf("Found file %s, processing it\n", temp); */ |
|
+ pci_set_name_list_path(a, temp, 1); |
|
+ if (!(f = pci_open(a))) |
|
+ continue; |
|
+ err = id_parse_list(a, f, &lino, 0); |
|
+ PCI_ERROR(f, err); |
|
+ pci_close(f); |
|
+ if (err) |
|
+ a->error("%s at %s, line %d\n", err, a->id_file_name, lino); |
|
+ } |
|
+ } |
|
+ }while (dp != NULL); |
|
+ closedir(pci_ids_dir); |
|
+ return 1; |
|
+} |
|
diff -up pciutils-3.2.1/lib/pci.h.dird pciutils-3.2.1/lib/pci.h |
|
--- pciutils-3.2.1/lib/pci.h.dird 2013-04-01 15:35:24.000000000 +0200 |
|
+++ pciutils-3.2.1/lib/pci.h 2014-01-03 18:12:22.857381545 +0100 |
|
@@ -223,6 +223,7 @@ int pci_load_name_list(struct pci_access |
|
void pci_free_name_list(struct pci_access *a) PCI_ABI; /* Called automatically by pci_cleanup() */ |
|
void pci_set_name_list_path(struct pci_access *a, char *name, int to_be_freed) PCI_ABI; |
|
void pci_id_cache_flush(struct pci_access *a) PCI_ABI; |
|
+int pci_new_load_name_list(struct pci_access *a); |
|
|
|
enum pci_lookup_mode { |
|
PCI_LOOKUP_VENDOR = 1, /* Vendor name (args: vendorID) */
|
|
|