snapshot: refactor domain xml output

Minor semantic change - allow domain xml to be generated in place
within a larger buffer, rather than having to go through a
temporary string.

* src/conf/domain_conf.c (virDomainDefFormatInternal): Add
parameter.
(virDomainDefFormat, virDomainObjFormat): Update callers.
This commit is contained in:
Eric Blake 2011-08-12 18:58:21 -06:00
parent e2fb96d92b
commit 0ce68c66c7

View File

@ -10317,12 +10317,15 @@ verify(((VIR_DOMAIN_XML_INTERNAL_STATUS |
& DUMPXML_FLAGS) == 0); & DUMPXML_FLAGS) == 0);
/* This internal version can accept VIR_DOMAIN_XML_INTERNAL_*, /* This internal version can accept VIR_DOMAIN_XML_INTERNAL_*,
* whereas the public version cannot. */ * whereas the public version cannot. Also, it appends to an existing
static char * * buffer, rather than flattening to string. Return -1 on failure. */
static int
virDomainDefFormatInternal(virDomainDefPtr def, virDomainDefFormatInternal(virDomainDefPtr def,
unsigned int flags) unsigned int flags,
virBufferPtr buf)
{ {
virBuffer buf = VIR_BUFFER_INITIALIZER; /* XXX Also need to take an indentation parameter - either int or
* string prefix, so that snapshot xml gets uniform indentation. */
unsigned char *uuid; unsigned char *uuid;
char uuidstr[VIR_UUID_STRING_BUFLEN]; char uuidstr[VIR_UUID_STRING_BUFLEN];
const char *type = NULL; const char *type = NULL;
@ -10331,7 +10334,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
virCheckFlags(DUMPXML_FLAGS | virCheckFlags(DUMPXML_FLAGS |
VIR_DOMAIN_XML_INTERNAL_STATUS | VIR_DOMAIN_XML_INTERNAL_STATUS |
VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET, VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET,
NULL); -1);
if (!(type = virDomainVirtTypeToString(def->virtType))) { if (!(type = virDomainVirtTypeToString(def->virtType))) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR, virDomainReportError(VIR_ERR_INTERNAL_ERROR,
@ -10342,99 +10345,99 @@ virDomainDefFormatInternal(virDomainDefPtr def,
if (def->id == -1) if (def->id == -1)
flags |= VIR_DOMAIN_XML_INACTIVE; flags |= VIR_DOMAIN_XML_INACTIVE;
virBufferAsprintf(&buf, "<domain type='%s'", type); virBufferAsprintf(buf, "<domain type='%s'", type);
if (!(flags & VIR_DOMAIN_XML_INACTIVE)) if (!(flags & VIR_DOMAIN_XML_INACTIVE))
virBufferAsprintf(&buf, " id='%d'", def->id); virBufferAsprintf(buf, " id='%d'", def->id);
if (def->namespaceData && def->ns.href) if (def->namespaceData && def->ns.href)
virBufferAsprintf(&buf, " %s", (def->ns.href)()); virBufferAsprintf(buf, " %s", (def->ns.href)());
virBufferAddLit(&buf, ">\n"); virBufferAddLit(buf, ">\n");
virBufferEscapeString(&buf, " <name>%s</name>\n", def->name); virBufferEscapeString(buf, " <name>%s</name>\n", def->name);
uuid = def->uuid; uuid = def->uuid;
virUUIDFormat(uuid, uuidstr); virUUIDFormat(uuid, uuidstr);
virBufferAsprintf(&buf, " <uuid>%s</uuid>\n", uuidstr); virBufferAsprintf(buf, " <uuid>%s</uuid>\n", uuidstr);
if (def->description) if (def->description)
virBufferEscapeString(&buf, " <description>%s</description>\n", virBufferEscapeString(buf, " <description>%s</description>\n",
def->description); def->description);
virBufferAsprintf(&buf, " <memory>%lu</memory>\n", def->mem.max_balloon); virBufferAsprintf(buf, " <memory>%lu</memory>\n", def->mem.max_balloon);
virBufferAsprintf(&buf, " <currentMemory>%lu</currentMemory>\n", virBufferAsprintf(buf, " <currentMemory>%lu</currentMemory>\n",
def->mem.cur_balloon); def->mem.cur_balloon);
/* add blkiotune only if there are any */ /* add blkiotune only if there are any */
if (def->blkio.weight) { if (def->blkio.weight) {
virBufferAsprintf(&buf, " <blkiotune>\n"); virBufferAsprintf(buf, " <blkiotune>\n");
virBufferAsprintf(&buf, " <weight>%u</weight>\n", virBufferAsprintf(buf, " <weight>%u</weight>\n",
def->blkio.weight); def->blkio.weight);
virBufferAsprintf(&buf, " </blkiotune>\n"); virBufferAsprintf(buf, " </blkiotune>\n");
} }
/* add memtune only if there are any */ /* add memtune only if there are any */
if (def->mem.hard_limit || def->mem.soft_limit || def->mem.min_guarantee || if (def->mem.hard_limit || def->mem.soft_limit || def->mem.min_guarantee ||
def->mem.swap_hard_limit) def->mem.swap_hard_limit)
virBufferAsprintf(&buf, " <memtune>\n"); virBufferAsprintf(buf, " <memtune>\n");
if (def->mem.hard_limit) { if (def->mem.hard_limit) {
virBufferAsprintf(&buf, " <hard_limit>%lu</hard_limit>\n", virBufferAsprintf(buf, " <hard_limit>%lu</hard_limit>\n",
def->mem.hard_limit); def->mem.hard_limit);
} }
if (def->mem.soft_limit) { if (def->mem.soft_limit) {
virBufferAsprintf(&buf, " <soft_limit>%lu</soft_limit>\n", virBufferAsprintf(buf, " <soft_limit>%lu</soft_limit>\n",
def->mem.soft_limit); def->mem.soft_limit);
} }
if (def->mem.min_guarantee) { if (def->mem.min_guarantee) {
virBufferAsprintf(&buf, " <min_guarantee>%lu</min_guarantee>\n", virBufferAsprintf(buf, " <min_guarantee>%lu</min_guarantee>\n",
def->mem.min_guarantee); def->mem.min_guarantee);
} }
if (def->mem.swap_hard_limit) { if (def->mem.swap_hard_limit) {
virBufferAsprintf(&buf, " <swap_hard_limit>%lu</swap_hard_limit>\n", virBufferAsprintf(buf, " <swap_hard_limit>%lu</swap_hard_limit>\n",
def->mem.swap_hard_limit); def->mem.swap_hard_limit);
} }
if (def->mem.hard_limit || def->mem.soft_limit || def->mem.min_guarantee || if (def->mem.hard_limit || def->mem.soft_limit || def->mem.min_guarantee ||
def->mem.swap_hard_limit) def->mem.swap_hard_limit)
virBufferAsprintf(&buf, " </memtune>\n"); virBufferAsprintf(buf, " </memtune>\n");
if (def->mem.hugepage_backed) { if (def->mem.hugepage_backed) {
virBufferAddLit(&buf, " <memoryBacking>\n"); virBufferAddLit(buf, " <memoryBacking>\n");
virBufferAddLit(&buf, " <hugepages/>\n"); virBufferAddLit(buf, " <hugepages/>\n");
virBufferAddLit(&buf, " </memoryBacking>\n"); virBufferAddLit(buf, " </memoryBacking>\n");
} }
for (n = 0 ; n < def->cpumasklen ; n++) for (n = 0 ; n < def->cpumasklen ; n++)
if (def->cpumask[n] != 1) if (def->cpumask[n] != 1)
allones = 0; allones = 0;
virBufferAddLit(&buf, " <vcpu"); virBufferAddLit(buf, " <vcpu");
if (!allones) { if (!allones) {
char *cpumask = NULL; char *cpumask = NULL;
if ((cpumask = if ((cpumask =
virDomainCpuSetFormat(def->cpumask, def->cpumasklen)) == NULL) virDomainCpuSetFormat(def->cpumask, def->cpumasklen)) == NULL)
goto cleanup; goto cleanup;
virBufferAsprintf(&buf, " cpuset='%s'", cpumask); virBufferAsprintf(buf, " cpuset='%s'", cpumask);
VIR_FREE(cpumask); VIR_FREE(cpumask);
} }
if (def->vcpus != def->maxvcpus) if (def->vcpus != def->maxvcpus)
virBufferAsprintf(&buf, " current='%u'", def->vcpus); virBufferAsprintf(buf, " current='%u'", def->vcpus);
virBufferAsprintf(&buf, ">%u</vcpu>\n", def->maxvcpus); virBufferAsprintf(buf, ">%u</vcpu>\n", def->maxvcpus);
if (def->cputune.shares || def->cputune.vcpupin || if (def->cputune.shares || def->cputune.vcpupin ||
def->cputune.period || def->cputune.quota) def->cputune.period || def->cputune.quota)
virBufferAddLit(&buf, " <cputune>\n"); virBufferAddLit(buf, " <cputune>\n");
if (def->cputune.shares) if (def->cputune.shares)
virBufferAsprintf(&buf, " <shares>%lu</shares>\n", virBufferAsprintf(buf, " <shares>%lu</shares>\n",
def->cputune.shares); def->cputune.shares);
if (def->cputune.period) if (def->cputune.period)
virBufferAsprintf(&buf, " <period>%llu</period>\n", virBufferAsprintf(buf, " <period>%llu</period>\n",
def->cputune.period); def->cputune.period);
if (def->cputune.quota) if (def->cputune.quota)
virBufferAsprintf(&buf, " <quota>%lld</quota>\n", virBufferAsprintf(buf, " <quota>%lld</quota>\n",
def->cputune.quota); def->cputune.quota);
if (def->cputune.vcpupin) { if (def->cputune.vcpupin) {
int i; int i;
for (i = 0; i < def->cputune.nvcpupin; i++) { for (i = 0; i < def->cputune.nvcpupin; i++) {
virBufferAsprintf(&buf, " <vcpupin vcpu='%u' ", virBufferAsprintf(buf, " <vcpupin vcpu='%u' ",
def->cputune.vcpupin[i]->vcpuid); def->cputune.vcpupin[i]->vcpuid);
char *cpumask = NULL; char *cpumask = NULL;
@ -10447,17 +10450,17 @@ virDomainDefFormatInternal(virDomainDefPtr def,
goto cleanup; goto cleanup;
} }
virBufferAsprintf(&buf, "cpuset='%s'/>\n", cpumask); virBufferAsprintf(buf, "cpuset='%s'/>\n", cpumask);
VIR_FREE(cpumask); VIR_FREE(cpumask);
} }
} }
if (def->cputune.shares || def->cputune.vcpupin || if (def->cputune.shares || def->cputune.vcpupin ||
def->cputune.period || def->cputune.quota) def->cputune.period || def->cputune.quota)
virBufferAddLit(&buf, " </cputune>\n"); virBufferAddLit(buf, " </cputune>\n");
if (def->numatune.memory.nodemask) if (def->numatune.memory.nodemask)
virBufferAddLit(&buf, " <numatune>\n"); virBufferAddLit(buf, " <numatune>\n");
if (def->numatune.memory.nodemask) { if (def->numatune.memory.nodemask) {
char *nodemask = NULL; char *nodemask = NULL;
@ -10469,32 +10472,32 @@ virDomainDefFormatInternal(virDomainDefPtr def,
goto cleanup; goto cleanup;
} }
virBufferAsprintf(&buf, " <memory mode='%s' nodeset='%s'/>\n", virBufferAsprintf(buf, " <memory mode='%s' nodeset='%s'/>\n",
virDomainNumatuneMemModeTypeToString(def->numatune.memory.mode), virDomainNumatuneMemModeTypeToString(def->numatune.memory.mode),
nodemask); nodemask);
VIR_FREE(nodemask); VIR_FREE(nodemask);
} }
if (def->numatune.memory.nodemask) if (def->numatune.memory.nodemask)
virBufferAddLit(&buf, " </numatune>\n"); virBufferAddLit(buf, " </numatune>\n");
if (def->sysinfo) if (def->sysinfo)
virDomainSysinfoDefFormat(&buf, def->sysinfo); virDomainSysinfoDefFormat(buf, def->sysinfo);
if (def->os.bootloader) { if (def->os.bootloader) {
virBufferEscapeString(&buf, " <bootloader>%s</bootloader>\n", virBufferEscapeString(buf, " <bootloader>%s</bootloader>\n",
def->os.bootloader); def->os.bootloader);
if (def->os.bootloaderArgs) if (def->os.bootloaderArgs)
virBufferEscapeString(&buf, " <bootloader_args>%s</bootloader_args>\n", virBufferEscapeString(buf, " <bootloader_args>%s</bootloader_args>\n",
def->os.bootloaderArgs); def->os.bootloaderArgs);
} }
virBufferAddLit(&buf, " <os>\n"); virBufferAddLit(buf, " <os>\n");
virBufferAddLit(&buf, " <type"); virBufferAddLit(buf, " <type");
if (def->os.arch) if (def->os.arch)
virBufferAsprintf(&buf, " arch='%s'", def->os.arch); virBufferAsprintf(buf, " arch='%s'", def->os.arch);
if (def->os.machine) if (def->os.machine)
virBufferAsprintf(&buf, " machine='%s'", def->os.machine); virBufferAsprintf(buf, " machine='%s'", def->os.machine);
/* /*
* HACK: For xen driver we previously used bogus 'linux' as the * HACK: For xen driver we previously used bogus 'linux' as the
* os type for paravirt, whereas capabilities declare it to * os type for paravirt, whereas capabilities declare it to
@ -10502,27 +10505,27 @@ virDomainDefFormatInternal(virDomainDefPtr def,
*/ */
if (def->virtType == VIR_DOMAIN_VIRT_XEN && if (def->virtType == VIR_DOMAIN_VIRT_XEN &&
STREQ(def->os.type, "xen")) STREQ(def->os.type, "xen"))
virBufferAsprintf(&buf, ">%s</type>\n", "linux"); virBufferAsprintf(buf, ">%s</type>\n", "linux");
else else
virBufferAsprintf(&buf, ">%s</type>\n", def->os.type); virBufferAsprintf(buf, ">%s</type>\n", def->os.type);
if (def->os.init) if (def->os.init)
virBufferEscapeString(&buf, " <init>%s</init>\n", virBufferEscapeString(buf, " <init>%s</init>\n",
def->os.init); def->os.init);
if (def->os.loader) if (def->os.loader)
virBufferEscapeString(&buf, " <loader>%s</loader>\n", virBufferEscapeString(buf, " <loader>%s</loader>\n",
def->os.loader); def->os.loader);
if (def->os.kernel) if (def->os.kernel)
virBufferEscapeString(&buf, " <kernel>%s</kernel>\n", virBufferEscapeString(buf, " <kernel>%s</kernel>\n",
def->os.kernel); def->os.kernel);
if (def->os.initrd) if (def->os.initrd)
virBufferEscapeString(&buf, " <initrd>%s</initrd>\n", virBufferEscapeString(buf, " <initrd>%s</initrd>\n",
def->os.initrd); def->os.initrd);
if (def->os.cmdline) if (def->os.cmdline)
virBufferEscapeString(&buf, " <cmdline>%s</cmdline>\n", virBufferEscapeString(buf, " <cmdline>%s</cmdline>\n",
def->os.cmdline); def->os.cmdline);
if (def->os.root) if (def->os.root)
virBufferEscapeString(&buf, " <root>%s</root>\n", virBufferEscapeString(buf, " <root>%s</root>\n",
def->os.root); def->os.root);
if (!def->os.bootloader) { if (!def->os.bootloader) {
@ -10535,21 +10538,21 @@ virDomainDefFormatInternal(virDomainDefPtr def,
def->os.bootDevs[n]); def->os.bootDevs[n]);
goto cleanup; goto cleanup;
} }
virBufferAsprintf(&buf, " <boot dev='%s'/>\n", boottype); virBufferAsprintf(buf, " <boot dev='%s'/>\n", boottype);
} }
if (def->os.bootmenu != VIR_DOMAIN_BOOT_MENU_DEFAULT) { if (def->os.bootmenu != VIR_DOMAIN_BOOT_MENU_DEFAULT) {
const char *enabled = (def->os.bootmenu == const char *enabled = (def->os.bootmenu ==
VIR_DOMAIN_BOOT_MENU_ENABLED ? "yes" VIR_DOMAIN_BOOT_MENU_ENABLED ? "yes"
: "no"); : "no");
virBufferAsprintf(&buf, " <bootmenu enable='%s'/>\n", enabled); virBufferAsprintf(buf, " <bootmenu enable='%s'/>\n", enabled);
} }
if (def->os.bios.useserial) { if (def->os.bios.useserial) {
const char *useserial = (def->os.bios.useserial == const char *useserial = (def->os.bios.useserial ==
VIR_DOMAIN_BIOS_USESERIAL_YES ? "yes" VIR_DOMAIN_BIOS_USESERIAL_YES ? "yes"
: "no"); : "no");
virBufferAsprintf(&buf, " <bios useserial='%s'/>\n", useserial); virBufferAsprintf(buf, " <bios useserial='%s'/>\n", useserial);
} }
} }
@ -10562,14 +10565,14 @@ virDomainDefFormatInternal(virDomainDefPtr def,
_("unexpected smbios mode %d"), def->os.smbios_mode); _("unexpected smbios mode %d"), def->os.smbios_mode);
goto cleanup; goto cleanup;
} }
virBufferAsprintf(&buf, " <smbios mode='%s'/>\n", mode); virBufferAsprintf(buf, " <smbios mode='%s'/>\n", mode);
} }
virBufferAddLit(&buf, " </os>\n"); virBufferAddLit(buf, " </os>\n");
if (def->features) { if (def->features) {
int i; int i;
virBufferAddLit(&buf, " <features>\n"); virBufferAddLit(buf, " <features>\n");
for (i = 0 ; i < VIR_DOMAIN_FEATURE_LAST ; i++) { for (i = 0 ; i < VIR_DOMAIN_FEATURE_LAST ; i++) {
if (def->features & (1 << i)) { if (def->features & (1 << i)) {
const char *name = virDomainFeatureTypeToString(i); const char *name = virDomainFeatureTypeToString(i);
@ -10578,91 +10581,91 @@ virDomainDefFormatInternal(virDomainDefPtr def,
_("unexpected feature %d"), i); _("unexpected feature %d"), i);
goto cleanup; goto cleanup;
} }
virBufferAsprintf(&buf, " <%s/>\n", name); virBufferAsprintf(buf, " <%s/>\n", name);
} }
} }
virBufferAddLit(&buf, " </features>\n"); virBufferAddLit(buf, " </features>\n");
} }
if (virCPUDefFormatBuf(&buf, def->cpu, " ", 0) < 0) if (virCPUDefFormatBuf(buf, def->cpu, " ", 0) < 0)
goto cleanup; goto cleanup;
virBufferAsprintf(&buf, " <clock offset='%s'", virBufferAsprintf(buf, " <clock offset='%s'",
virDomainClockOffsetTypeToString(def->clock.offset)); virDomainClockOffsetTypeToString(def->clock.offset));
switch (def->clock.offset) { switch (def->clock.offset) {
case VIR_DOMAIN_CLOCK_OFFSET_VARIABLE: case VIR_DOMAIN_CLOCK_OFFSET_VARIABLE:
virBufferAsprintf(&buf, " adjustment='%lld'", def->clock.data.adjustment); virBufferAsprintf(buf, " adjustment='%lld'", def->clock.data.adjustment);
break; break;
case VIR_DOMAIN_CLOCK_OFFSET_TIMEZONE: case VIR_DOMAIN_CLOCK_OFFSET_TIMEZONE:
virBufferEscapeString(&buf, " timezone='%s'", def->clock.data.timezone); virBufferEscapeString(buf, " timezone='%s'", def->clock.data.timezone);
break; break;
} }
if (def->clock.ntimers == 0) { if (def->clock.ntimers == 0) {
virBufferAddLit(&buf, "/>\n"); virBufferAddLit(buf, "/>\n");
} else { } else {
virBufferAddLit(&buf, ">\n"); virBufferAddLit(buf, ">\n");
for (n = 0; n < def->clock.ntimers; n++) { for (n = 0; n < def->clock.ntimers; n++) {
if (virDomainTimerDefFormat(&buf, def->clock.timers[n]) < 0) if (virDomainTimerDefFormat(buf, def->clock.timers[n]) < 0)
goto cleanup; goto cleanup;
} }
virBufferAddLit(&buf, " </clock>\n"); virBufferAddLit(buf, " </clock>\n");
} }
if (virDomainLifecycleDefFormat(&buf, def->onPoweroff, if (virDomainLifecycleDefFormat(buf, def->onPoweroff,
"on_poweroff", "on_poweroff",
virDomainLifecycleTypeToString) < 0) virDomainLifecycleTypeToString) < 0)
goto cleanup; goto cleanup;
if (virDomainLifecycleDefFormat(&buf, def->onReboot, if (virDomainLifecycleDefFormat(buf, def->onReboot,
"on_reboot", "on_reboot",
virDomainLifecycleTypeToString) < 0) virDomainLifecycleTypeToString) < 0)
goto cleanup; goto cleanup;
if (virDomainLifecycleDefFormat(&buf, def->onCrash, if (virDomainLifecycleDefFormat(buf, def->onCrash,
"on_crash", "on_crash",
virDomainLifecycleCrashTypeToString) < 0) virDomainLifecycleCrashTypeToString) < 0)
goto cleanup; goto cleanup;
virBufferAddLit(&buf, " <devices>\n"); virBufferAddLit(buf, " <devices>\n");
if (def->emulator) if (def->emulator)
virBufferEscapeString(&buf, " <emulator>%s</emulator>\n", virBufferEscapeString(buf, " <emulator>%s</emulator>\n",
def->emulator); def->emulator);
for (n = 0 ; n < def->ndisks ; n++) for (n = 0 ; n < def->ndisks ; n++)
if (virDomainDiskDefFormat(&buf, def->disks[n], flags) < 0) if (virDomainDiskDefFormat(buf, def->disks[n], flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->ncontrollers ; n++) for (n = 0 ; n < def->ncontrollers ; n++)
if (virDomainControllerDefFormat(&buf, def->controllers[n], flags) < 0) if (virDomainControllerDefFormat(buf, def->controllers[n], flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->nleases ; n++) for (n = 0 ; n < def->nleases ; n++)
if (virDomainLeaseDefFormat(&buf, def->leases[n]) < 0) if (virDomainLeaseDefFormat(buf, def->leases[n]) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->nfss ; n++) for (n = 0 ; n < def->nfss ; n++)
if (virDomainFSDefFormat(&buf, def->fss[n], flags) < 0) if (virDomainFSDefFormat(buf, def->fss[n], flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->nnets ; n++) for (n = 0 ; n < def->nnets ; n++)
if (virDomainNetDefFormat(&buf, def->nets[n], flags) < 0) if (virDomainNetDefFormat(buf, def->nets[n], flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->nsmartcards ; n++) for (n = 0 ; n < def->nsmartcards ; n++)
if (virDomainSmartcardDefFormat(&buf, def->smartcards[n], flags) < 0) if (virDomainSmartcardDefFormat(buf, def->smartcards[n], flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->nserials ; n++) for (n = 0 ; n < def->nserials ; n++)
if (virDomainChrDefFormat(&buf, def->serials[n], flags) < 0) if (virDomainChrDefFormat(buf, def->serials[n], flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->nparallels ; n++) for (n = 0 ; n < def->nparallels ; n++)
if (virDomainChrDefFormat(&buf, def->parallels[n], flags) < 0) if (virDomainChrDefFormat(buf, def->parallels[n], flags) < 0)
goto cleanup; goto cleanup;
/* If there's a PV console that's preferred.. */ /* If there's a PV console that's preferred.. */
if (def->console) { if (def->console) {
if (virDomainChrDefFormat(&buf, def->console, flags) < 0) if (virDomainChrDefFormat(buf, def->console, flags) < 0)
goto cleanup; goto cleanup;
} else if (def->nserials != 0) { } else if (def->nserials != 0) {
/* ..else for legacy compat duplicate the first serial device as a /* ..else for legacy compat duplicate the first serial device as a
@ -10670,17 +10673,17 @@ virDomainDefFormatInternal(virDomainDefPtr def,
virDomainChrDef console; virDomainChrDef console;
memcpy(&console, def->serials[0], sizeof(console)); memcpy(&console, def->serials[0], sizeof(console));
console.deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE; console.deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE;
if (virDomainChrDefFormat(&buf, &console, flags) < 0) if (virDomainChrDefFormat(buf, &console, flags) < 0)
goto cleanup; goto cleanup;
} }
for (n = 0 ; n < def->nchannels ; n++) for (n = 0 ; n < def->nchannels ; n++)
if (virDomainChrDefFormat(&buf, def->channels[n], flags) < 0) if (virDomainChrDefFormat(buf, def->channels[n], flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->ninputs ; n++) for (n = 0 ; n < def->ninputs ; n++)
if (def->inputs[n]->bus == VIR_DOMAIN_INPUT_BUS_USB && if (def->inputs[n]->bus == VIR_DOMAIN_INPUT_BUS_USB &&
virDomainInputDefFormat(&buf, def->inputs[n], flags) < 0) virDomainInputDefFormat(buf, def->inputs[n], flags) < 0)
goto cleanup; goto cleanup;
if (def->ngraphics > 0) { if (def->ngraphics > 0) {
@ -10692,41 +10695,41 @@ virDomainDefFormatInternal(virDomainDefPtr def,
{ .alias = NULL }, { .alias = NULL },
}; };
if (virDomainInputDefFormat(&buf, &autoInput, flags) < 0) if (virDomainInputDefFormat(buf, &autoInput, flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->ngraphics ; n++) for (n = 0 ; n < def->ngraphics ; n++)
if (virDomainGraphicsDefFormat(&buf, def->graphics[n], flags) < 0) if (virDomainGraphicsDefFormat(buf, def->graphics[n], flags) < 0)
goto cleanup; goto cleanup;
} }
for (n = 0 ; n < def->nsounds ; n++) for (n = 0 ; n < def->nsounds ; n++)
if (virDomainSoundDefFormat(&buf, def->sounds[n], flags) < 0) if (virDomainSoundDefFormat(buf, def->sounds[n], flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->nvideos ; n++) for (n = 0 ; n < def->nvideos ; n++)
if (virDomainVideoDefFormat(&buf, def->videos[n], flags) < 0) if (virDomainVideoDefFormat(buf, def->videos[n], flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->nhostdevs ; n++) for (n = 0 ; n < def->nhostdevs ; n++)
if (virDomainHostdevDefFormat(&buf, def->hostdevs[n], flags) < 0) if (virDomainHostdevDefFormat(buf, def->hostdevs[n], flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->nredirdevs ; n++) for (n = 0 ; n < def->nredirdevs ; n++)
if (virDomainRedirdevDefFormat(&buf, def->redirdevs[n], flags) < 0) if (virDomainRedirdevDefFormat(buf, def->redirdevs[n], flags) < 0)
goto cleanup; goto cleanup;
for (n = 0 ; n < def->nhubs ; n++) for (n = 0 ; n < def->nhubs ; n++)
if (virDomainHubDefFormat(&buf, def->hubs[n], flags) < 0) if (virDomainHubDefFormat(buf, def->hubs[n], flags) < 0)
goto cleanup; goto cleanup;
if (def->watchdog) if (def->watchdog)
virDomainWatchdogDefFormat (&buf, def->watchdog, flags); virDomainWatchdogDefFormat (buf, def->watchdog, flags);
if (def->memballoon) if (def->memballoon)
virDomainMemballoonDefFormat (&buf, def->memballoon, flags); virDomainMemballoonDefFormat (buf, def->memballoon, flags);
virBufferAddLit(&buf, " </devices>\n"); virBufferAddLit(buf, " </devices>\n");
if (def->seclabel.model) { if (def->seclabel.model) {
const char *sectype = virDomainSeclabelTypeToString(def->seclabel.type); const char *sectype = virDomainSeclabelTypeToString(def->seclabel.type);
@ -10738,47 +10741,52 @@ virDomainDefFormatInternal(virDomainDefPtr def,
(flags & VIR_DOMAIN_XML_INACTIVE)) { (flags & VIR_DOMAIN_XML_INACTIVE)) {
/* This is the default for inactive xml, so nothing to output. */ /* This is the default for inactive xml, so nothing to output. */
} else { } else {
virBufferAsprintf(&buf, " <seclabel type='%s' model='%s' relabel='%s'>\n", virBufferAsprintf(buf, " <seclabel type='%s' model='%s' relabel='%s'>\n",
sectype, def->seclabel.model, sectype, def->seclabel.model,
def->seclabel.norelabel ? "no" : "yes"); def->seclabel.norelabel ? "no" : "yes");
if (def->seclabel.label) if (def->seclabel.label)
virBufferEscapeString(&buf, " <label>%s</label>\n", virBufferEscapeString(buf, " <label>%s</label>\n",
def->seclabel.label); def->seclabel.label);
if (!def->seclabel.norelabel && def->seclabel.imagelabel) if (!def->seclabel.norelabel && def->seclabel.imagelabel)
virBufferEscapeString(&buf, " <imagelabel>%s</imagelabel>\n", virBufferEscapeString(buf, " <imagelabel>%s</imagelabel>\n",
def->seclabel.imagelabel); def->seclabel.imagelabel);
if (def->seclabel.baselabel && if (def->seclabel.baselabel &&
(def->seclabel.type == VIR_DOMAIN_SECLABEL_DYNAMIC)) (def->seclabel.type == VIR_DOMAIN_SECLABEL_DYNAMIC))
virBufferEscapeString(&buf, " <baselabel>%s</baselabel>\n", virBufferEscapeString(buf, " <baselabel>%s</baselabel>\n",
def->seclabel.baselabel); def->seclabel.baselabel);
virBufferAddLit(&buf, " </seclabel>\n"); virBufferAddLit(buf, " </seclabel>\n");
} }
} }
if (def->namespaceData && def->ns.format) { if (def->namespaceData && def->ns.format) {
if ((def->ns.format)(&buf, def->namespaceData) < 0) if ((def->ns.format)(buf, def->namespaceData) < 0)
goto cleanup; goto cleanup;
} }
virBufferAddLit(&buf, "</domain>\n"); virBufferAddLit(buf, "</domain>\n");
if (virBufferError(&buf)) if (virBufferError(buf))
goto no_memory; goto no_memory;
return virBufferContentAndReset(&buf); return 0;
no_memory: no_memory:
virReportOOMError(); virReportOOMError();
cleanup: cleanup:
virBufferFreeAndReset(&buf); virBufferFreeAndReset(buf);
return NULL; return -1;
} }
char * char *
virDomainDefFormat(virDomainDefPtr def, unsigned int flags) virDomainDefFormat(virDomainDefPtr def, unsigned int flags)
{ {
virBuffer buf = VIR_BUFFER_INITIALIZER;
virCheckFlags(DUMPXML_FLAGS, NULL); virCheckFlags(DUMPXML_FLAGS, NULL);
return virDomainDefFormatInternal(def, flags); if (virDomainDefFormatInternal(def, flags, &buf) < 0)
return NULL;
return virBufferContentAndReset(&buf);
} }
@ -10786,7 +10794,6 @@ static char *virDomainObjFormat(virCapsPtr caps,
virDomainObjPtr obj, virDomainObjPtr obj,
unsigned int flags) unsigned int flags)
{ {
char *config_xml = NULL;
virBuffer buf = VIR_BUFFER_INITIALIZER; virBuffer buf = VIR_BUFFER_INITIALIZER;
int state; int state;
int reason; int reason;
@ -10808,11 +10815,9 @@ static char *virDomainObjFormat(virCapsPtr caps,
((caps->privateDataXMLFormat)(&buf, obj->privateData)) < 0) ((caps->privateDataXMLFormat)(&buf, obj->privateData)) < 0)
goto error; goto error;
if (!(config_xml = virDomainDefFormatInternal(obj->def, flags))) if (virDomainDefFormatInternal(obj->def, flags, &buf) < 0)
goto error; goto error;
virBufferAdd(&buf, config_xml, strlen(config_xml));
VIR_FREE(config_xml);
virBufferAddLit(&buf, "</domstatus>\n"); virBufferAddLit(&buf, "</domstatus>\n");
if (virBufferError(&buf)) if (virBufferError(&buf))