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 e42c090..ce1674b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -189,6 +189,7 @@ virDomainDeviceAddressTypeToString; virDomainDefAddDiskControllers; virDomainDefClearPCIAddresses; virDomainDefClearDeviceAliases; +virDomainDeviceInfoIterate; # domain_event.h -- 1.6.5.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list