Install pypci.py.
Package not made noarch due to (old?) yum issues with going from arch to noarch.
import os
-try:
- from pypciscan import get_devices
-except:
- def get_devices():
- """ This is a replacement to the version in pypciscan library for 3.3 and lower bootcds
- that will help maintain backward compatibility. This version has limitations wrt accuracy
- that the library does not. In particular it is limited to the output of
- lspci and 'forces' all devices to appear on the '0000' domain, rather than
- where they actually are."""
-
- ret = {}
- pci_cmd = os.popen("""/sbin/lspci -nvm | sed -e 's/\t/ /g' -e 's/ Class //' -e 's/^/"/' -e 's/$/"/' -e 's/$/,/' -e 's/^"",$/],[/'""", 'r')
- pci_str = "[" + pci_cmd.read() + "]"
- pci_list = eval(pci_str)
-
- pci_devlist = []
- # convert each entry into a dict. and convert strings to ints.
- for dev in pci_list:
- rec = {}
- for field in dev:
- s = field.split(":")
- if len(s) > 2:
- # There are two 'device' fields in the output. Append
- # 'addr' for the bus address, identified by the extra ':'.
- end=":".join(s[1:])
- key = s[0].lower() + "addr"
- value = end.strip()
- else:
- key = s[0].lower()
- value = int(s[1].strip(), 16)
-
- rec[key] = value
-
- pci_devlist.append(rec)
-
- ret = {}
- # convert this list of devices into the format expected by the
- # consumer of get_devices()
- for dev in pci_devlist:
- if 'device' not in dev:
- continue
-
- if 'sdevice' in dev: subdev = dev['sdevice']
- else: subdev = 0xffffffffL
-
- if 'svendor' in dev: subvend = dev['svendor']
- else: subvend = 0xffffffffL
-
- key = "0000:%s" % dev['deviceaddr']
- value = (dev['vendor'], dev['device'], subvend, subdev, dev['class'] << 8)
- ret[key] = value
-
- return ret
+
+def get_devices():
+ """ This is a replacement to the pypciscan library."""
+
+ ret = {}
+ pci_cmd = os.popen("""/sbin/lspci -Dnvm | sed -e 's/\t/ /g' -e 's/^/"/' -e 's/$/"/' -e 's/$/,/' -e 's/^"",$/],[/'""", 'r')
+ pci_str = "[" + pci_cmd.read() + "]"
+ pci_list = eval(pci_str)
+
+ pci_devlist = []
+ # convert each entry into a dict. and convert strings to ints.
+ for dev in pci_list:
+ rec = {}
+ for field in dev:
+ s = field.split(":")
+ if len(s) > 2:
+ # There are two 'device' fields in the output. Append
+ # 'addr' for the bus address, identified by the extra ':'.
+ end=":".join(s[1:])
+ key = s[0].lower() + "addr"
+ value = end.strip()
+ else:
+ key = s[0].lower()
+ value = int(s[1].strip(), 16)
+
+ rec[key] = value
+
+ pci_devlist.append(rec)
+
+ ret = {}
+ # convert this list of devices into the format expected by the
+ # consumer of get_devices()
+ for dev in pci_devlist:
+ if 'deviceaddr' not in dev:
+ continue
+
+ if 'sdevice' in dev: subdev = dev['sdevice']
+ else: subdev = 0xffffffffL
+
+ if 'svendor' in dev: subvend = dev['svendor']
+ else: subvend = 0xffffffffL
+
+ if 'progif' in dev: progif = dev['progif']
+ else: progif = 0
+
+ value = (dev['vendor'], dev['device'], subvend, subdev, dev['class'] << 8 | progif)
+ ret[dev['deviceaddr']] = value
+
+ return ret
import pypcimap
%define url $URL$
%define name pypcilib
-%define version 0.1
+%define version 0.2
%define taglevel 1
%define release %{taglevel}%{?pldistro:.%{pldistro}}%{?date:.%{date}}
#URL: http://svn.planet-lab.org/wiki/pypcilib
URL: %(echo %{url} | cut -d ' ' -f 2)
-BuildRequires: pciutils-devel
-
Source0: pypcilib-%{version}.tar.bz2
+Requires: /sbin/lspci
+
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(id -un)
%description
%build
-CFLAGS="%{optflags}" %{__python} setup.py build
+%{__python} setup.py build
%install
rm -fr "%{buildroot}"
%{__python} setup.py install -O1 --skip-build --root "%{buildroot}"
-touch %{buildroot}%{python_sitearch}/pypcimap.py{c,o}
+touch %{buildroot}%{python_sitelib}/pypcimap.py{c,o}
+touch %{buildroot}%{python_sitelib}/pypci.py{c,o}
%clean
%files
%defattr(-,root,root,-)
-%{python_sitearch}/pypciscan.so
-%{python_sitearch}/pypcimap.py
-%ghost %{python_sitearch}/pypcimap.pyc
-%ghost %{python_sitearch}/pypcimap.pyo
+%{python_sitelib}/pypcimap.py
+%ghost %{python_sitelib}/pypcimap.pyc
+%ghost %{python_sitelib}/pypcimap.pyo
+%{python_sitelib}/pypci.py
+%ghost %{python_sitelib}/pypci.pyc
+%ghost %{python_sitelib}/pypci.pyo
%changelog
+* Fri Mar 14 2008 Daniel Hokka Zakrisson <daniel@hozac.com> - 0.2-1
+- Remove pypciscan library, reimplemented in Python
+
* Mon Nov 19 2007 Daniel Hokka Zakrisson <daniel@hozac.com> - 0.1-1
- initial release
+++ /dev/null
-/* Copyright 2007 The Trustees of Princeton University
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-* Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following
-disclaimer in the documentation and/or other materials provided
-with the distribution.
-
-* Neither the name of the copyright holder nor the names of its
-contributors may be used to endorse or promote products derived
-from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PRINCETON
-UNIVERSITY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
-OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
-WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-#include <Python.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <pci/pci.h>
-
-
-static PyObject *get_devices(PyObject *self, PyObject *args)
-{
- struct pci_access *pacc;
- struct pci_dev *dev;
- PyObject *ret;
- char buf[128];
-
- if ((pacc = pci_alloc()) == NULL)
- return PyErr_SetFromErrno(PyExc_OSError);
-
- pci_init(pacc);
-
- pci_scan_bus(pacc);
-
- ret = PyDict_New();
- if (!ret)
- return PyErr_SetFromErrno(PyExc_OSError);
-
- for (dev = pacc->devices; dev; dev = dev->next) {
- u16 subvendor = -1, subdevice = -1;
- PyObject *value;
- u8 progif = 0;
-
- pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_CLASS);
- if (dev->hdrtype == PCI_HEADER_TYPE_NORMAL) {
- subvendor = pci_read_word(dev, PCI_SUBSYSTEM_VENDOR_ID);
- subdevice = pci_read_word(dev, PCI_SUBSYSTEM_ID);
- }
- progif = pci_read_byte(dev, PCI_CLASS_PROG);
-
- snprintf(buf, sizeof(buf), "%04x:%02x:%02x.%02x", dev->domain, dev->bus, dev->dev, dev->func);
- value = Py_BuildValue("iiiii", dev->vendor_id, dev->device_id,
- subvendor, subdevice, dev->device_class << 8 | progif);
- if (!value)
- return NULL;
- if (PyDict_SetItemString(ret, buf, value) == -1)
- return NULL;
- }
-
- return ret;
-}
-
-
-static PyMethodDef methods[] = {
- { "get_devices", get_devices, METH_VARARGS,
- "Returns a dict of PCI devices, indexed by the domain:bus:dev.func string, "
- "each item consisting of [vendor, device, subvendor, subdevice, class]" },
- { NULL, NULL, 0, NULL }
-};
-
-PyMODINIT_FUNC
-initpypciscan(void)
-{
- PyObject *mod;
- mod = Py_InitModule("pypciscan", methods);
-}
from distutils.core import setup, Extension
setup(name='pypciscan',
- version='0.1',
+ version='0.2',
description='PCI scanning from Python',
- author='Daniel Hokka Zakrisson',
+ author='Daniel Hokka Zakrisson and Stephen Soltesz',
author_email='daniel@hozac.com',
- py_modules=['pypcimap'],
- ext_modules=[Extension('pypciscan', ['pypciscan.c'],
- libraries=['pci', 'z'])],
+ py_modules=['pypcimap', 'pypci'],
)