/** * virSysinfoFormat: * @buf: buffer to append output to (may use auto-indentation) * @def: structure to convert to xml string * * Returns 0 on success, -1 on failure after generating an error message. */ int virSysinfoFormat(virBufferPtr buf, virSysinfoDefPtr def) { virBuffer childrenBuf = VIR_BUFFER_INITIALIZER; const char *type = virSysinfoTypeToString(def->type); int indent = virBufferGetIndent(buf, false); int ret = -1; if (!type) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected sysinfo type model %d"), def->type); virBufferFreeAndReset(buf); goto cleanup; } virBufferAdjustIndent(&childrenBuf, indent + 2); virSysinfoBIOSFormat(&childrenBuf, def->bios); virSysinfoSystemFormat(&childrenBuf, def->system); virSysinfoBaseBoardFormat(&childrenBuf, def->baseBoard, def->nbaseBoard); virSysinfoProcessorFormat(&childrenBuf, def); virSysinfoMemoryFormat(&childrenBuf, def); virBufferAsprintf(buf, "<sysinfo type='%s'", type); if (virBufferUse(&childrenBuf)) { virBufferAddLit(buf, ">\n"); virBufferAddBuffer(buf, &childrenBuf); virBufferAddLit(buf, "</sysinfo>\n"); } else { virBufferAddLit(buf, "/>\n"); } if (virBufferCheckError(buf) < 0) goto cleanup; ret = 0; cleanup: virBufferFreeAndReset(&childrenBuf); return ret; }
int virCPUDefFormatBufFull(virBufferPtr buf, virCPUDefPtr def, virDomainNumaPtr numa) { int ret = -1; virBuffer attributeBuf = VIR_BUFFER_INITIALIZER; virBuffer childrenBuf = VIR_BUFFER_INITIALIZER; if (!def) return 0; /* Format attributes for guest CPUs unless they only specify * topology or cache. */ if (def->type == VIR_CPU_TYPE_GUEST && (def->mode != VIR_CPU_MODE_CUSTOM || def->model)) { const char *tmp; if (!(tmp = virCPUModeTypeToString(def->mode))) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected CPU mode %d"), def->mode); goto cleanup; } virBufferAsprintf(&attributeBuf, " mode='%s'", tmp); if (def->mode == VIR_CPU_MODE_CUSTOM) { if (!(tmp = virCPUMatchTypeToString(def->match))) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected CPU match policy %d"), def->match); goto cleanup; } virBufferAsprintf(&attributeBuf, " match='%s'", tmp); } if (def->check) { virBufferAsprintf(&attributeBuf, " check='%s'", virCPUCheckTypeToString(def->check)); } } /* Format children */ virBufferSetChildIndent(&childrenBuf, buf); if (def->type == VIR_CPU_TYPE_HOST && def->arch) virBufferAsprintf(&childrenBuf, "<arch>%s</arch>\n", virArchToString(def->arch)); if (virCPUDefFormatBuf(&childrenBuf, def) < 0) goto cleanup; if (virDomainNumaDefCPUFormatXML(&childrenBuf, numa) < 0) goto cleanup; if (virBufferCheckError(&attributeBuf) < 0 || virBufferCheckError(&childrenBuf) < 0) goto cleanup; /* Put it all together */ if (virBufferUse(&attributeBuf) || virBufferUse(&childrenBuf)) { virBufferAddLit(buf, "<cpu"); if (virBufferUse(&attributeBuf)) virBufferAddBuffer(buf, &attributeBuf); if (virBufferUse(&childrenBuf)) { virBufferAddLit(buf, ">\n"); virBufferAddBuffer(buf, &childrenBuf); virBufferAddLit(buf, "</cpu>\n"); } else { virBufferAddLit(buf, "/>\n"); } } ret = 0; cleanup: virBufferFreeAndReset(&attributeBuf); virBufferFreeAndReset(&childrenBuf); return ret; }