Move all the system_* fields into a separate struct. Not only this simplifies the code a bit it also helps us to identify whether BIOS info is present. We don't have to check all the four variables for being not-NULL, but we can just check the pointer to the struct. Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> --- src/conf/domain_conf.c | 152 ++++++++++++++++++---------- src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 41 ++++---- src/util/virsysinfo.c | 258 ++++++++++++++++++++++++++++++++--------------- src/util/virsysinfo.h | 22 ++-- 5 files changed, 312 insertions(+), 162 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index e37e453..209416d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -10922,66 +10922,42 @@ virSysinfoBIOSParseXML(xmlNodePtr node, return ret; } -static virSysinfoDefPtr -virSysinfoParseXML(xmlNodePtr node, - xmlXPathContextPtr ctxt, - unsigned char *domUUID, - bool uuid_generated) +static int +virSysinfoSystemParseXML(xmlNodePtr node, + xmlXPathContextPtr ctxt, + virSysinfoSystemDefPtr *system, + unsigned char *domUUID, + bool uuid_generated) { - virSysinfoDefPtr def; - xmlNodePtr oldnode, tmpnode; - char *type; + int ret = -1; + virSysinfoSystemDefPtr def; char *tmpUUID = NULL; - if (!xmlStrEqual(node->name, BAD_CAST "sysinfo")) { + if (!xmlStrEqual(node->name, BAD_CAST "system")) { virReportError(VIR_ERR_XML_ERROR, "%s", - _("XML does not contain expected 'sysinfo' element")); - return NULL; + _("XML does not contain expected 'system' element")); + return ret; } if (VIR_ALLOC(def) < 0) - return NULL; + goto cleanup; - type = virXMLPropString(node, "type"); - if (type == NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("sysinfo must contain a type attribute")); - goto error; - } - if ((def->type = virSysinfoTypeFromString(type)) < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown sysinfo type '%s'"), type); - goto error; - } - - /* Extract BIOS related metadata */ - if ((tmpnode = virXPathNode("./bios[1]", ctxt)) != NULL) { - oldnode = ctxt->node; - ctxt->node = tmpnode; - if (virSysinfoBIOSParseXML(tmpnode, ctxt, &def->bios) < 0) { - ctxt->node = oldnode; - goto error; - } - ctxt->node = oldnode; - } - - /* Extract system related metadata */ - def->system_manufacturer = - virXPathString("string(system/entry[@name='manufacturer'])", ctxt); - def->system_product = - virXPathString("string(system/entry[@name='product'])", ctxt); - def->system_version = - virXPathString("string(system/entry[@name='version'])", ctxt); - def->system_serial = - virXPathString("string(system/entry[@name='serial'])", ctxt); - tmpUUID = virXPathString("string(system/entry[@name='uuid'])", ctxt); + def->manufacturer = + virXPathString("string(entry[@name='manufacturer'])", ctxt); + def->product = + virXPathString("string(entry[@name='product'])", ctxt); + def->version = + virXPathString("string(entry[@name='version'])", ctxt); + def->serial = + virXPathString("string(entry[@name='serial'])", ctxt); + tmpUUID = virXPathString("string(entry[@name='uuid'])", ctxt); if (tmpUUID) { unsigned char uuidbuf[VIR_UUID_BUFLEN]; char uuidstr[VIR_UUID_STRING_BUFLEN]; if (virUUIDParse(tmpUUID, uuidbuf) < 0) { virReportError(VIR_ERR_XML_DETAIL, "%s", _("malformed <sysinfo> uuid element")); - goto error; + goto cleanup; } if (uuid_generated) { memcpy(domUUID, uuidbuf, VIR_UUID_BUFLEN); @@ -10989,7 +10965,7 @@ virSysinfoParseXML(xmlNodePtr node, virReportError(VIR_ERR_XML_DETAIL, "%s", _("UUID mismatch between <uuid> and " "<sysinfo>")); - goto error; + goto cleanup; } /* Although we've validated the UUID as good, virUUIDParse() is * lax with respect to allowing extraneous "-" and " ", but the @@ -10998,17 +10974,85 @@ virSysinfoParseXML(xmlNodePtr node, * properly so that it's used correctly later. */ virUUIDFormat(uuidbuf, uuidstr); - if (VIR_STRDUP(def->system_uuid, uuidstr) < 0) - goto error; + if (VIR_STRDUP(def->uuid, uuidstr) < 0) + goto cleanup; } - def->system_sku = - virXPathString("string(system/entry[@name='sku'])", ctxt); - def->system_family = - virXPathString("string(system/entry[@name='family'])", ctxt); + def->sku = + virXPathString("string(entry[@name='sku'])", ctxt); + def->family = + virXPathString("string(entry[@name='family'])", ctxt); + if (!def->manufacturer && !def->product && !def->version && + !def->serial && !def->uuid && !def->sku && !def->family) { + virSysinfoSystemDefFree(def); + def = NULL; + } + + *system = def; + def = NULL; + ret = 0; cleanup: - VIR_FREE(type); + virSysinfoSystemDefFree(def); VIR_FREE(tmpUUID); + return ret; +} + +static virSysinfoDefPtr +virSysinfoParseXML(xmlNodePtr node, + xmlXPathContextPtr ctxt, + unsigned char *domUUID, + bool uuid_generated) +{ + virSysinfoDefPtr def; + xmlNodePtr oldnode, tmpnode; + char *type; + + if (!xmlStrEqual(node->name, BAD_CAST "sysinfo")) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("XML does not contain expected 'sysinfo' element")); + return NULL; + } + + if (VIR_ALLOC(def) < 0) + return NULL; + + type = virXMLPropString(node, "type"); + if (type == NULL) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("sysinfo must contain a type attribute")); + goto error; + } + if ((def->type = virSysinfoTypeFromString(type)) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown sysinfo type '%s'"), type); + goto error; + } + + /* Extract BIOS related metadata */ + if ((tmpnode = virXPathNode("./bios[1]", ctxt)) != NULL) { + oldnode = ctxt->node; + ctxt->node = tmpnode; + if (virSysinfoBIOSParseXML(tmpnode, ctxt, &def->bios) < 0) { + ctxt->node = oldnode; + goto error; + } + ctxt->node = oldnode; + } + + /* Extract system related metadata */ + if ((tmpnode = virXPathNode("./system[1]", ctxt)) != NULL) { + oldnode = ctxt->node; + ctxt->node = tmpnode; + if (virSysinfoSystemParseXML(tmpnode, ctxt, &def->system, + domUUID, uuid_generated) < 0) { + ctxt->node = oldnode; + goto error; + } + ctxt->node = oldnode; + } + + cleanup: + VIR_FREE(type); return def; error: diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 06ef7ae..bd619d3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2181,6 +2181,7 @@ virSysinfoDefFree; virSysinfoFormat; virSysinfoRead; virSysinfoSetup; +virSysinfoSystemDefFree; # util/virsystemd.h diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 7d58cb5..489cab3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6692,40 +6692,41 @@ static char *qemuBuildSmbiosBiosStr(virSysinfoBIOSDefPtr def) return NULL; } -static char *qemuBuildSmbiosSystemStr(virSysinfoDefPtr def, bool skip_uuid) +static char *qemuBuildSmbiosSystemStr(virSysinfoSystemDefPtr def, + bool skip_uuid) { virBuffer buf = VIR_BUFFER_INITIALIZER; - if ((def->system_manufacturer == NULL) && (def->system_sku == NULL) && - (def->system_product == NULL) && (def->system_version == NULL) && - (def->system_serial == NULL) && (def->system_family == NULL) && - (def->system_uuid == NULL || skip_uuid)) + if (!def || + (!def->manufacturer && !def->product && !def->version && + !def->serial && (!def->uuid || skip_uuid) && + def->sku && !def->family)) return NULL; virBufferAddLit(&buf, "type=1"); /* 1:Manufacturer */ - if (def->system_manufacturer) + if (def->manufacturer) virBufferAsprintf(&buf, ",manufacturer=%s", - def->system_manufacturer); + def->manufacturer); /* 1:Product Name */ - if (def->system_product) - virBufferAsprintf(&buf, ",product=%s", def->system_product); + if (def->product) + virBufferAsprintf(&buf, ",product=%s", def->product); /* 1:Version */ - if (def->system_version) - virBufferAsprintf(&buf, ",version=%s", def->system_version); + if (def->version) + virBufferAsprintf(&buf, ",version=%s", def->version); /* 1:Serial Number */ - if (def->system_serial) - virBufferAsprintf(&buf, ",serial=%s", def->system_serial); + if (def->serial) + virBufferAsprintf(&buf, ",serial=%s", def->serial); /* 1:UUID */ - if (def->system_uuid && !skip_uuid) - virBufferAsprintf(&buf, ",uuid=%s", def->system_uuid); + if (def->uuid && !skip_uuid) + virBufferAsprintf(&buf, ",uuid=%s", def->uuid); /* 1:SKU Number */ - if (def->system_sku) - virBufferAsprintf(&buf, ",sku=%s", def->system_sku); + if (def->sku) + virBufferAsprintf(&buf, ",sku=%s", def->sku); /* 1:Family */ - if (def->system_family) - virBufferAsprintf(&buf, ",family=%s", def->system_family); + if (def->family) + virBufferAsprintf(&buf, ",family=%s", def->family); if (virBufferCheckError(&buf) < 0) goto error; @@ -8919,7 +8920,7 @@ qemuBuildCommandLine(virConnectPtr conn, virCommandAddArgList(cmd, "-smbios", smbioscmd, NULL); VIR_FREE(smbioscmd); } - smbioscmd = qemuBuildSmbiosSystemStr(source, skip_uuid); + smbioscmd = qemuBuildSmbiosSystemStr(source->system, skip_uuid); if (smbioscmd != NULL) { virCommandAddArgList(cmd, "-smbios", smbioscmd, NULL); VIR_FREE(smbioscmd); diff --git a/src/util/virsysinfo.c b/src/util/virsysinfo.c index 72b7bb7..4c939ec 100644 --- a/src/util/virsysinfo.c +++ b/src/util/virsysinfo.c @@ -76,6 +76,22 @@ void virSysinfoBIOSDefFree(virSysinfoBIOSDefPtr def) VIR_FREE(def); } +void virSysinfoSystemDefFree(virSysinfoSystemDefPtr def) +{ + if (def == NULL) + return; + + VIR_FREE(def->manufacturer); + VIR_FREE(def->product); + VIR_FREE(def->version); + VIR_FREE(def->serial); + VIR_FREE(def->uuid); + VIR_FREE(def->sku); + VIR_FREE(def->family); + VIR_FREE(def); +} + + /** * virSysinfoDefFree: * @def: a sysinfo structure @@ -91,14 +107,7 @@ void virSysinfoDefFree(virSysinfoDefPtr def) return; virSysinfoBIOSDefFree(def->bios); - - VIR_FREE(def->system_manufacturer); - VIR_FREE(def->system_product); - VIR_FREE(def->system_version); - VIR_FREE(def->system_serial); - VIR_FREE(def->system_uuid); - VIR_FREE(def->system_sku); - VIR_FREE(def->system_family); + virSysinfoSystemDefFree(def->system); for (i = 0; i < def->nprocessor; i++) { VIR_FREE(def->processor[i].processor_socket_destination); @@ -141,39 +150,55 @@ void virSysinfoDefFree(virSysinfoDefPtr def) #if defined(__powerpc__) static int -virSysinfoParseSystem(const char *base, virSysinfoDefPtr ret) +virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *system) { + int ret = -1; char *eol = NULL; const char *cur; + virSysinfoSystemDefPtr def; if ((cur = strstr(base, "platform")) == NULL) return 0; + if (VIR_ALLOC(def) < 0) + return ret; + base = cur; /* Account for format 'platform : XXXX'*/ cur = strchr(cur, ':') + 1; eol = strchr(cur, '\n'); virSkipSpaces(&cur); - if (eol && VIR_STRNDUP(ret->system_family, cur, eol - cur) < 0) - return -1; + if (eol && VIR_STRNDUP(def->family, cur, eol - cur) < 0) + goto cleanup; if ((cur = strstr(base, "model")) != NULL) { cur = strchr(cur, ':') + 1; eol = strchr(cur, '\n'); virSkipSpaces(&cur); - if (eol && VIR_STRNDUP(ret->system_serial, cur, eol - cur) < 0) - return -1; + if (eol && VIR_STRNDUP(def->serial, cur, eol - cur) < 0) + goto cleanup; } if ((cur = strstr(base, "machine")) != NULL) { cur = strchr(cur, ':') + 1; eol = strchr(cur, '\n'); virSkipSpaces(&cur); - if (eol && VIR_STRNDUP(ret->system_version, cur, eol - cur) < 0) - return -1; + if (eol && VIR_STRNDUP(def->version, cur, eol - cur) < 0) + goto cleanup; } - return 0; + if (!def->manufacturer && !def->product && !def->version && + !def->serial && !def->uuid && !def->sku && !def->family) { + virSysinfoSystemDefFree(def); + def = NULL; + } + + *system = def; + def = NULL; + ret = 0; + cleanup: + virSysinfoSystemDefFree(def); + return ret; } static int @@ -243,7 +268,7 @@ virSysinfoRead(void) if (virSysinfoParseProcessor(outbuf, ret) < 0) goto no_memory; - if (virSysinfoParseSystem(outbuf, ret) < 0) + if (virSysinfoParseSystem(outbuf, &ret->system) < 0) goto no_memory; return ret; @@ -255,27 +280,32 @@ virSysinfoRead(void) #elif defined(__arm__) || defined(__aarch64__) static int -virSysinfoParseSystem(const char *base, virSysinfoDefPtr ret) +virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *system) { + int ret = -1; char *eol = NULL; const char *cur; + virSysinfoSystemDefPtr def; if ((cur = strstr(base, "platform")) == NULL) return 0; + if (VIR_ALLOC(def) < 0) + return ret; + base = cur; /* Account for format 'platform : XXXX'*/ cur = strchr(cur, ':') + 1; eol = strchr(cur, '\n'); virSkipSpaces(&cur); - if (eol && VIR_STRNDUP(ret->system_family, cur, eol - cur) < 0) + if (eol && VIR_STRNDUP(def->family, cur, eol - cur) < 0) return -1; if ((cur = strstr(base, "model")) != NULL) { cur = strchr(cur, ':') + 1; eol = strchr(cur, '\n'); virSkipSpaces(&cur); - if (eol && VIR_STRNDUP(ret->system_serial, cur, eol - cur) < 0) + if (eol && VIR_STRNDUP(def->serial, cur, eol - cur) < 0) return -1; } @@ -283,11 +313,22 @@ virSysinfoParseSystem(const char *base, virSysinfoDefPtr ret) cur = strchr(cur, ':') + 1; eol = strchr(cur, '\n'); virSkipSpaces(&cur); - if (eol && VIR_STRNDUP(ret->system_version, cur, eol - cur) < 0) + if (eol && VIR_STRNDUP(def->version, cur, eol - cur) < 0) return -1; } - return 0; + if (!def->manufacturer && !def->product && !def->version && + !def->serial && !def->uuid && !def->sku && !def->family) { + virSysinfoSystemDefFree(def); + def = NULL; + } + + *system = def; + def = NULL; + ret = 0; + cleanup: + virSysinfoSystemDefFree(def); + return ret; } static int @@ -361,7 +402,7 @@ virSysinfoRead(void) if (virSysinfoParseProcessor(outbuf, ret) < 0) goto no_memory; - if (virSysinfoParseSystem(outbuf, ret) < 0) + if (virSysinfoParseSystem(outbuf, &ret->system) < 0) goto no_memory; return ret; @@ -413,17 +454,38 @@ virSysinfoParseLine(const char *base, const char *name, char **value) } static int -virSysinfoParseSystem(const char *base, virSysinfoDefPtr ret) +virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *system) { - if (virSysinfoParseLine(base, "Manufacturer", - &ret->system_manufacturer) && - virSysinfoParseLine(base, "Type", - &ret->system_family) && - virSysinfoParseLine(base, "Sequence Code", - &ret->system_serial)) - return 0; - else - return -1; + int ret = -1; + virSysinfoSystemDefPtr def; + + if (VIR_ALLOC(def) < 0) + return ret; + + if (!virSysinfoParseLine(base, "Manufacturer", + &def->manufacturer)) + goto cleanup; + + if (!virSysinfoParseLine(base, "Type", + &def->family)) + goto cleanup; + + if (!virSysinfoParseLine(base, "Sequence Code", + &def->serial)) + goto cleanup; + + if (!def->manufacturer && !def->product && !def->version && + !def->serial && !def->uuid && !def->sku && !def->family) { + virSysinfoSystemDefFree(def); + def = NULL; + } + + *system = def; + def = NULL; + ret = 0; + cleanup: + virSysinfoSystemDefFree(def); + return ret; } static int @@ -500,7 +562,7 @@ virSysinfoRead(void) return NULL; } - if (virSysinfoParseSystem(outbuf, ret) < 0) + if (virSysinfoParseSystem(outbuf, &ret->system) < 0) goto no_memory; return ret; @@ -586,58 +648,74 @@ virSysinfoParseBIOS(const char *base, virSysinfoBIOSDefPtr *bios) } static int -virSysinfoParseSystem(const char *base, virSysinfoDefPtr ret) +virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *system) { + int ret = -1; const char *cur, *eol = NULL; + virSysinfoSystemDefPtr def; if ((cur = strstr(base, "System Information")) == NULL) return 0; + if (VIR_ALLOC(def) < 0) + return ret; + base = cur; if ((cur = strstr(base, "Manufacturer: ")) != NULL) { cur += 14; eol = strchr(cur, '\n'); - if (eol && VIR_STRNDUP(ret->system_manufacturer, cur, eol - cur) < 0) - return -1; + if (eol && VIR_STRNDUP(def->manufacturer, cur, eol - cur) < 0) + goto cleanup; } if ((cur = strstr(base, "Product Name: ")) != NULL) { cur += 14; eol = strchr(cur, '\n'); - if (eol && VIR_STRNDUP(ret->system_product, cur, eol - cur) < 0) - return -1; + if (eol && VIR_STRNDUP(def->product, cur, eol - cur) < 0) + goto cleanup; } if ((cur = strstr(base, "Version: ")) != NULL) { cur += 9; eol = strchr(cur, '\n'); - if (eol && VIR_STRNDUP(ret->system_version, cur, eol - cur) < 0) - return -1; + if (eol && VIR_STRNDUP(def->version, cur, eol - cur) < 0) + goto cleanup; } if ((cur = strstr(base, "Serial Number: ")) != NULL) { cur += 15; eol = strchr(cur, '\n'); - if (eol && VIR_STRNDUP(ret->system_serial, cur, eol - cur) < 0) - return -1; + if (eol && VIR_STRNDUP(def->serial, cur, eol - cur) < 0) + goto cleanup; } if ((cur = strstr(base, "UUID: ")) != NULL) { cur += 6; eol = strchr(cur, '\n'); - if (eol && VIR_STRNDUP(ret->system_uuid, cur, eol - cur) < 0) - return -1; + if (eol && VIR_STRNDUP(def->uuid, cur, eol - cur) < 0) + goto cleanup; } if ((cur = strstr(base, "SKU Number: ")) != NULL) { cur += 12; eol = strchr(cur, '\n'); - if (eol && VIR_STRNDUP(ret->system_sku, cur, eol - cur) < 0) - return -1; + if (eol && VIR_STRNDUP(def->sku, cur, eol - cur) < 0) + goto cleanup; } if ((cur = strstr(base, "Family: ")) != NULL) { cur += 8; eol = strchr(cur, '\n'); - if (eol && VIR_STRNDUP(ret->system_family, cur, eol - cur) < 0) - return -1; + if (eol && VIR_STRNDUP(def->family, cur, eol - cur) < 0) + goto cleanup; } - return 0; + if (!def->manufacturer && !def->product && !def->version && + !def->serial && !def->uuid && !def->sku && !def->family) { + virSysinfoSystemDefFree(def); + def = NULL; + } + + *system = def; + def = NULL; + ret = 0; + cleanup: + virSysinfoSystemDefFree(def); + return ret; } static int @@ -876,7 +954,7 @@ virSysinfoRead(void) if (virSysinfoParseBIOS(outbuf, &ret->bios) < 0) goto error; - if (virSysinfoParseSystem(outbuf, ret) < 0) + if (virSysinfoParseSystem(outbuf, &ret->system) < 0) goto error; ret->nprocessor = 0; @@ -923,29 +1001,27 @@ virSysinfoBIOSFormat(virBufferPtr buf, virSysinfoBIOSDefPtr def) } static void -virSysinfoSystemFormat(virBufferPtr buf, virSysinfoDefPtr def) +virSysinfoSystemFormat(virBufferPtr buf, virSysinfoSystemDefPtr def) { - if (!def->system_manufacturer && !def->system_product && - !def->system_version && !def->system_serial && - !def->system_uuid && !def->system_sku && !def->system_family) + if (!def) return; virBufferAddLit(buf, "<system>\n"); virBufferAdjustIndent(buf, 2); virBufferEscapeString(buf, "<entry name='manufacturer'>%s</entry>\n", - def->system_manufacturer); + def->manufacturer); virBufferEscapeString(buf, "<entry name='product'>%s</entry>\n", - def->system_product); + def->product); virBufferEscapeString(buf, "<entry name='version'>%s</entry>\n", - def->system_version); + def->version); virBufferEscapeString(buf, "<entry name='serial'>%s</entry>\n", - def->system_serial); + def->serial); virBufferEscapeString(buf, "<entry name='uuid'>%s</entry>\n", - def->system_uuid); + def->uuid); virBufferEscapeString(buf, "<entry name='sku'>%s</entry>\n", - def->system_sku); + def->sku); virBufferEscapeString(buf, "<entry name='family'>%s</entry>\n", - def->system_family); + def->family); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</system>\n"); } @@ -1080,7 +1156,7 @@ virSysinfoFormat(virBufferPtr buf, virSysinfoDefPtr def) virBufferAdjustIndent(buf, 2); virSysinfoBIOSFormat(buf, def->bios); - virSysinfoSystemFormat(buf, def); + virSysinfoSystemFormat(buf, def->system); virSysinfoProcessorFormat(buf, def); virSysinfoMemoryFormat(buf, def); @@ -1128,6 +1204,43 @@ virSysinfoBIOSIsEqual(virSysinfoBIOSDefPtr src, return identical; } +static bool +virSysinfoSystemIsEqual(virSysinfoSystemDefPtr src, + virSysinfoSystemDefPtr dst) +{ + bool identical = false; + + if (!src && !dst) + return true; + + if ((src && !dst) || (!src && dst)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Target sysinfo does not match source")); + goto cleanup; + } + +#define CHECK_FIELD(name, desc) \ + do { \ + if (STRNEQ_NULLABLE(src->name, dst->name)) { \ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \ + _("Target sysinfo %s %s does not match source %s"), \ + desc, NULLSTR(src->name), NULLSTR(dst->name)); \ + } \ + } while (0) + CHECK_FIELD(manufacturer, "system vendor"); + CHECK_FIELD(product, "system product"); + CHECK_FIELD(version, "system version"); + CHECK_FIELD(serial, "system serial"); + CHECK_FIELD(uuid, "system uuid"); + CHECK_FIELD(sku, "system sku"); + CHECK_FIELD(family, "system family"); +#undef CHECK_FIELD + + identical = true; + cleanup: + return identical; +} + bool virSysinfoIsEqual(virSysinfoDefPtr src, virSysinfoDefPtr dst) { @@ -1153,23 +1266,8 @@ bool virSysinfoIsEqual(virSysinfoDefPtr src, if (!virSysinfoBIOSIsEqual(src->bios, dst->bios)) goto cleanup; -#define CHECK_FIELD(name, desc) \ - do { \ - if (STRNEQ_NULLABLE(src->name, dst->name)) { \ - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \ - _("Target sysinfo %s %s does not match source %s"), \ - desc, NULLSTR(src->name), NULLSTR(dst->name)); \ - } \ - } while (0) - CHECK_FIELD(system_manufacturer, "system vendor"); - CHECK_FIELD(system_product, "system product"); - CHECK_FIELD(system_version, "system version"); - CHECK_FIELD(system_serial, "system serial"); - CHECK_FIELD(system_uuid, "system uuid"); - CHECK_FIELD(system_sku, "system sku"); - CHECK_FIELD(system_family, "system family"); - -#undef CHECK_FIELD + if (!virSysinfoSystemIsEqual(src->system, dst->system)) + goto cleanup; identical = true; diff --git a/src/util/virsysinfo.h b/src/util/virsysinfo.h index ec32f6c..c8cc1e8 100644 --- a/src/util/virsysinfo.h +++ b/src/util/virsysinfo.h @@ -74,20 +74,25 @@ struct _virSysinfoBIOSDef { char *release; }; +typedef struct _virSysinfoSystemDef virSysinfoSystemDef; +typedef virSysinfoSystemDef *virSysinfoSystemDefPtr; +struct _virSysinfoSystemDef { + char *manufacturer; + char *product; + char *version; + char *serial; + char *uuid; + char *sku; + char *family; +}; + typedef struct _virSysinfoDef virSysinfoDef; typedef virSysinfoDef *virSysinfoDefPtr; struct _virSysinfoDef { int type; virSysinfoBIOSDefPtr bios; - - char *system_manufacturer; - char *system_product; - char *system_version; - char *system_serial; - char *system_uuid; - char *system_sku; - char *system_family; + virSysinfoSystemDefPtr system; size_t nprocessor; virSysinfoProcessorDefPtr processor; @@ -99,6 +104,7 @@ struct _virSysinfoDef { virSysinfoDefPtr virSysinfoRead(void); void virSysinfoBIOSDefFree(virSysinfoBIOSDefPtr def); +void virSysinfoSystemDefFree(virSysinfoSystemDefPtr def); void virSysinfoDefFree(virSysinfoDefPtr def); int virSysinfoFormat(virBufferPtr buf, virSysinfoDefPtr def) -- 2.3.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list