diff --git a/src/util/sysinfo.c b/src/util/sysinfo.c index 40ec2e3aee..53122f755a 100644 --- a/src/util/sysinfo.c +++ b/src/util/sysinfo.c @@ -96,37 +96,10 @@ virSysinfoRead(void) { #else /* !WIN32 */ -virSysinfoDefPtr -virSysinfoRead(void) { - char *path, *cur, *eol, *base; - virSysinfoDefPtr ret = NULL; - char *outbuf = NULL; - virCommandPtr cmd; - - path = virFindFileInPath(SYSINFO_SMBIOS_DECODER); - if (path == NULL) { - virSmbiosReportError(VIR_ERR_INTERNAL_ERROR, - _("Failed to find path for %s binary"), - SYSINFO_SMBIOS_DECODER); - return NULL; - } - - cmd = virCommandNewArgList(path, "-q", "-t", "0,1", NULL); - VIR_FREE(path); - virCommandSetOutputBuffer(cmd, &outbuf); - if (virCommandRun(cmd, NULL) < 0) { - virSmbiosReportError(VIR_ERR_INTERNAL_ERROR, - _("Failed to execute command %s"), - path); - goto cleanup; - } - - if (VIR_ALLOC(ret) < 0) - goto no_memory; - - ret->type = VIR_SYSINFO_SMBIOS; - - base = outbuf; +static char * +parseBIOSInfo(char *base, virSysinfoDefPtr ret) +{ + char *cur, *eol; if ((cur = strstr(base, "Vendor: ")) != NULL) { cur += 8; @@ -152,8 +125,21 @@ virSysinfoRead(void) { if ((eol) && ((ret->bios_release = strndup(cur, eol - cur)) == NULL)) goto no_memory; } - if ((base = strstr(outbuf, "System Information")) == NULL) - goto cleanup; + + return eol + 1; + +no_memory: + return NULL; +} + +static char * +parseSystemInfo(char *base, virSysinfoDefPtr ret) +{ + char *cur, *eol; + + if ((base = strstr(base, "System Information")) == NULL) + return 0; + if ((cur = strstr(base, "Manufacturer: ")) != NULL) { cur += 14; eol = strchr(cur, '\n'); @@ -198,6 +184,50 @@ virSysinfoRead(void) { goto no_memory; } + return eol + 1; + +no_memory: + return NULL; +} + +virSysinfoDefPtr +virSysinfoRead(void) { + char *path, *base; + virSysinfoDefPtr ret = NULL; + char *outbuf = NULL; + virCommandPtr cmd; + + path = virFindFileInPath(SYSINFO_SMBIOS_DECODER); + if (path == NULL) { + virSmbiosReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to find path for %s binary"), + SYSINFO_SMBIOS_DECODER); + return NULL; + } + + cmd = virCommandNewArgList(path, "-q", "-t", "0,1,4,17", NULL); + VIR_FREE(path); + virCommandSetOutputBuffer(cmd, &outbuf); + if (virCommandRun(cmd, NULL) < 0) { + virSmbiosReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to execute command %s"), + path); + goto cleanup; + } + + if (VIR_ALLOC(ret) < 0) + goto no_memory; + + ret->type = VIR_SYSINFO_SMBIOS; + + base = outbuf; + + if ((base = parseBIOSInfo(base, ret)) == NULL) + goto no_memory; + + if ((base = parseSystemInfo(base, ret)) == NULL) + goto no_memory; + cleanup: VIR_FREE(outbuf); virCommandFree(cmd); @@ -213,6 +243,102 @@ no_memory: } #endif /* !WIN32 */ +static void +BIOSInfoFormat(virSysinfoDefPtr def, const char *prefix, virBufferPtr buf) +{ + int len = strlen(prefix); + + if ((def->bios_vendor != NULL) || (def->bios_version != NULL) || + (def->bios_date != NULL) || (def->bios_release != NULL)) { + virBufferAsprintf(buf, "%s \n", prefix); + if (def->bios_vendor != NULL) { + virBufferAdd(buf, prefix, len); + virBufferEscapeString(buf, + " %s\n", + def->bios_vendor); + } + if (def->bios_version != NULL) { + virBufferAdd(buf, prefix, len); + virBufferEscapeString(buf, + " %s\n", + def->bios_version); + } + if (def->bios_date != NULL) { + virBufferAdd(buf, prefix, len); + virBufferEscapeString(buf, + " %s\n", + def->bios_date); + } + if (def->bios_release != NULL) { + virBufferAdd(buf, prefix, len); + virBufferEscapeString(buf, + " %s\n", + def->bios_release); + } + virBufferAsprintf(buf, "%s \n", prefix); + } + + return; +} + +static void +SystemInfoFormat(virSysinfoDefPtr def, const char *prefix, virBufferPtr buf) +{ + int len = strlen(prefix); + + if ((def->system_manufacturer != NULL) || (def->system_product != NULL) || + (def->system_version != NULL) || (def->system_serial != NULL) || + (def->system_uuid != NULL) || (def->system_sku != NULL) || + (def->system_family != NULL)) { + virBufferAsprintf(buf, "%s \n", prefix); + if (def->system_manufacturer != NULL) { + virBufferAdd(buf, prefix, len); + virBufferEscapeString(buf, + " %s\n", + def->system_manufacturer); + } + if (def->system_product != NULL) { + virBufferAdd(buf, prefix, len); + virBufferEscapeString(buf, + " %s\n", + def->system_product); + } + if (def->system_version != NULL) { + virBufferAdd(buf, prefix, len); + virBufferEscapeString(buf, + " %s\n", + def->system_version); + } + if (def->system_serial != NULL) { + virBufferAdd(buf, prefix, len); + virBufferEscapeString(buf, + " %s\n", + def->system_serial); + } + if (def->system_uuid != NULL) { + virBufferAdd(buf, prefix, len); + virBufferEscapeString(buf, + " %s\n", + def->system_uuid); + } + if (def->system_sku != NULL) { + virBufferAdd(buf, prefix, len); + virBufferEscapeString(buf, + " %s\n", + def->system_sku); + } + if (def->system_family != NULL) { + virBufferAdd(buf, prefix, len); + virBufferEscapeString(buf, + " %s\n", + def->system_family); + } + virBufferAsprintf(buf, "%s \n", prefix); + } + + return; +} + /** * virSysinfoFormat: * @def: structure to convert to xml string @@ -226,7 +352,6 @@ virSysinfoFormat(virSysinfoDefPtr def, const char *prefix) { const char *type = virSysinfoTypeToString(def->type); virBuffer buf = VIR_BUFFER_INITIALIZER; - size_t len = strlen(prefix); if (!type) { virSmbiosReportError(VIR_ERR_INTERNAL_ERROR, @@ -236,84 +361,9 @@ virSysinfoFormat(virSysinfoDefPtr def, const char *prefix) } virBufferAsprintf(&buf, "%s\n", prefix, type); - if ((def->bios_vendor != NULL) || (def->bios_version != NULL) || - (def->bios_date != NULL) || (def->bios_release != NULL)) { - virBufferAsprintf(&buf, "%s \n", prefix); - if (def->bios_vendor != NULL) { - virBufferAdd(&buf, prefix, len); - virBufferEscapeString(&buf, - " %s\n", - def->bios_vendor); - } - if (def->bios_version != NULL) { - virBufferAdd(&buf, prefix, len); - virBufferEscapeString(&buf, - " %s\n", - def->bios_version); - } - if (def->bios_date != NULL) { - virBufferAdd(&buf, prefix, len); - virBufferEscapeString(&buf, - " %s\n", - def->bios_date); - } - if (def->bios_release != NULL) { - virBufferAdd(&buf, prefix, len); - virBufferEscapeString(&buf, - " %s\n", - def->bios_release); - } - virBufferAsprintf(&buf, "%s \n", prefix); - } - if ((def->system_manufacturer != NULL) || (def->system_product != NULL) || - (def->system_version != NULL) || (def->system_serial != NULL) || - (def->system_uuid != NULL) || (def->system_sku != NULL) || - (def->system_family != NULL)) { - virBufferAsprintf(&buf, "%s \n", prefix); - if (def->system_manufacturer != NULL) { - virBufferAdd(&buf, prefix, len); - virBufferEscapeString(&buf, - " %s\n", - def->system_manufacturer); - } - if (def->system_product != NULL) { - virBufferAdd(&buf, prefix, len); - virBufferEscapeString(&buf, - " %s\n", - def->system_product); - } - if (def->system_version != NULL) { - virBufferAdd(&buf, prefix, len); - virBufferEscapeString(&buf, - " %s\n", - def->system_version); - } - if (def->system_serial != NULL) { - virBufferAdd(&buf, prefix, len); - virBufferEscapeString(&buf, - " %s\n", - def->system_serial); - } - if (def->system_uuid != NULL) { - virBufferAdd(&buf, prefix, len); - virBufferEscapeString(&buf, - " %s\n", - def->system_uuid); - } - if (def->system_sku != NULL) { - virBufferAdd(&buf, prefix, len); - virBufferEscapeString(&buf, - " %s\n", - def->system_sku); - } - if (def->system_family != NULL) { - virBufferAdd(&buf, prefix, len); - virBufferEscapeString(&buf, - " %s\n", - def->system_family); - } - virBufferAsprintf(&buf, "%s \n", prefix); - } + + BIOSInfoFormat(def, prefix, &buf); + SystemInfoFormat(def, prefix, &buf); virBufferAsprintf(&buf, "%s\n", prefix);