X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Ffilter.c;h=eb375c49022d4e3e7b347befda47de3e0a318b08;hb=d3cd9d2cfad345f878bc8b27c89cb38394ebbf90;hp=299af2994998338e3034cebc113c8d24ed845c5a;hpb=727ce158868ed101006ecc5d3dd3faede927165c;p=pciutils.git diff --git a/lib/filter.c b/lib/filter.c index 299af29..eb375c4 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -1,9 +1,7 @@ /* - * $Id: filter.c,v 1.1 1999/01/22 21:05:22 mj Exp $ + * The PCI Library -- Device Filtering * - * Linux PCI Library -- Device Filtering - * - * Copyright (c) 1998--1999 Martin Mares + * Copyright (c) 1998--2003 Martin Mares * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -14,30 +12,45 @@ #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); - if ((e && *e) || (x < 0 || x >= 0xff)) + long int x = strtol(bus, &e, 16); + if ((e && *e) || (x < 0 || x > 0xff)) return "Invalid bus number"; f->bus = x; } @@ -47,14 +60,14 @@ pci_filter_parse_slot(struct pci_filter *f, char *str) if (mid[0] && strcmp(mid, "*")) { long int x = strtol(mid, &e, 16); - if ((e && *e) || (x < 0 || x >= 0x1f)) + if ((e && *e) || (x < 0 || x > 0x1f)) return "Invalid slot number"; f->slot = x; } if (dot && dot[0] && strcmp(dot, "*")) { long int x = strtol(dot, &e, 16); - if ((e && *e) || (x < 0 || x >= 7)) + if ((e && *e) || (x < 0 || x > 7)) return "Invalid function number"; f->func = 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;