]> mj.ucw.cz Git - pciutils.git/blobdiff - lib/dump.c
libpci: Add separate file for bit manipulation functions
[pciutils.git] / lib / dump.c
index 69a99c82ae3a50897eb6557ac03da43d6a3335b2..829071f4b2baf8471ddc7ff3b7393134e8513ef5 100644 (file)
@@ -3,7 +3,9 @@
  *
  *     Copyright (c) 1997--2008 Martin Mares <mj@ucw.cz>
  *
- *     Can be freely distributed and used under the terms of the GNU GPL.
+ *     Can be freely distributed and used under the terms of the GNU GPL v2+.
+ *
+ *     SPDX-License-Identifier: GPL-2.0-or-later
  */
 
 #include <stdio.h>
@@ -38,7 +40,7 @@ dump_alloc_data(struct pci_dev *dev, int len)
   dd->allocated = len;
   dd->len = 0;
   memset(dd->data, 0xff, len);
-  dev->aux = dd;
+  dev->backend_data = dd;
 }
 
 static int
@@ -62,7 +64,7 @@ dump_init(struct pci_access *a)
   struct pci_dev *dev = NULL;
   int len, mn, bn, dn, fn, i, j;
 
-  if (!a)
+  if (!name)
     a->error("dump: File name not given.");
   if (!(f = fopen(name, "r")))
     a->error("dump: Cannot open %s: %s", name, strerror(errno));
@@ -70,14 +72,18 @@ dump_init(struct pci_access *a)
     {
       char *z = strchr(buf, '\n');
       if (!z)
-       a->error("dump: line too long or unterminated");
+       {
+         fclose(f);
+         a->error("dump: line too long or unterminated");
+       }
       *z-- = 0;
       if (z >= buf && *z == '\r')
        *z-- = 0;
       len = z - buf + 1;
       mn = 0;
       if (dump_validate(buf, "##:##.# ") && sscanf(buf, "%x:%x.%d", &bn, &dn, &fn) == 3 ||
-         dump_validate(buf, "####:##:##.# ") && sscanf(buf, "%x:%x:%x.%d", &mn, &bn, &dn, &fn) == 4)
+         dump_validate(buf, "####:##:##.# ") && sscanf(buf, "%x:%x:%x.%d", &mn, &bn, &dn, &fn) == 4 ||
+         dump_validate(buf, "#####:##:##.# ") && sscanf(buf, "%x:%x:%x.%d", &mn, &bn, &dn, &fn) == 4)
        {
          dev = pci_get_dev(a, mn, bn, dn, fn);
          dump_alloc_data(dev, 256);
@@ -86,22 +92,27 @@ dump_init(struct pci_access *a)
       else if (!len)
        dev = NULL;
       else if (dev &&
-              (dump_validate(buf, "##: ") || dump_validate(buf, "###: ")) &&
+              (dump_validate(buf, "##: ") || dump_validate(buf, "###: ") || dump_validate(buf, "####: ") ||
+               dump_validate(buf, "#####: ") || dump_validate(buf, "######: ") ||
+               dump_validate(buf, "#######: ") || dump_validate(buf, "########: ")) &&
               sscanf(buf, "%x: ", &i) == 1)
        {
-         struct dump_data *dd = dev->aux;
+         struct dump_data *dd = dev->backend_data;
          z = strchr(buf, ' ') + 1;
          while (isxdigit(z[0]) && isxdigit(z[1]) && (!z[2] || z[2] == ' ') &&
                 sscanf(z, "%x", &j) == 1 && j < 256)
            {
              if (i >= 4096)
-               a->error("dump: At most 4096 bytes of config space are supported");
+               {
+                 fclose(f);
+                 a->error("dump: At most 4096 bytes of config space are supported");
+               }
              if (i >= dd->allocated)   /* Need to re-allocate the buffer */
                {
                  dump_alloc_data(dev, 4096);
-                 memcpy(((struct dump_data *) dev->aux)->data, dd->data, 256);
+                 memcpy(((struct dump_data *) dev->backend_data)->data, dd->data, 256);
                  pci_mfree(dd);
-                 dd = dev->aux;
+                 dd = dev->backend_data;
                }
              dd->data[i++] = j;
              if (i > dd->len)
@@ -111,9 +122,13 @@ dump_init(struct pci_access *a)
                z++;
            }
          if (*z)
-           a->error("dump: Malformed line");
+           {
+             fclose(f);
+             a->error("dump: Malformed line");
+           }
        }
     }
+  fclose(f);
 }
 
 static void
@@ -130,14 +145,14 @@ static int
 dump_read(struct pci_dev *d, int pos, byte *buf, int len)
 {
   struct dump_data *dd;
-  if (!(dd = d->aux))
+  if (!(dd = d->backend_data))
     {
       struct pci_dev *e = d->access->devices;
       while (e && (e->domain != d->domain || e->bus != d->bus || e->dev != d->dev || e->func != d->func))
        e = e->next;
       if (!e)
        return 0;
-      dd = e->aux;
+      dd = e->backend_data;
     }
   if (pos + len > dd->len)
     return 0;
@@ -155,10 +170,10 @@ dump_write(struct pci_dev *d UNUSED, int pos UNUSED, byte *buf UNUSED, int len U
 static void
 dump_cleanup_dev(struct pci_dev *d)
 {
-  if (d->aux)
+  if (d->backend_data)
     {
-      pci_mfree(d->aux);
-      d->aux = NULL;
+      pci_mfree(d->backend_data);
+      d->backend_data = NULL;
     }
 }
 
@@ -173,6 +188,7 @@ struct pci_methods pm_dump = {
   pci_generic_fill_info,
   dump_read,
   dump_write,
+  NULL,                                        /* read_vpd */
   NULL,                                        /* init_dev */
   dump_cleanup_dev
 };