Blame SOURCES/pciutils-dir-d.patch

fbba1b
diff -up pciutils-3.0.0/lib/names-parse.c.dird pciutils-3.0.0/lib/names-parse.c
fbba1b
--- pciutils-3.0.0/lib/names-parse.c.dird	2008-04-10 21:15:47.000000000 +0200
fbba1b
+++ pciutils-3.0.0/lib/names-parse.c	2008-09-01 15:17:23.000000000 +0200
fbba1b
@@ -6,10 +6,13 @@
fbba1b
  *	Can be freely distributed and used under the terms of the GNU GPL.
fbba1b
  */
fbba1b
 
fbba1b
+#define _GNU_SOURCE
fbba1b
 #include <stdio.h>
fbba1b
 #include <stdlib.h>
fbba1b
 #include <string.h>
fbba1b
 #include <errno.h>
fbba1b
+#include <dirent.h>
fbba1b
+#include <libgen.h>
fbba1b
 
fbba1b
 #include "internal.h"
fbba1b
 #include "names.h"
fbba1b
@@ -82,7 +85,7 @@ static inline int id_white_p(int c)
fbba1b
 }
fbba1b
 
fbba1b
 
fbba1b
-static const char *id_parse_list(struct pci_access *a, pci_file f, int *lino)
fbba1b
+static const char *id_parse_list(struct pci_access *a, pci_file f, int *lino, int flags)
fbba1b
 {
fbba1b
   char line[MAX_LINE];
fbba1b
   char *p;
fbba1b
@@ -207,7 +210,7 @@ static const char *id_parse_list(struct 
fbba1b
 	p++;
fbba1b
       if (!*p)
fbba1b
 	return parse_error;
fbba1b
-      if (pci_id_insert(a, cat, id1, id2, id3, id4, p, SRC_LOCAL))
fbba1b
+      if (pci_id_insert(a, cat, id1, id2, id3, id4, p, SRC_LOCAL) && flags)
fbba1b
 	return "Duplicate entry";
fbba1b
     }
fbba1b
   return NULL;
fbba1b
@@ -223,13 +226,14 @@ pci_load_name_list(struct pci_access *a)
fbba1b
   pci_free_name_list(a);
fbba1b
   a->id_load_failed = 1;
fbba1b
   if (!(f = pci_open(a)))
fbba1b
-    return 0;
fbba1b
-  err = id_parse_list(a, f, &lino);
fbba1b
+    return pci_new_load_name_list(a);
fbba1b
+  err = id_parse_list(a, f, &lino, 0);
fbba1b
   PCI_ERROR(f, err);
fbba1b
   pci_close(f);
fbba1b
   if (err)
fbba1b
     a->error("%s at %s, line %d\n", err, a->id_file_name, lino);
fbba1b
   a->id_load_failed = 0;
fbba1b
+  pci_new_load_name_list(a);
fbba1b
   return 1;
fbba1b
 }
fbba1b
 
fbba1b
@@ -249,3 +253,49 @@ pci_set_name_list_path(struct pci_access
fbba1b
   a->id_file_name = name;
fbba1b
   a->free_id_name = to_be_freed;
fbba1b
 }
fbba1b
+int pci_new_load_name_list(struct pci_access *a)
fbba1b
+{
fbba1b
+  pci_file f;
fbba1b
+  int lino, tempsize;
fbba1b
+  const char *err;
fbba1b
+  char *temp;
fbba1b
+  char new_id_path[PATH_MAX+1] = {0,};
fbba1b
+  DIR *pci_ids_dir;
fbba1b
+  struct dirent *dp;
fbba1b
+  
fbba1b
+  strncpy(new_id_path, a->id_file_name, PATH_MAX);
fbba1b
+  new_id_path[PATH_MAX] = 0;
fbba1b
+  strncat(new_id_path, ".d/", PATH_MAX - strnlen(new_id_path, PATH_MAX));
fbba1b
+  /* printf("new_id_path is %s\n", new_id_path); */
fbba1b
+  pci_ids_dir = opendir(new_id_path); 
fbba1b
+  if (pci_ids_dir == NULL)
fbba1b
+    return 0;
fbba1b
+
fbba1b
+  do
fbba1b
+    {
fbba1b
+     if ((dp = readdir(pci_ids_dir)) != NULL)
fbba1b
+       {
fbba1b
+          if (! strcmp(dp->d_name, "..") || ! strcmp(dp->d_name, "."))
fbba1b
+            continue;
fbba1b
+          if (strstr(dp->d_name, ".ids")) 
fbba1b
+            {
fbba1b
+             tempsize = strnlen(new_id_path, PATH_MAX) + dp->d_reclen + 1;
fbba1b
+             temp = malloc(tempsize);      /* This malloced memory is freed in the function pci_set_name_list_path() */ 
fbba1b
+             memset(temp, 0, tempsize);
fbba1b
+             strncpy(temp, new_id_path, (strnlen(new_id_path, PATH_MAX))+1);
fbba1b
+             strncat(temp, dp->d_name, PATH_MAX - strnlen(temp, PATH_MAX));
fbba1b
+             /* printf("Found file %s, processing it\n", temp); */
fbba1b
+             pci_set_name_list_path(a, temp, 1);
fbba1b
+             if (!(f = pci_open(a)))
fbba1b
+               continue;
fbba1b
+             err = id_parse_list(a, f, &lino, 0);
fbba1b
+             PCI_ERROR(f, err);
fbba1b
+             pci_close(f);
fbba1b
+             if (err)
fbba1b
+               a->error("%s at %s, line %d\n", err, a->id_file_name, lino);
fbba1b
+            }
fbba1b
+       }
fbba1b
+    }while (dp != NULL);
fbba1b
+  closedir(pci_ids_dir);
fbba1b
+  return 1;
fbba1b
+}   
fbba1b
diff -up pciutils-3.0.0/lib/pci.h.dird pciutils-3.0.0/lib/pci.h
fbba1b
--- pciutils-3.0.0/lib/pci.h.dird	2008-04-10 21:23:05.000000000 +0200
fbba1b
+++ pciutils-3.0.0/lib/pci.h	2008-09-01 15:17:23.000000000 +0200
fbba1b
@@ -194,6 +194,7 @@ int pci_load_name_list(struct pci_access
fbba1b
 void pci_free_name_list(struct pci_access *a) PCI_ABI;	/* Called automatically by pci_cleanup() */
fbba1b
 void pci_set_name_list_path(struct pci_access *a, char *name, int to_be_freed) PCI_ABI;
fbba1b
 void pci_id_cache_flush(struct pci_access *a) PCI_ABI;
fbba1b
+int pci_new_load_name_list(struct pci_access *a);
fbba1b
 
fbba1b
 enum pci_lookup_mode {
fbba1b
   PCI_LOOKUP_VENDOR = 1,		/* Vendor name (args: vendorID) */