From a27148070fb16a9c3a80c066c0a0dd10cf1b8074 Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Mon, 19 Nov 2007 22:32:17 +0000 Subject: [PATCH] Initial import of pypciscan --- pypciscan.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++ pypciscan.spec | 47 +++++++++++++++++++++++++ setup.py | 12 +++++++ 3 files changed, 154 insertions(+) create mode 100644 pypciscan.c create mode 100644 pypciscan.spec create mode 100644 setup.py diff --git a/pypciscan.c b/pypciscan.c new file mode 100644 index 0000000..02087d6 --- /dev/null +++ b/pypciscan.c @@ -0,0 +1,95 @@ +/* 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 + +#include +#include + +#include + + +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; + + 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); + } + + 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, + subdevice, subvendor, dev->device_class); + 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); +} diff --git a/pypciscan.spec b/pypciscan.spec new file mode 100644 index 0000000..0a701c0 --- /dev/null +++ b/pypciscan.spec @@ -0,0 +1,47 @@ +%{!?python_sitearch: %define python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")} + +Summary: Scan PCI devices from Python +Name: pypciscan +Version: 0.1 +Release: 1 +License: BSD +URL: http://svn.planet-lab.org/wiki/pypciscan +Group: System Environment/Libraries + +BuildRequires: pciutils-devel + +Source0: pypciscan-%{version}.tar.bz2 + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(id -un) + + +%description +pypciscan is a Python library to scan PCI devices using +pciutils' libpci. + + +%prep +%setup -q + + +%build +CFLAGS="%{optflags}" %{__python} setup.py build + + +%install +rm -fr "%{buildroot}" +%{__python} setup.py install -O1 --skip-build --root "%{buildroot}" + + +%clean +rm -fr "%{buildroot}" + + +%files +%defattr(-,root,root,-) +%{python_sitearch}/pypciscan.so + + +%changelog +* Mon Nov 19 2007 Daniel Hokka Zakrisson - 0.1-1 +- initial release diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..f30ff9e --- /dev/null +++ b/setup.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +from distutils.core import setup, Extension + +setup(name='pypciscan', + version='0.1', + description='PCI scanning from Python', + author='Daniel Hokka Zakrisson', + author_email='daniel@hozac.com', + ext_modules=[Extension('pypciscan', ['pypciscan.c'], + libraries=['pci', 'z'])], + ) -- 2.43.0