X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Ffilter.c;h=eb375c49022d4e3e7b347befda47de3e0a318b08;hb=dc01dd60affb4688453f8b7204af66246f0850db;hp=468e5722ed1be518cdf9270fffa7bdb01bc2a20c;hpb=cba7c00fce054be95676e37150e58439e6f7630c;p=pciutils.git diff --git a/lib/filter.c b/lib/filter.c index 468e572..eb375c4 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -1,9 +1,7 @@ /* - * $Id: filter.c,v 1.2 2002/03/24 12:14:21 mj Exp $ + * The PCI Library -- Device Filtering * - * Linux PCI Library -- Device Filtering - * - * Copyright (c) 1998--2002 Martin Mares + * Copyright (c) 1998--2003 Martin Mares * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -14,29 +12,44 @@ #include "internal.h" void -pci_filter_init(struct pci_access * UNUSED a, struct pci_filter *f) +pci_filter_init(struct pci_access *a UNUSED, struct pci_filter *f) { - f->bus = f->slot = f->func = -1; + f->domain = f->bus = f->slot = f->func = -1; f->vendor = f->device = -1; } -/* Slot filter syntax: [[bus]:][slot][.[func]] */ +/* Slot filter syntax: [[[domain]:][bus]:][slot][.[func]] */ char * pci_filter_parse_slot(struct pci_filter *f, char *str) { - char *colon = strchr(str, ':'); + char *colon = strrchr(str, ':'); char *dot = strchr((colon ? colon + 1 : str), '.'); char *mid = str; - char *e; + char *e, *bus, *colon2; if (colon) { *colon++ = 0; mid = colon; - if (str[0] && strcmp(str, "*")) + colon2 = strchr(str, ':'); + if (colon2) + { + *colon2++ = 0; + bus = colon2; + if (str[0] && strcmp(str, "*")) + { + long int x = strtol(str, &e, 16); + if ((e && *e) || (x < 0 || x > 0xffff)) + return "Invalid domain number"; + f->domain = x; + } + } + else + bus = str; + if (bus[0] && strcmp(bus, "*")) { - long int x = strtol(str, &e, 16); + long int x = strtol(bus, &e, 16); if ((e && *e) || (x < 0 || x > 0xff)) return "Invalid bus number"; f->bus = x; @@ -94,7 +107,8 @@ pci_filter_parse_id(struct pci_filter *f, char *str) int pci_filter_match(struct pci_filter *f, struct pci_dev *d) { - if ((f->bus >= 0 && f->bus != d->bus) || + if ((f->domain >= 0 && f->domain != d->domain) || + (f->bus >= 0 && f->bus != d->bus) || (f->slot >= 0 && f->slot != d->dev) || (f->func >= 0 && f->func != d->func)) return 0;