On Mon, Feb 01, 2010 at 06:39:34PM +0000, Daniel P. Berrange wrote: > The virDomainDeviceInfoIterate() function will provide a > convenient way to iterate over all devices in a domain. > > * src/conf/domain_conf.c, src/conf/domain_conf.h, > src/libvirt_private.syms: Add virDomainDeviceInfoIterate() > function. > --- > src/conf/domain_conf.c | 67 +++++++++++++++++++++++++++++++--------------- > src/conf/domain_conf.h | 8 +++++ > src/libvirt_private.syms | 1 + > 3 files changed, 54 insertions(+), 22 deletions(-) > > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index e548d1d..691fc84 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -824,59 +824,82 @@ void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info) > } > > > -static void virDomainDeviceInfoClearField(virDomainDeviceInfoPtr info, int alias, int pciaddr) > +static int virDomainDeviceInfoClearAlias(virDomainDefPtr def ATTRIBUTE_UNUSED, > + virDomainDeviceInfoPtr info, > + void *opaque ATTRIBUTE_UNUSED) > { > - if (alias) > - VIR_FREE(info->alias); > - if (pciaddr && > - info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { > + VIR_FREE(info->alias); > + return 0; > +} > + > +static int virDomainDeviceInfoClearPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, > + virDomainDeviceInfoPtr info, > + void *opaque ATTRIBUTE_UNUSED) > +{ > + if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { > memset(&info->addr, 0, sizeof(info->addr)); > info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE; > } > + return 0; > } > > - > -static void virDomainDefClearDeviceInfo(virDomainDefPtr def, int alias, int pciaddr) > +int virDomainDeviceInfoIterate(virDomainDefPtr def, > + virDomainDeviceInfoCallback cb, > + void *opaque) > { > int i; > > for (i = 0; i < def->ndisks ; i++) > - virDomainDeviceInfoClearField(&def->disks[i]->info, alias, pciaddr); > + if (cb(def, &def->disks[i]->info, opaque) < 0) > + return -1; > for (i = 0; i < def->nnets ; i++) > - virDomainDeviceInfoClearField(&def->nets[i]->info, alias, pciaddr); > + if (cb(def, &def->nets[i]->info, opaque) < 0) > + return -1; > for (i = 0; i < def->nsounds ; i++) > - virDomainDeviceInfoClearField(&def->sounds[i]->info, alias, pciaddr); > + if (cb(def, &def->sounds[i]->info, opaque) < 0) > + return -1; > for (i = 0; i < def->nhostdevs ; i++) > - virDomainDeviceInfoClearField(&def->hostdevs[i]->info, alias, pciaddr); > + if (cb(def, &def->hostdevs[i]->info, opaque) < 0) > + return -1; > for (i = 0; i < def->nvideos ; i++) > - virDomainDeviceInfoClearField(&def->videos[i]->info, alias, pciaddr); > + if (cb(def, &def->videos[i]->info, opaque) < 0) > + return -1; > for (i = 0; i < def->ncontrollers ; i++) > - virDomainDeviceInfoClearField(&def->controllers[i]->info, alias, pciaddr); > + if (cb(def, &def->controllers[i]->info, opaque) < 0) > + return -1; > for (i = 0; i < def->nserials ; i++) > - virDomainDeviceInfoClearField(&def->serials[i]->info, alias, pciaddr); > + if (cb(def, &def->serials[i]->info, opaque) < 0) > + return -1; > for (i = 0; i < def->nparallels ; i++) > - virDomainDeviceInfoClearField(&def->parallels[i]->info, alias, pciaddr); > + if (cb(def, &def->parallels[i]->info, opaque) < 0) > + return -1; > for (i = 0; i < def->nchannels ; i++) > - virDomainDeviceInfoClearField(&def->channels[i]->info, alias, pciaddr); > + if (cb(def, &def->channels[i]->info, opaque) < 0) > + return -1; > for (i = 0; i < def->ninputs ; i++) > - virDomainDeviceInfoClearField(&def->inputs[i]->info, alias, pciaddr); > + if (cb(def, &def->inputs[i]->info, opaque) < 0) > + return -1; > for (i = 0; i < def->nfss ; i++) > - virDomainDeviceInfoClearField(&def->fss[i]->info, alias, pciaddr); > + if (cb(def, &def->fss[i]->info, opaque) < 0) > + return -1; > if (def->watchdog) > - virDomainDeviceInfoClearField(&def->watchdog->info, alias, pciaddr); > + if (cb(def, &def->watchdog->info, opaque) < 0) > + return -1; > if (def->console) > - virDomainDeviceInfoClearField(&def->console->info, alias, pciaddr); > + if (cb(def, &def->console->info, opaque) < 0) > + return -1; > + return 0; > } > > > void virDomainDefClearPCIAddresses(virDomainDefPtr def) > { > - virDomainDefClearDeviceInfo(def, 0, 1); > + virDomainDeviceInfoIterate(def, virDomainDeviceInfoClearPCIAddress, NULL); > } > > void virDomainDefClearDeviceAliases(virDomainDefPtr def) > { > - virDomainDefClearDeviceInfo(def, 1, 0); > + virDomainDeviceInfoIterate(def, virDomainDeviceInfoClearAlias, NULL); > } > > > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index 7be090d..be0dc92 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -742,6 +742,14 @@ void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info); > void virDomainDefClearPCIAddresses(virDomainDefPtr def); > void virDomainDefClearDeviceAliases(virDomainDefPtr def); > > +typedef int (*virDomainDeviceInfoCallback)(virDomainDefPtr def, > + virDomainDeviceInfoPtr dev, > + void *opaque); > + > +int virDomainDeviceInfoIterate(virDomainDefPtr def, > + virDomainDeviceInfoCallback cb, > + void *opaque); > + > void virDomainDefFree(virDomainDefPtr vm); > void virDomainObjRef(virDomainObjPtr vm); > /* Returns 1 if the object was freed, 0 if more refs exist */ > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms > index d56fb7d..e5e8860 100644 > --- a/src/libvirt_private.syms > +++ b/src/libvirt_private.syms > @@ -187,6 +187,7 @@ virDomainDeviceAddressTypeToString; > virDomainDefAddDiskControllers; > virDomainDefClearPCIAddresses; > virDomainDefClearDeviceAliases; > +virDomainDeviceInfoIterate; > > > # domain_event.h Patch really tries hard to reconciliate things it should not, but looks fine ! ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list