summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pciconf/pciconf.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/pciconf/pciconf.c')
-rw-r--r--usr.sbin/pciconf/pciconf.c49
1 files changed, 24 insertions, 25 deletions
diff --git a/usr.sbin/pciconf/pciconf.c b/usr.sbin/pciconf/pciconf.c
index 194da6b..d62ce77 100644
--- a/usr.sbin/pciconf/pciconf.c
+++ b/usr.sbin/pciconf/pciconf.c
@@ -67,7 +67,7 @@ struct pci_vendor_info
char *desc;
};
-TAILQ_HEAD(,pci_vendor_info) pci_vendors;
+static TAILQ_HEAD(,pci_vendor_info) pci_vendors;
static struct pcisel getsel(const char *str);
static void list_bridge(int fd, struct pci_conf *p);
@@ -896,40 +896,39 @@ getdevice(const char *name)
static struct pcisel
parsesel(const char *str)
{
- char *ep = strchr(str, '@');
- char *epbase;
+ const char *ep;
+ char *eppos;
struct pcisel sel;
unsigned long selarr[4];
int i;
- if (ep == NULL)
- ep = (char *)str;
- else
+ ep = strchr(str, '@');
+ if (ep != NULL)
ep++;
-
- epbase = ep;
+ else
+ ep = str;
if (strncmp(ep, "pci", 3) == 0) {
ep += 3;
i = 0;
- do {
- selarr[i++] = strtoul(ep, &ep, 10);
- } while ((*ep == ':' || *ep == '.') && *++ep != '\0' && i < 4);
-
- if (i > 2)
- sel.pc_func = selarr[--i];
- else
- sel.pc_func = 0;
- sel.pc_dev = selarr[--i];
- sel.pc_bus = selarr[--i];
- if (i > 0)
- sel.pc_domain = selarr[--i];
- else
- sel.pc_domain = 0;
+ while (isdigit(*ep) && i < 4) {
+ selarr[i++] = strtoul(ep, &eppos, 10);
+ ep = eppos;
+ if (*ep == ':') {
+ ep++;
+ if (*ep == '\0')
+ i = 0;
+ }
+ }
+ if (i > 0 && *ep == '\0') {
+ sel.pc_func = (i > 2) ? selarr[--i] : 0;
+ sel.pc_dev = (i > 0) ? selarr[--i] : 0;
+ sel.pc_bus = (i > 0) ? selarr[--i] : 0;
+ sel.pc_domain = (i > 0) ? selarr[--i] : 0;
+ return (sel);
+ }
}
- if (*ep != '\x0' || ep == epbase)
- errx(1, "cannot parse selector %s", str);
- return sel;
+ errx(1, "cannot parse selector %s", str);
}
static struct pcisel
OpenPOWER on IntegriCloud