From dfad53d5feed1111c2f660fb4d8e44ac004cf206 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 31 Jul 2008 12:39:56 +0100 Subject: [PATCH] xend: Fix portability issue of lspci option. Signed-off-by: Yosuke Iwamatsu --- tools/python/xen/util/pci.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/tools/python/xen/util/pci.py b/tools/python/xen/util/pci.py index b8f8b6c4b8..2fce04a8c5 100644 --- a/tools/python/xen/util/pci.py +++ b/tools/python/xen/util/pci.py @@ -111,15 +111,22 @@ def parse_hex(val): return None def parse_pci_name(pci_name_string): - # Format: xxxx:xx:xx.x - s = pci_name_string - s = s.split(':') - dom = parse_hex(s[0]) - bus = parse_hex(s[1]) - s = s[2].split('.') - dev = parse_hex(s[0]) - func = parse_hex(s[1]) - return (dom, bus, dev, func) + pci_match = re.match(r"((?P[0-9a-fA-F]{1,4})[:,])?" + \ + r"(?P[0-9a-fA-F]{1,2})[:,]" + \ + r"(?P[0-9a-fA-F]{1,2})[.,]" + \ + r"(?P[0-7])$", pci_name_string) + if pci_match is None: + raise PciDeviceParseError(('Failed to parse pci device name: %s' % + pci_name_string)) + pci_dev_info = pci_match.groupdict('0') + + domain = parse_hex(pci_dev_info['domain']) + bus = parse_hex(pci_dev_info['bus']) + slot = parse_hex(pci_dev_info['slot']) + func = parse_hex(pci_dev_info['func']) + + return (domain, bus, slot, func) + def find_sysfs_mnt(): global sysfs_mnt_point @@ -175,14 +182,14 @@ def create_lspci_info(): # Execute 'lspci' command and parse the result. # If the command does not exist, lspci_info will be kept blank ({}). - for paragraph in os.popen(LSPCI_CMD + ' -vmmD').read().split('\n\n'): + for paragraph in os.popen(LSPCI_CMD + ' -vmm').read().split('\n\n'): device_name = None device_info = {} for line in paragraph.split('\n'): try: (opt, value) = line.split(':\t') if opt == 'Slot': - device_name = value + device_name = PCI_DEV_FORMAT_STR % parse_pci_name(value) else: device_info[opt] = value except: -- 2.30.2