Add helper APIs for iterating over PCI device resource files

* src/pci.h, src/pci.c: Helper for iterating over PCI device
  resource files
* src/libvirt_private.syms: Export pciDeviceFileIterate
This commit is contained in:
Daniel P. Berrange 2009-08-14 14:20:40 +01:00
parent 1e060bf2d7
commit ec31cd76c9
3 changed files with 69 additions and 1 deletions

View File

@ -294,6 +294,8 @@ pciDeviceListNew;
pciDeviceListFree;
pciDeviceListAdd;
pciDeviceListDel;
pciDeviceFileIterate;
# qparams.h
qparam_get_query;

View File

@ -1022,3 +1022,55 @@ pciDeviceListFind(pciDeviceList *list, pciDevice *dev)
return list->devs[i];
return NULL;
}
int pciDeviceFileIterate(virConnectPtr conn,
pciDevice *dev,
pciDeviceFileActor actor,
void *opaque)
{
char *pcidir = NULL;
char *file = NULL;
DIR *dir = NULL;
int ret = -1;
struct dirent *ent;
if (virAsprintf(&pcidir, "/sys/bus/pci/devices/%04x:%02x:%02x.%x",
dev->domain, dev->bus, dev->slot, dev->function) < 0) {
virReportOOMError(conn);
goto cleanup;
}
if (!(dir = opendir(pcidir))) {
virReportSystemError(conn, errno,
_("cannot open %s"), pcidir);
goto cleanup;
}
while ((ent = readdir(dir)) != NULL) {
/* Device assignment requires:
* $PCIDIR/config, $PCIDIR/resource, $PCIDIR/resourceNNN, $PCIDIR/rom
*/
if (STREQ(ent->d_name, "config") ||
STRPREFIX(ent->d_name, "resource") ||
STREQ(ent->d_name, "rom")) {
if (virAsprintf(&file, "%s/%s", pcidir, ent->d_name) < 0) {
virReportOOMError(conn);
goto cleanup;
}
if ((actor)(conn, dev, file, opaque) < 0)
goto cleanup;
VIR_FREE(file);
}
}
ret = 0;
cleanup:
if (dir)
closedir(dir);
VIR_FREE(file);
VIR_FREE(pcidir);
return ret;
}

View File

@ -22,7 +22,6 @@
#ifndef __VIR_PCI_H__
#define __VIR_PCI_H__
#include <config.h>
#include "internal.h"
typedef struct _pciDevice pciDevice;
@ -62,4 +61,19 @@ void pciDeviceListDel (virConnectPtr conn,
pciDevice * pciDeviceListFind (pciDeviceList *list,
pciDevice *dev);
/*
* Callback that will be invoked once for each file
* associated with / used for PCI host device access.
*
* Should return 0 if successfully processed, or
* -1 to indicate error and abort iteration
*/
typedef int (*pciDeviceFileActor)(virConnectPtr conn, pciDevice *dev,
const char *path, void *opaque);
int pciDeviceFileIterate(virConnectPtr conn,
pciDevice *dev,
pciDeviceFileActor actor,
void *opaque);
#endif /* __VIR_PCI_H__ */