static void virDomainSnapshotDiskDefFormat(virBufferPtr buf, virDomainSnapshotDiskDefPtr disk) { int type = disk->src->type; if (!disk->name) return; virBufferEscapeString(buf, "<disk name='%s'", disk->name); if (disk->snapshot > 0) virBufferAsprintf(buf, " snapshot='%s'", virDomainSnapshotLocationTypeToString(disk->snapshot)); if (!disk->src->path && disk->src->format == 0) { virBufferAddLit(buf, "/>\n"); return; } virBufferAsprintf(buf, " type='%s'>\n", virStorageTypeToString(type)); virBufferAdjustIndent(buf, 2); if (disk->src->format > 0) virBufferEscapeString(buf, "<driver type='%s'/>\n", virStorageFileFormatTypeToString(disk->src->format)); virDomainDiskSourceFormat(buf, disk->src, 0, 0); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</disk>\n"); }
static void virDomainSnapshotDiskDefFormat(virBufferPtr buf, virDomainSnapshotDiskDefPtr disk) { int type = disk->type; if (!disk->name) return; virBufferEscapeString(buf, " <disk name='%s'", disk->name); if (disk->snapshot > 0) virBufferAsprintf(buf, " snapshot='%s'", virDomainSnapshotLocationTypeToString(disk->snapshot)); if (type < 0) type = VIR_DOMAIN_DISK_TYPE_FILE; if (!disk->file && disk->format == 0) { virBufferAddLit(buf, "/>\n"); return; } virBufferAddLit(buf, ">\n"); if (disk->format > 0) virBufferEscapeString(buf, " <driver type='%s'/>\n", virStorageFileFormatTypeToString(disk->format)); virDomainDiskSourceDefFormatInternal(buf, type, disk->file, 0, 0, 0, NULL, 0, NULL, NULL, 0); virBufferAddLit(buf, " </disk>\n"); }
char * virSecretDefFormat(const virSecretDef *def) { virBuffer buf = VIR_BUFFER_INITIALIZER; const unsigned char *uuid; char uuidstr[VIR_UUID_STRING_BUFLEN]; virBufferAsprintf(&buf, "<secret ephemeral='%s' private='%s'>\n", def->isephemeral ? "yes" : "no", def->isprivate ? "yes" : "no"); uuid = def->uuid; virUUIDFormat(uuid, uuidstr); virBufferAdjustIndent(&buf, 2); virBufferEscapeString(&buf, "<uuid>%s</uuid>\n", uuidstr); if (def->description != NULL) virBufferEscapeString(&buf, "<description>%s</description>\n", def->description); if (def->usage_type != VIR_SECRET_USAGE_TYPE_NONE && virSecretDefFormatUsage(&buf, def) < 0) goto error; virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "</secret>\n"); if (virBufferCheckError(&buf) < 0) goto error; return virBufferContentAndReset(&buf); error: virBufferFreeAndReset(&buf); return NULL; }
static void virSysinfoMemoryFormat(virBufferPtr buf, virSysinfoDefPtr def) { size_t i; virSysinfoMemoryDefPtr memory; for (i = 0; i < def->nmemory; i++) { memory = &def->memory[i]; if (!memory->memory_size && !memory->memory_form_factor && !memory->memory_locator && !memory->memory_bank_locator && !memory->memory_type && !memory->memory_type_detail && !memory->memory_speed && !memory->memory_manufacturer && !memory->memory_serial_number && !memory->memory_part_number) continue; virBufferAddLit(buf, "<memory_device>\n"); virBufferAdjustIndent(buf, 2); virBufferEscapeString(buf, "<entry name='size'>%s</entry>\n", memory->memory_size); virBufferEscapeString(buf, "<entry name='form_factor'>%s</entry>\n", memory->memory_form_factor); virBufferEscapeString(buf, "<entry name='locator'>%s</entry>\n", memory->memory_locator); virBufferEscapeString(buf, "<entry name='bank_locator'>%s</entry>\n", memory->memory_bank_locator); virBufferEscapeString(buf, "<entry name='type'>%s</entry>\n", memory->memory_type); virBufferEscapeString(buf, "<entry name='type_detail'>%s</entry>\n", memory->memory_type_detail); virBufferEscapeString(buf, "<entry name='speed'>%s</entry>\n", memory->memory_speed); virBufferEscapeString(buf, "<entry name='manufacturer'>%s</entry>\n", memory->memory_manufacturer); virBufferEscapeString(buf, "<entry name='serial_number'>%s</entry>\n", memory->memory_serial_number); virBufferEscapeString(buf, "<entry name='part_number'>%s</entry>\n", memory->memory_part_number); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</memory_device>\n"); } }
/* returns error description if any received from the server */ char * returnErrorFromSession(xen_session *session) { int i; virBuffer buf = VIR_BUFFER_INITIALIZER; for (i = 0; i < session->error_description_count - 1; i++) { if (!i) virBufferEscapeString(&buf, "%s", session->error_description[i]); else virBufferEscapeString(&buf, " : %s", session->error_description[i]); } return virBufferContentAndReset(&buf); }
/* returns error description if any received from the server */ char * returnErrorFromSession(xen_session *session) { size_t i; virBuffer buf = VIR_BUFFER_INITIALIZER; for (i = 0; i < session->error_description_count; i++) { if (!i) virBufferEscapeString(&buf, "%s", session->error_description[i]); else virBufferEscapeString(&buf, " : %s", session->error_description[i]); } if (virBufferUse(&buf) < 1) virBufferAdd(&buf, _("unknown error"), -1); return virBufferContentAndReset(&buf); }
static void qemuMigrationCookieNetworkXMLFormat(virBufferPtr buf, qemuMigrationCookieNetworkPtr optr) { size_t i; bool empty = true; for (i = 0; i < optr->nnets; i++) { /* If optr->net[i].vporttype is not set, there is nothing to transfer */ if (optr->net[i].vporttype != VIR_NETDEV_VPORT_PROFILE_NONE) { if (empty) { virBufferAddLit(buf, "<network>\n"); virBufferAdjustIndent(buf, 2); empty = false; } virBufferAsprintf(buf, "<interface index='%zu' vporttype='%s'", i, virNetDevVPortTypeToString(optr->net[i].vporttype)); if (optr->net[i].portdata) { virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); virBufferEscapeString(buf, "<portdata>%s</portdata>\n", optr->net[i].portdata); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</interface>\n"); } else { virBufferAddLit(buf, "/>\n"); } } } if (!empty) { virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</network>\n"); } }
static dnsmasqHostsfile * hostsfileNew(const char *name, const char *config_dir) { dnsmasqHostsfile *hostsfile; virBuffer buf = VIR_BUFFER_INITIALIZER; if (VIR_ALLOC(hostsfile) < 0) return NULL; hostsfile->hosts = NULL; hostsfile->nhosts = 0; virBufferAsprintf(&buf, "%s", config_dir); virBufferEscapeString(&buf, "/%s", name); virBufferAsprintf(&buf, ".%s", DNSMASQ_HOSTSFILE_SUFFIX); if (virBufferCheckError(&buf) < 0) goto error; if (!(hostsfile->path = virBufferContentAndReset(&buf))) goto error; return hostsfile; error: virBufferFreeAndReset(&buf); hostsfileFree(hostsfile); return NULL; }
static int virSecretDefFormatUsage(virBufferPtr buf, const virSecretDef *def) { const char *type; type = virSecretUsageTypeToString(def->usage_type); if (type == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected secret usage type %d"), def->usage_type); return -1; } virBufferAsprintf(buf, "<usage type='%s'>\n", type); virBufferAdjustIndent(buf, 2); switch (def->usage_type) { case VIR_SECRET_USAGE_TYPE_NONE: break; case VIR_SECRET_USAGE_TYPE_VOLUME: virBufferEscapeString(buf, "<volume>%s</volume>\n", def->usage.volume); break; case VIR_SECRET_USAGE_TYPE_CEPH: virBufferEscapeString(buf, "<name>%s</name>\n", def->usage.ceph); break; case VIR_SECRET_USAGE_TYPE_ISCSI: virBufferEscapeString(buf, "<target>%s</target>\n", def->usage.target); break; case VIR_SECRET_USAGE_TYPE_PASSPHRASE: virBufferEscapeString(buf, "<name>%s</name>\n", def->usage.name); break; default: virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected secret usage type %d"), def->usage_type); return -1; } virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</usage>\n"); return 0; }
static void virSysinfoSystemFormat(virBufferPtr buf, virSysinfoSystemDefPtr def) { if (!def) return; virBufferAddLit(buf, "<system>\n"); virBufferAdjustIndent(buf, 2); virBufferEscapeString(buf, "<entry name='manufacturer'>%s</entry>\n", def->manufacturer); virBufferEscapeString(buf, "<entry name='product'>%s</entry>\n", def->product); virBufferEscapeString(buf, "<entry name='version'>%s</entry>\n", def->version); virBufferEscapeString(buf, "<entry name='serial'>%s</entry>\n", def->serial); virBufferEscapeString(buf, "<entry name='uuid'>%s</entry>\n", def->uuid); virBufferEscapeString(buf, "<entry name='sku'>%s</entry>\n", def->sku); virBufferEscapeString(buf, "<entry name='family'>%s</entry>\n", def->family); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</system>\n"); }
static void virSysinfoSystemFormat(virBufferPtr buf, virSysinfoDefPtr def) { if (!def->system_manufacturer && !def->system_product && !def->system_version && !def->system_serial && !def->system_uuid && !def->system_sku && !def->system_family) return; virBufferAddLit(buf, " <system>\n"); virBufferEscapeString(buf, " <entry name='manufacturer'>%s</entry>\n", def->system_manufacturer); virBufferEscapeString(buf, " <entry name='product'>%s</entry>\n", def->system_product); virBufferEscapeString(buf, " <entry name='version'>%s</entry>\n", def->system_version); virBufferEscapeString(buf, " <entry name='serial'>%s</entry>\n", def->system_serial); virBufferEscapeString(buf, " <entry name='uuid'>%s</entry>\n", def->system_uuid); virBufferEscapeString(buf, " <entry name='sku'>%s</entry>\n", def->system_sku); virBufferEscapeString(buf, " <entry name='family'>%s</entry>\n", def->system_family); virBufferAddLit(buf, " </system>\n"); }
static void virSysinfoBIOSFormat(virBufferPtr buf, virSysinfoDefPtr def) { if (!def->bios_vendor && !def->bios_version && !def->bios_date && !def->bios_release) return; virBufferAddLit(buf, " <bios>\n"); virBufferEscapeString(buf, " <entry name='vendor'>%s</entry>\n", def->bios_vendor); virBufferEscapeString(buf, " <entry name='version'>%s</entry>\n", def->bios_version); virBufferEscapeString(buf, " <entry name='date'>%s</entry>\n", def->bios_date); virBufferEscapeString(buf, " <entry name='release'>%s</entry>\n", def->bios_release); virBufferAddLit(buf, " </bios>\n"); }
static void virDomainCapsStringValuesFormat(virBufferPtr buf, virDomainCapsStringValuesPtr values) { size_t i; for (i = 0; i < values->nvalues; i++) virBufferEscapeString(buf, "<value>%s</value>\n", values->values[i]); }
static void virStorageEncryptionInfoDefFormat(virBufferPtr buf, const virStorageEncryptionInfoDef *enc) { virBufferEscapeString(buf, "<cipher name='%s'", enc->cipher_name); virBufferAsprintf(buf, " size='%u'", enc->cipher_size); if (enc->cipher_mode) virBufferEscapeString(buf, " mode='%s'", enc->cipher_mode); if (enc->cipher_hash) virBufferEscapeString(buf, " hash='%s'", enc->cipher_hash); virBufferAddLit(buf, "/>\n"); if (enc->ivgen_name) { virBufferEscapeString(buf, "<ivgen name='%s'", enc->ivgen_name); if (enc->ivgen_hash) virBufferEscapeString(buf, " hash='%s'", enc->ivgen_hash); virBufferAddLit(buf, "/>\n"); } }
static void virSysinfoBIOSFormat(virBufferPtr buf, virSysinfoBIOSDefPtr def) { if (!def) return; virBufferAddLit(buf, "<bios>\n"); virBufferAdjustIndent(buf, 2); virBufferEscapeString(buf, "<entry name='vendor'>%s</entry>\n", def->vendor); virBufferEscapeString(buf, "<entry name='version'>%s</entry>\n", def->version); virBufferEscapeString(buf, "<entry name='date'>%s</entry>\n", def->date); virBufferEscapeString(buf, "<entry name='release'>%s</entry>\n", def->release); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</bios>\n"); }
static void virSysinfoBaseBoardFormat(virBufferPtr buf, virSysinfoBaseBoardDefPtr baseBoard, size_t nbaseBoard) { virSysinfoBaseBoardDefPtr def; size_t i; for (i = 0; i < nbaseBoard; i++) { def = baseBoard + i; virBufferAddLit(buf, "<baseBoard>\n"); virBufferAdjustIndent(buf, 2); virBufferEscapeString(buf, "<entry name='manufacturer'>%s</entry>\n", def->manufacturer); virBufferEscapeString(buf, "<entry name='product'>%s</entry>\n", def->product); virBufferEscapeString(buf, "<entry name='version'>%s</entry>\n", def->version); virBufferEscapeString(buf, "<entry name='serial'>%s</entry>\n", def->serial); virBufferEscapeString(buf, "<entry name='asset'>%s</entry>\n", def->asset); virBufferEscapeString(buf, "<entry name='location'>%s</entry>\n", def->location); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</baseBoard>\n"); } }
char * virDomainCapsFormat(virDomainCapsPtr const caps) { virBuffer buf = VIR_BUFFER_INITIALIZER; const char *virttype_str = virDomainVirtTypeToString(caps->virttype); const char *arch_str = virArchToString(caps->arch); virBufferAddLit(&buf, "<domainCapabilities>\n"); virBufferAdjustIndent(&buf, 2); virBufferEscapeString(&buf, "<path>%s</path>\n", caps->path); virBufferAsprintf(&buf, "<domain>%s</domain>\n", virttype_str); if (caps->machine) virBufferAsprintf(&buf, "<machine>%s</machine>\n", caps->machine); virBufferAsprintf(&buf, "<arch>%s</arch>\n", arch_str); if (caps->maxvcpus) virBufferAsprintf(&buf, "<vcpu max='%d'/>\n", caps->maxvcpus); FORMAT_SINGLE("iothreads", caps->iothreads); virDomainCapsOSFormat(&buf, &caps->os); virDomainCapsCPUFormat(&buf, &caps->cpu); virBufferAddLit(&buf, "<devices>\n"); virBufferAdjustIndent(&buf, 2); virDomainCapsDeviceDiskFormat(&buf, &caps->disk); virDomainCapsDeviceGraphicsFormat(&buf, &caps->graphics); virDomainCapsDeviceVideoFormat(&buf, &caps->video); virDomainCapsDeviceHostdevFormat(&buf, &caps->hostdev); virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "</devices>\n"); virBufferAddLit(&buf, "<features>\n"); virBufferAdjustIndent(&buf, 2); virDomainCapsFeatureGICFormat(&buf, &caps->gic); FORMAT_SINGLE("vmcoreinfo", caps->vmcoreinfo); FORMAT_SINGLE("genid", caps->genid); virDomainCapsFeatureSEVFormat(&buf, caps->sev); virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "</features>\n"); virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "</domainCapabilities>\n"); virBufferCheckError(&buf); return virBufferContentAndReset(&buf); }
static int virDomainCapsFormatInternal(virBufferPtr buf, virDomainCapsPtr const caps) { const char *virttype_str = virDomainVirtTypeToString(caps->virttype); const char *arch_str = virArchToString(caps->arch); virBufferAddLit(buf, "<domainCapabilities>\n"); virBufferAdjustIndent(buf, 2); virBufferEscapeString(buf, "<path>%s</path>\n", caps->path); virBufferAsprintf(buf, "<domain>%s</domain>\n", virttype_str); virBufferAsprintf(buf, "<machine>%s</machine>\n", caps->machine); virBufferAsprintf(buf, "<arch>%s</arch>\n", arch_str); if (caps->maxvcpus) virBufferAsprintf(buf, "<vcpu max='%d'/>\n", caps->maxvcpus); virDomainCapsOSFormat(buf, &caps->os); virDomainCapsCPUFormat(buf, &caps->cpu); virBufferAddLit(buf, "<devices>\n"); virBufferAdjustIndent(buf, 2); virDomainCapsDeviceDiskFormat(buf, &caps->disk); virDomainCapsDeviceGraphicsFormat(buf, &caps->graphics); virDomainCapsDeviceVideoFormat(buf, &caps->video); virDomainCapsDeviceHostdevFormat(buf, &caps->hostdev); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</devices>\n"); virBufferAddLit(buf, "<features>\n"); virBufferAdjustIndent(buf, 2); virDomainCapsFeatureGICFormat(buf, &caps->gic); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</features>\n"); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</domainCapabilities>\n"); return 0; }
static void qemuMigrationCookieGraphicsXMLFormat(virBufferPtr buf, qemuMigrationCookieGraphicsPtr grap) { virBufferAsprintf(buf, "<graphics type='%s' port='%d' listen='%s'", virDomainGraphicsTypeToString(grap->type), grap->port, grap->listen); if (grap->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) virBufferAsprintf(buf, " tlsPort='%d'", grap->tlsPort); if (grap->tlsSubject) { virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); virBufferEscapeString(buf, "<cert info='subject' value='%s'/>\n", grap->tlsSubject); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</graphics>\n"); } else { virBufferAddLit(buf, "/>\n"); } }
/* generate XenAPI boot order format from libvirt format */ char * createXenAPIBootOrderString(int nboot, int *bootDevs) { virBuffer ret = VIR_BUFFER_INITIALIZER; char *val = NULL; size_t i; for (i = 0; i < nboot; i++) { if (bootDevs[i] == VIR_DOMAIN_BOOT_FLOPPY) val = (char *)"a"; else if (bootDevs[i] == VIR_DOMAIN_BOOT_DISK) val = (char *)"c"; else if (bootDevs[i] == VIR_DOMAIN_BOOT_CDROM) val = (char *)"d"; else if (bootDevs[i] == VIR_DOMAIN_BOOT_NET) val = (char *)"n"; if (val) virBufferEscapeString(&ret, "%s", val); } return virBufferContentAndReset(&ret); }
static int testBufInfiniteLoop(const void *data) { virBuffer bufinit = VIR_BUFFER_INITIALIZER; virBufferPtr buf = &bufinit; char *addstr = NULL, *bufret = NULL; int ret = -1; const struct testInfo *info = data; virBufferAddChar(buf, 'a'); /* * Infinite loop used to trigger if: * (strlen + 1 > 1000) && (strlen == buf-size - buf-use - 1) * which was the case after the above addchar at the time of the bug. * This test is a bit fragile, since it relies on virBuffer internals. */ if (virAsprintf(&addstr, "%*s", buf->a - buf->b - 1, "a") < 0) { goto out; } if (info->doEscape) virBufferEscapeString(buf, "%s", addstr); else virBufferAsprintf(buf, "%s", addstr); ret = 0; out: bufret = virBufferContentAndReset(buf); if (!bufret) { TEST_ERROR("Buffer had error set"); ret = -1; } VIR_FREE(addstr); VIR_FREE(bufret); return ret; }
static void virSysinfoProcessorFormat(virBufferPtr buf, virSysinfoDefPtr def) { int i; virSysinfoProcessorDefPtr processor; for (i = 0; i < def->nprocessor; i++) { processor = &def->processor[i]; if (!processor->processor_socket_destination && !processor->processor_type && !processor->processor_family && !processor->processor_manufacturer && !processor->processor_signature && !processor->processor_version && !processor->processor_external_clock && !processor->processor_max_speed && !processor->processor_status && !processor->processor_serial_number && !processor->processor_part_number) continue; virBufferAddLit(buf, " <processor>\n"); virBufferAdjustIndent(buf, 4); virBufferEscapeString(buf, "<entry name='socket_destination'>%s</entry>\n", processor->processor_socket_destination); virBufferEscapeString(buf, "<entry name='type'>%s</entry>\n", processor->processor_type); virBufferEscapeString(buf, "<entry name='family'>%s</entry>\n", processor->processor_family); virBufferEscapeString(buf, "<entry name='manufacturer'>%s</entry>\n", processor->processor_manufacturer); virBufferEscapeString(buf, "<entry name='signature'>%s</entry>\n", processor->processor_signature); virBufferEscapeString(buf, "<entry name='version'>%s</entry>\n", processor->processor_version); virBufferEscapeString(buf, "<entry name='external_clock'>%s</entry>\n", processor->processor_external_clock); virBufferEscapeString(buf, "<entry name='max_speed'>%s</entry>\n", processor->processor_max_speed); virBufferEscapeString(buf, "<entry name='status'>%s</entry>\n", processor->processor_status); virBufferEscapeString(buf, "<entry name='serial_number'>%s</entry>\n", processor->processor_serial_number); virBufferEscapeString(buf, "<entry name='part_number'>%s</entry>\n", processor->processor_part_number); virBufferAdjustIndent(buf, -4); virBufferAddLit(buf, " </processor>\n"); } }
static int qemuMigrationCookieXMLFormat(virQEMUDriverPtr driver, virBufferPtr buf, qemuMigrationCookiePtr mig) { char uuidstr[VIR_UUID_STRING_BUFLEN]; char hostuuidstr[VIR_UUID_STRING_BUFLEN]; size_t i; virUUIDFormat(mig->uuid, uuidstr); virUUIDFormat(mig->localHostuuid, hostuuidstr); virBufferAddLit(buf, "<qemu-migration>\n"); virBufferAdjustIndent(buf, 2); virBufferEscapeString(buf, "<name>%s</name>\n", mig->name); virBufferAsprintf(buf, "<uuid>%s</uuid>\n", uuidstr); virBufferEscapeString(buf, "<hostname>%s</hostname>\n", mig->localHostname); virBufferAsprintf(buf, "<hostuuid>%s</hostuuid>\n", hostuuidstr); for (i = 0; i < QEMU_MIGRATION_COOKIE_FLAG_LAST; i++) { if (mig->flagsMandatory & (1 << i)) virBufferAsprintf(buf, "<feature name='%s'/>\n", qemuMigrationCookieFlagTypeToString(i)); } if ((mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) && mig->graphics) qemuMigrationCookieGraphicsXMLFormat(buf, mig->graphics); if ((mig->flags & QEMU_MIGRATION_COOKIE_LOCKSTATE) && mig->lockState) { virBufferAsprintf(buf, "<lockstate driver='%s'>\n", mig->lockDriver); virBufferAdjustIndent(buf, 2); virBufferAsprintf(buf, "<leases>%s</leases>\n", mig->lockState); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</lockstate>\n"); } if ((mig->flags & QEMU_MIGRATION_COOKIE_PERSISTENT) && mig->persistent) { if (qemuDomainDefFormatBuf(driver, mig->persistent, VIR_DOMAIN_XML_INACTIVE | VIR_DOMAIN_XML_SECURE | VIR_DOMAIN_XML_MIGRATABLE, buf) < 0) return -1; } if ((mig->flags & QEMU_MIGRATION_COOKIE_NETWORK) && mig->network) qemuMigrationCookieNetworkXMLFormat(buf, mig->network); if ((mig->flags & QEMU_MIGRATION_COOKIE_NBD) && mig->nbd) { virBufferAddLit(buf, "<nbd"); if (mig->nbd->port) virBufferAsprintf(buf, " port='%d'", mig->nbd->port); if (mig->nbd->ndisks) { virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); for (i = 0; i < mig->nbd->ndisks; i++) { virBufferEscapeString(buf, "<disk target='%s'", mig->nbd->disks[i].target); virBufferAsprintf(buf, " capacity='%llu'/>\n", mig->nbd->disks[i].capacity); } virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</nbd>\n"); } else { virBufferAddLit(buf, "/>\n"); } } if (mig->flags & QEMU_MIGRATION_COOKIE_STATS && mig->jobInfo) qemuMigrationCookieStatisticsXMLFormat(buf, mig->jobInfo); if (mig->flags & QEMU_MIGRATION_COOKIE_CPU && mig->cpu) virCPUDefFormatBufFull(buf, mig->cpu, NULL); if (mig->flags & QEMU_MIGRATION_COOKIE_ALLOW_REBOOT) qemuDomainObjPrivateXMLFormatAllowReboot(buf, mig->allowReboot); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</qemu-migration>\n"); return 0; }
int virCPUDefFormatBuf(virBufferPtr buf, virCPUDefPtr def) { size_t i; bool formatModel; bool formatFallback; if (!def) return 0; formatModel = (def->mode == VIR_CPU_MODE_CUSTOM || def->mode == VIR_CPU_MODE_HOST_MODEL); formatFallback = (def->type == VIR_CPU_TYPE_GUEST && (def->mode == VIR_CPU_MODE_HOST_MODEL || (def->mode == VIR_CPU_MODE_CUSTOM && def->model))); if (!def->model && def->mode == VIR_CPU_MODE_CUSTOM && def->nfeatures) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Non-empty feature list specified without CPU model")); return -1; } if ((formatModel && def->model) || formatFallback) { virBufferAddLit(buf, "<model"); if (formatFallback) { const char *fallback; fallback = virCPUFallbackTypeToString(def->fallback); if (!fallback) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected CPU fallback value: %d"), def->fallback); return -1; } virBufferAsprintf(buf, " fallback='%s'", fallback); if (def->vendor_id) virBufferEscapeString(buf, " vendor_id='%s'", def->vendor_id); } if (formatModel && def->model) { virBufferEscapeString(buf, ">%s</model>\n", def->model); } else { virBufferAddLit(buf, "/>\n"); } } if (formatModel && def->vendor) virBufferEscapeString(buf, "<vendor>%s</vendor>\n", def->vendor); if (def->type == VIR_CPU_TYPE_HOST && def->microcodeVersion) virBufferAsprintf(buf, "<microcode version='%u'/>\n", def->microcodeVersion); if (def->sockets && def->cores && def->threads) { virBufferAddLit(buf, "<topology"); virBufferAsprintf(buf, " sockets='%u'", def->sockets); virBufferAsprintf(buf, " cores='%u'", def->cores); virBufferAsprintf(buf, " threads='%u'", def->threads); virBufferAddLit(buf, "/>\n"); } if (def->cache) { virBufferAddLit(buf, "<cache "); if (def->cache->level != -1) virBufferAsprintf(buf, "level='%d' ", def->cache->level); virBufferAsprintf(buf, "mode='%s'", virCPUCacheModeTypeToString(def->cache->mode)); virBufferAddLit(buf, "/>\n"); } for (i = 0; i < def->nfeatures; i++) { virCPUFeatureDefPtr feature = def->features + i; if (!feature->name) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing CPU feature name")); return -1; } if (def->type == VIR_CPU_TYPE_GUEST) { const char *policy; policy = virCPUFeaturePolicyTypeToString(feature->policy); if (!policy) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected CPU feature policy %d"), feature->policy); return -1; } virBufferAsprintf(buf, "<feature policy='%s' name='%s'/>\n", policy, feature->name); } else { virBufferAsprintf(buf, "<feature name='%s'/>\n", feature->name); } } return 0; }
static virCapsDomainDataPtr virCapabilitiesDomainDataLookupInternal(virCapsPtr caps, int ostype, virArch arch, int domaintype, const char *emulator, const char *machinetype) { virCapsGuestPtr foundguest = NULL; virCapsGuestDomainPtr founddomain = NULL; virCapsGuestMachinePtr foundmachine = NULL; virCapsDomainDataPtr ret = NULL; size_t i, j, k; for (i = 0; i < caps->nguests; i++) { virCapsGuestPtr guest = caps->guests[i]; for (j = 0; j < guest->arch.ndomains; j++) { virCapsGuestDomainPtr domain = guest->arch.domains[j]; virCapsGuestMachinePtr *machinelist; int nmachines; if (domain->info.nmachines) { nmachines = domain->info.nmachines; machinelist = domain->info.machines; } else { nmachines = guest->arch.defaultInfo.nmachines; machinelist = guest->arch.defaultInfo.machines; } for (k = 0; k < nmachines; k++) { virCapsGuestMachinePtr machine = machinelist[k]; if (!virCapsDomainDataCompare(guest, domain, machine, ostype, arch, domaintype, emulator, machinetype)) continue; foundmachine = machine; break; } if (!foundmachine) { if (!virCapsDomainDataCompare(guest, domain, NULL, ostype, arch, domaintype, emulator, machinetype)) continue; } founddomain = domain; break; } if (!founddomain) { if (!virCapsDomainDataCompare(guest, NULL, NULL, ostype, arch, domaintype, emulator, machinetype)) continue; } foundguest = guest; break; } /* XXX check default_emulator, see how it uses this */ if (!foundguest) { virBuffer buf = VIR_BUFFER_INITIALIZER; if (ostype) virBufferAsprintf(&buf, "ostype=%s ", virDomainOSTypeToString(ostype)); if (arch) virBufferAsprintf(&buf, "arch=%s ", virArchToString(arch)); if (domaintype != -1) virBufferAsprintf(&buf, "domaintype=%s ", virDomainVirtTypeToString(domaintype)); if (emulator) virBufferEscapeString(&buf, "emulator=%s ", emulator); if (machinetype) virBufferEscapeString(&buf, "machine=%s ", machinetype); if (virBufferCurrentContent(&buf) && !virBufferCurrentContent(&buf)[0]) virBufferAsprintf(&buf, "%s", _("any configuration")); if (virBufferCheckError(&buf) < 0) { virBufferFreeAndReset(&buf); goto error; } virReportError(VIR_ERR_INVALID_ARG, _("could not find capabilities for %s"), virBufferCurrentContent(&buf)); virBufferFreeAndReset(&buf); goto error; } if (VIR_ALLOC(ret) < 0) goto error; ret->ostype = foundguest->ostype; ret->arch = foundguest->arch.id; if (founddomain) { ret->domaintype = founddomain->type; ret->emulator = founddomain->info.emulator; } if (!ret->emulator) ret->emulator = foundguest->arch.defaultInfo.emulator; if (foundmachine) ret->machinetype = foundmachine->name; error: return ret; }
char *virDomainSnapshotDefFormat(const char *domain_uuid, virDomainSnapshotDefPtr def, unsigned int flags, int internal) { virBuffer buf = VIR_BUFFER_INITIALIZER; size_t i; virCheckFlags(VIR_DOMAIN_DEF_FORMAT_SECURE | VIR_DOMAIN_DEF_FORMAT_UPDATE_CPU, NULL); flags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE; virBufferAddLit(&buf, "<domainsnapshot>\n"); virBufferAdjustIndent(&buf, 2); virBufferEscapeString(&buf, "<name>%s</name>\n", def->name); if (def->description) virBufferEscapeString(&buf, "<description>%s</description>\n", def->description); virBufferAsprintf(&buf, "<state>%s</state>\n", virDomainSnapshotStateTypeToString(def->state)); if (def->parent) { virBufferAddLit(&buf, "<parent>\n"); virBufferAdjustIndent(&buf, 2); virBufferEscapeString(&buf, "<name>%s</name>\n", def->parent); virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "</parent>\n"); } virBufferAsprintf(&buf, "<creationTime>%lld</creationTime>\n", def->creationTime); if (def->memory) { virBufferAsprintf(&buf, "<memory snapshot='%s'", virDomainSnapshotLocationTypeToString(def->memory)); virBufferEscapeString(&buf, " file='%s'", def->file); virBufferAddLit(&buf, "/>\n"); } if (def->ndisks) { virBufferAddLit(&buf, "<disks>\n"); virBufferAdjustIndent(&buf, 2); for (i = 0; i < def->ndisks; i++) virDomainSnapshotDiskDefFormat(&buf, &def->disks[i]); virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "</disks>\n"); } if (def->dom) { if (virDomainDefFormatInternal(def->dom, flags, &buf) < 0) { virBufferFreeAndReset(&buf); return NULL; } } else if (domain_uuid) { virBufferAddLit(&buf, "<domain>\n"); virBufferAdjustIndent(&buf, 2); virBufferAsprintf(&buf, "<uuid>%s</uuid>\n", domain_uuid); virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "</domain>\n"); } if (internal) virBufferAsprintf(&buf, "<active>%d</active>\n", def->current); virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "</domainsnapshot>\n"); if (virBufferCheckError(&buf) < 0) return NULL; return virBufferContentAndReset(&buf); }
static int virInterfaceDefDevFormat(virBufferPtr buf, const virInterfaceDefPtr def, int level) { const char *type = NULL; if (def == NULL) { virInterfaceReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("virInterfaceDefFormat NULL def")); goto cleanup; } if ((def->name == NULL) && (def->type != VIR_INTERFACE_TYPE_VLAN)) { virInterfaceReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("virInterfaceDefFormat missing interface name")); goto cleanup; } if (!(type = virInterfaceTypeToString(def->type))) { virInterfaceReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected interface type %d"), def->type); goto cleanup; } virBufferAsprintf(buf, "%*s<interface type='%s' ", level*2, "", type); if (def->name != NULL) virBufferEscapeString(buf, "name='%s'", def->name); virBufferAddLit(buf, ">\n"); switch (def->type) { case VIR_INTERFACE_TYPE_ETHERNET: virInterfaceStartmodeDefFormat(buf, def->startmode, level); if (def->mac != NULL) virBufferAsprintf(buf, "%*s <mac address='%s'/>\n", level*2, "", def->mac); if (def->mtu != 0) virBufferAsprintf(buf, "%*s <mtu size='%d'/>\n", level*2, "", def->mtu); virInterfaceProtocolDefFormat(buf, def, level); break; case VIR_INTERFACE_TYPE_BRIDGE: virInterfaceStartmodeDefFormat(buf, def->startmode, level); if (def->mtu != 0) virBufferAsprintf(buf, "%*s <mtu size='%d'/>\n", level*2, "", def->mtu); virInterfaceProtocolDefFormat(buf, def, level); virInterfaceBridgeDefFormat(buf, def, level); break; case VIR_INTERFACE_TYPE_BOND: virInterfaceStartmodeDefFormat(buf, def->startmode, level); if (def->mtu != 0) virBufferAsprintf(buf, "%*s <mtu size='%d'/>\n", level*2, "", def->mtu); virInterfaceProtocolDefFormat(buf, def, level); virInterfaceBondDefFormat(buf, def, level); break; case VIR_INTERFACE_TYPE_VLAN: virInterfaceStartmodeDefFormat(buf, def->startmode, level); if (def->mac != NULL) virBufferAsprintf(buf, "%*s <mac address='%s'/>\n", level*2, "", def->mac); if (def->mtu != 0) virBufferAsprintf(buf, "%*s <mtu size='%d'/>\n", level*2, "", def->mtu); virInterfaceProtocolDefFormat(buf, def, level); virInterfaceVlanDefFormat(buf, def, level); break; } virBufferAsprintf(buf, "%*s</interface>\n", level*2, ""); if (virBufferError(buf)) goto no_memory; return 0; no_memory: virReportOOMError(); cleanup: return -1; }
char *virNodeDeviceDefFormat(const virNodeDeviceDefPtr def) { virBuffer buf = VIR_BUFFER_INITIALIZER; virNodeDevCapsDefPtr caps; unsigned int i = 0; virBufferAddLit(&buf, "<device>\n"); virBufferEscapeString(&buf, " <name>%s</name>\n", def->name); if (def->parent) { virBufferEscapeString(&buf, " <parent>%s</parent>\n", def->parent); } if (def->driver) { virBufferAddLit(&buf, " <driver>\n"); virBufferEscapeString(&buf, " <name>%s</name>\n", def->driver); virBufferAddLit(&buf, " </driver>\n"); } for (caps = def->caps; caps; caps = caps->next) { char uuidstr[VIR_UUID_STRING_BUFLEN]; union _virNodeDevCapData *data = &caps->data; virBufferVSprintf(&buf, " <capability type='%s'>\n", virNodeDevCapTypeToString(caps->type)); switch (caps->type) { case VIR_NODE_DEV_CAP_SYSTEM: if (data->system.product_name) virBufferEscapeString(&buf, " <product>%s</product>\n", data->system.product_name); virBufferAddLit(&buf, " <hardware>\n"); if (data->system.hardware.vendor_name) virBufferEscapeString(&buf, " <vendor>%s</vendor>\n", data->system.hardware.vendor_name); if (data->system.hardware.version) virBufferEscapeString(&buf, " <version>%s</version>\n", data->system.hardware.version); if (data->system.hardware.serial) virBufferEscapeString(&buf, " <serial>%s</serial>\n", data->system.hardware.serial); virUUIDFormat(data->system.hardware.uuid, uuidstr); virBufferVSprintf(&buf, " <uuid>%s</uuid>\n", uuidstr); virBufferAddLit(&buf, " </hardware>\n"); virBufferAddLit(&buf, " <firmware>\n"); if (data->system.firmware.vendor_name) virBufferEscapeString(&buf, " <vendor>%s</vendor>\n", data->system.firmware.vendor_name); if (data->system.firmware.version) virBufferEscapeString(&buf, " <version>%s</version>\n", data->system.firmware.version); if (data->system.firmware.release_date) virBufferEscapeString(&buf, " <release_date>%s</release_date>\n", data->system.firmware.release_date); virBufferAddLit(&buf, " </firmware>\n"); break; case VIR_NODE_DEV_CAP_PCI_DEV: virBufferVSprintf(&buf, " <domain>%d</domain>\n", data->pci_dev.domain); virBufferVSprintf(&buf, " <bus>%d</bus>\n", data->pci_dev.bus); virBufferVSprintf(&buf, " <slot>%d</slot>\n", data->pci_dev.slot); virBufferVSprintf(&buf, " <function>%d</function>\n", data->pci_dev.function); virBufferVSprintf(&buf, " <product id='0x%04x'", data->pci_dev.product); if (data->pci_dev.product_name) virBufferEscapeString(&buf, ">%s</product>\n", data->pci_dev.product_name); else virBufferAddLit(&buf, " />\n"); virBufferVSprintf(&buf, " <vendor id='0x%04x'", data->pci_dev.vendor); if (data->pci_dev.vendor_name) virBufferEscapeString(&buf, ">%s</vendor>\n", data->pci_dev.vendor_name); else virBufferAddLit(&buf, " />\n"); if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION) { virBufferAddLit(&buf, " <capability type='phys_function'>\n"); virBufferVSprintf(&buf, " <address domain='0x%.4x' bus='0x%.2x' " "slot='0x%.2x' function='0x%.1x'/>\n", data->pci_dev.physical_function->domain, data->pci_dev.physical_function->bus, data->pci_dev.physical_function->slot, data->pci_dev.physical_function->function); virBufferAddLit(&buf, " </capability>\n"); } if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION) { virBufferAddLit(&buf, " <capability type='virt_functions'>\n"); for (i = 0 ; i < data->pci_dev.num_virtual_functions ; i++) { virBufferVSprintf(&buf, " <address domain='0x%.4x' bus='0x%.2x' " "slot='0x%.2x' function='0x%.1x'/>\n", data->pci_dev.virtual_functions[i]->domain, data->pci_dev.virtual_functions[i]->bus, data->pci_dev.virtual_functions[i]->slot, data->pci_dev.virtual_functions[i]->function); } virBufferAddLit(&buf, " </capability>\n"); } break; case VIR_NODE_DEV_CAP_USB_DEV: virBufferVSprintf(&buf, " <bus>%d</bus>\n", data->usb_dev.bus); virBufferVSprintf(&buf, " <device>%d</device>\n", data->usb_dev.device); virBufferVSprintf(&buf, " <product id='0x%04x'", data->usb_dev.product); if (data->usb_dev.product_name) virBufferEscapeString(&buf, ">%s</product>\n", data->usb_dev.product_name); else virBufferAddLit(&buf, " />\n"); virBufferVSprintf(&buf, " <vendor id='0x%04x'", data->usb_dev.vendor); if (data->usb_dev.vendor_name) virBufferEscapeString(&buf, ">%s</vendor>\n", data->usb_dev.vendor_name); else virBufferAddLit(&buf, " />\n"); break; case VIR_NODE_DEV_CAP_USB_INTERFACE: virBufferVSprintf(&buf, " <number>%d</number>\n", data->usb_if.number); virBufferVSprintf(&buf, " <class>%d</class>\n", data->usb_if._class); virBufferVSprintf(&buf, " <subclass>%d</subclass>\n", data->usb_if.subclass); virBufferVSprintf(&buf, " <protocol>%d</protocol>\n", data->usb_if.protocol); if (data->usb_if.description) virBufferEscapeString(&buf, " <description>%s</description>\n", data->usb_if.description); break; case VIR_NODE_DEV_CAP_NET: virBufferEscapeString(&buf, " <interface>%s</interface>\n", data->net.ifname); if (data->net.address) virBufferEscapeString(&buf, " <address>%s</address>\n", data->net.address); if (data->net.subtype != VIR_NODE_DEV_CAP_NET_LAST) { const char *subtyp = virNodeDevNetCapTypeToString(data->net.subtype); virBufferEscapeString(&buf, " <capability type='%s'/>\n", subtyp); } break; case VIR_NODE_DEV_CAP_SCSI_HOST: virBufferVSprintf(&buf, " <host>%d</host>\n", data->scsi_host.host); if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) { virBufferAddLit(&buf, " <capability type='fc_host'>\n"); virBufferEscapeString(&buf, " <wwnn>%s</wwnn>\n", data->scsi_host.wwnn); virBufferEscapeString(&buf, " <wwpn>%s</wwpn>\n", data->scsi_host.wwpn); virBufferAddLit(&buf, " </capability>\n"); } if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS) { virBufferAddLit(&buf, " <capability type='vport_ops' />\n"); } break; case VIR_NODE_DEV_CAP_SCSI_TARGET: virBufferEscapeString(&buf, " <target>%s</target>\n", data->scsi_target.name); break; case VIR_NODE_DEV_CAP_SCSI: virBufferVSprintf(&buf, " <host>%d</host>\n", data->scsi.host); virBufferVSprintf(&buf, " <bus>%d</bus>\n", data->scsi.bus); virBufferVSprintf(&buf, " <target>%d</target>\n", data->scsi.target); virBufferVSprintf(&buf, " <lun>%d</lun>\n", data->scsi.lun); if (data->scsi.type) virBufferEscapeString(&buf, " <type>%s</type>\n", data->scsi.type); break; case VIR_NODE_DEV_CAP_STORAGE: virBufferEscapeString(&buf, " <block>%s</block>\n", data->storage.block); if (data->storage.bus) virBufferEscapeString(&buf, " <bus>%s</bus>\n", data->storage.bus); if (data->storage.drive_type) virBufferEscapeString(&buf, " <drive_type>%s</drive_type>\n", data->storage.drive_type); if (data->storage.model) virBufferEscapeString(&buf, " <model>%s</model>\n", data->storage.model); if (data->storage.vendor) virBufferEscapeString(&buf, " <vendor>%s</vendor>\n", data->storage.vendor); if (data->storage.serial) virBufferVSprintf(&buf, " <serial>%s</serial>\n", data->storage.serial); if (data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_REMOVABLE) { int avl = data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE; virBufferAddLit(&buf, " <capability type='removable'>\n"); virBufferVSprintf(&buf, " <media_available>%d" "</media_available>\n", avl ? 1 : 0); virBufferVSprintf(&buf, " <media_size>%llu</media_size>\n", data->storage.removable_media_size); if (data->storage.media_label) virBufferEscapeString(&buf, " <media_label>%s</media_label>\n", data->storage.media_label); if (data->storage.logical_block_size > 0) virBufferVSprintf(&buf, " <logical_block_size>%llu" "</logical_block_size>\n", data->storage.logical_block_size); if (data->storage.num_blocks > 0) virBufferVSprintf(&buf, " <num_blocks>%llu</num_blocks>\n", data->storage.num_blocks); virBufferAddLit(&buf, " </capability>\n"); } else { virBufferVSprintf(&buf, " <size>%llu</size>\n", data->storage.size); if (data->storage.logical_block_size > 0) virBufferVSprintf(&buf, " <logical_block_size>%llu" "</logical_block_size>\n", data->storage.logical_block_size); if (data->storage.num_blocks > 0) virBufferVSprintf(&buf, " <num_blocks>%llu</num_blocks>\n", data->storage.num_blocks); } if (data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_HOTPLUGGABLE) virBufferAddLit(&buf, " <capability type='hotpluggable' />\n"); break; case VIR_NODE_DEV_CAP_LAST: /* ignore special LAST value */ break; } virBufferAddLit(&buf, " </capability>\n"); } virBufferAddLit(&buf, "</device>\n"); if (virBufferError(&buf)) goto no_memory; return virBufferContentAndReset(&buf); no_memory: virReportOOMError(); virBufferFreeAndReset(&buf); return NULL; }
char *virDomainSnapshotDefFormat(const char *domain_uuid, virDomainSnapshotDefPtr def, unsigned int flags, int internal) { virBuffer buf = VIR_BUFFER_INITIALIZER; int i; virCheckFlags(VIR_DOMAIN_XML_SECURE | VIR_DOMAIN_XML_UPDATE_CPU, NULL); flags |= VIR_DOMAIN_XML_INACTIVE; virBufferAddLit(&buf, "<domainsnapshot>\n"); virBufferEscapeString(&buf, " <name>%s</name>\n", def->name); if (def->description) virBufferEscapeString(&buf, " <description>%s</description>\n", def->description); virBufferAsprintf(&buf, " <state>%s</state>\n", virDomainSnapshotStateTypeToString(def->state)); if (def->parent) { virBufferAddLit(&buf, " <parent>\n"); virBufferEscapeString(&buf, " <name>%s</name>\n", def->parent); virBufferAddLit(&buf, " </parent>\n"); } virBufferAsprintf(&buf, " <creationTime>%lld</creationTime>\n", def->creationTime); if (def->memory) { virBufferAsprintf(&buf, " <memory snapshot='%s'", virDomainSnapshotLocationTypeToString(def->memory)); virBufferEscapeString(&buf, " file='%s'", def->file); virBufferAddLit(&buf, "/>\n"); } if (def->ndisks) { virBufferAddLit(&buf, " <disks>\n"); for (i = 0; i < def->ndisks; i++) { virDomainSnapshotDiskDefPtr disk = &def->disks[i]; if (!disk->name) continue; virBufferEscapeString(&buf, " <disk name='%s'", disk->name); if (disk->snapshot) virBufferAsprintf(&buf, " snapshot='%s'", virDomainSnapshotLocationTypeToString(disk->snapshot)); if (disk->file || disk->format > 0) { virBufferAddLit(&buf, ">\n"); if (disk->format > 0) virBufferEscapeString(&buf, " <driver type='%s'/>\n", virStorageFileFormatTypeToString( disk->format)); if (disk->file) virBufferEscapeString(&buf, " <source file='%s'/>\n", disk->file); virBufferAddLit(&buf, " </disk>\n"); } else { virBufferAddLit(&buf, "/>\n"); } } virBufferAddLit(&buf, " </disks>\n"); } if (def->dom) { virBufferAdjustIndent(&buf, 2); if (virDomainDefFormatInternal(def->dom, flags, &buf) < 0) { virBufferFreeAndReset(&buf); return NULL; } virBufferAdjustIndent(&buf, -2); } else if (domain_uuid) { virBufferAddLit(&buf, " <domain>\n"); virBufferAsprintf(&buf, " <uuid>%s</uuid>\n", domain_uuid); virBufferAddLit(&buf, " </domain>\n"); } if (internal) virBufferAsprintf(&buf, " <active>%d</active>\n", def->current); virBufferAddLit(&buf, "</domainsnapshot>\n"); if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); return NULL; } return virBufferContentAndReset(&buf); }