From: Martin Mareš Date: Sun, 5 Apr 2026 16:35:24 +0000 (+0200) Subject: dump: Refactor file parsing X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=34a7ff32d79d306756ae585720108c976145354b;p=pciutils.git dump: Refactor file parsing --- diff --git a/lib/dump.c b/lib/dump.c index 00ebc9e..db11168 100644 --- a/lib/dump.c +++ b/lib/dump.c @@ -1,7 +1,7 @@ /* * The PCI Library -- Reading of Bus Dumps * - * Copyright (c) 1997--2008 Martin Mares + * Copyright (c) 1997--2026 Martin Mares * * Can be freely distributed and used under the terms of the GNU GPL v2+. * @@ -55,27 +55,18 @@ dump_validate(char *s, char *fmt) return 1; } -static void -dump_init(struct pci_access *a) +static const char * +dump_parse(struct pci_access *a, FILE *f) { - char *name = pci_get_param(a, "dump.name"); - FILE *f; char buf[256]; struct pci_dev *dev = NULL; int len, mn, bn, dn, fn, i, j; - if (!name) - a->error("dump: File name not given."); - if (!(f = fopen(name, "r"))) - a->error("dump: Cannot open %s: %s", name, strerror(errno)); while (fgets(buf, sizeof(buf)-1, f)) { char *z = strchr(buf, '\n'); if (!z) - { - fclose(f); - a->error("dump: line too long or unterminated"); - } + return "Line too long or unterminated"; *z-- = 0; if (z >= buf && *z == '\r') *z-- = 0; @@ -104,10 +95,7 @@ dump_init(struct pci_access *a) sscanf(z, "%x", &j) == 1 && j < 256) { if (i >= 4096) - { - fclose(f); - a->error("dump: At most 4096 bytes of config space are supported"); - } + return "At most 4096 bytes of config space are supported"; if (i >= dd->allocated) /* Need to re-allocate the buffer */ { dump_alloc_data(dev, 4096); @@ -123,13 +111,30 @@ dump_init(struct pci_access *a) z++; } if (*z) - { - fclose(f); - a->error("dump: Malformed line"); - } + return "Malformed line"; } } + + return NULL; +} + +static void +dump_init(struct pci_access *a) +{ + char *name = pci_get_param(a, "dump.name"); + FILE *f; + + if (!name) + a->error("dump: File name not given."); + if (!(f = fopen(name, "r"))) + a->error("dump: Cannot open %s: %s", name, strerror(errno)); + + const char *err = dump_parse(a, f); + fclose(f); + + if (err) + a->error("dump: %s", err); } static void