提交 532ce9c2 编写于 作者: M Minoru Usui 提交者: Daniel Veillard

Cleanup virSysinfoRead()

* src/util/sysinfo.c: Separate BIOSInfo and SystemInfo part from
                      virSysinfoRead()
上级 789ab2cc
......@@ -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,108 +243,128 @@ no_memory:
}
#endif /* !WIN32 */
/**
* virSysinfoFormat:
* @def: structure to convert to xml string
* @prefix: string to prefix before each line of xml
*
* This returns the XML description of the sysinfo, or NULL after
* generating an error message.
*/
char *
virSysinfoFormat(virSysinfoDefPtr def, const char *prefix)
static void
BIOSInfoFormat(virSysinfoDefPtr def, const char *prefix, virBufferPtr buf)
{
const char *type = virSysinfoTypeToString(def->type);
virBuffer buf = VIR_BUFFER_INITIALIZER;
size_t len = strlen(prefix);
if (!type) {
virSmbiosReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected sysinfo type model %d"),
def->type);
return NULL;
}
int len = strlen(prefix);
virBufferAsprintf(&buf, "%s<sysinfo type='%s'>\n", prefix, type);
if ((def->bios_vendor != NULL) || (def->bios_version != NULL) ||
(def->bios_date != NULL) || (def->bios_release != NULL)) {
virBufferAsprintf(&buf, "%s <bios>\n", prefix);
virBufferAsprintf(buf, "%s <bios>\n", prefix);
if (def->bios_vendor != NULL) {
virBufferAdd(&buf, prefix, len);
virBufferEscapeString(&buf,
virBufferAdd(buf, prefix, len);
virBufferEscapeString(buf,
" <entry name='vendor'>%s</entry>\n",
def->bios_vendor);
}
if (def->bios_version != NULL) {
virBufferAdd(&buf, prefix, len);
virBufferEscapeString(&buf,
virBufferAdd(buf, prefix, len);
virBufferEscapeString(buf,
" <entry name='version'>%s</entry>\n",
def->bios_version);
}
if (def->bios_date != NULL) {
virBufferAdd(&buf, prefix, len);
virBufferEscapeString(&buf,
virBufferAdd(buf, prefix, len);
virBufferEscapeString(buf,
" <entry name='date'>%s</entry>\n",
def->bios_date);
}
if (def->bios_release != NULL) {
virBufferAdd(&buf, prefix, len);
virBufferEscapeString(&buf,
virBufferAdd(buf, prefix, len);
virBufferEscapeString(buf,
" <entry name='release'>%s</entry>\n",
def->bios_release);
}
virBufferAsprintf(&buf, "%s </bios>\n", prefix);
virBufferAsprintf(buf, "%s </bios>\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 <system>\n", prefix);
virBufferAsprintf(buf, "%s <system>\n", prefix);
if (def->system_manufacturer != NULL) {
virBufferAdd(&buf, prefix, len);
virBufferEscapeString(&buf,
virBufferAdd(buf, prefix, len);
virBufferEscapeString(buf,
" <entry name='manufacturer'>%s</entry>\n",
def->system_manufacturer);
}
if (def->system_product != NULL) {
virBufferAdd(&buf, prefix, len);
virBufferEscapeString(&buf,
virBufferAdd(buf, prefix, len);
virBufferEscapeString(buf,
" <entry name='product'>%s</entry>\n",
def->system_product);
}
if (def->system_version != NULL) {
virBufferAdd(&buf, prefix, len);
virBufferEscapeString(&buf,
virBufferAdd(buf, prefix, len);
virBufferEscapeString(buf,
" <entry name='version'>%s</entry>\n",
def->system_version);
}
if (def->system_serial != NULL) {
virBufferAdd(&buf, prefix, len);
virBufferEscapeString(&buf,
virBufferAdd(buf, prefix, len);
virBufferEscapeString(buf,
" <entry name='serial'>%s</entry>\n",
def->system_serial);
}
if (def->system_uuid != NULL) {
virBufferAdd(&buf, prefix, len);
virBufferEscapeString(&buf,
virBufferAdd(buf, prefix, len);
virBufferEscapeString(buf,
" <entry name='uuid'>%s</entry>\n",
def->system_uuid);
}
if (def->system_sku != NULL) {
virBufferAdd(&buf, prefix, len);
virBufferEscapeString(&buf,
virBufferAdd(buf, prefix, len);
virBufferEscapeString(buf,
" <entry name='sku'>%s</entry>\n",
def->system_sku);
}
if (def->system_family != NULL) {
virBufferAdd(&buf, prefix, len);
virBufferEscapeString(&buf,
virBufferAdd(buf, prefix, len);
virBufferEscapeString(buf,
" <entry name='family'>%s</entry>\n",
def->system_family);
}
virBufferAsprintf(&buf, "%s </system>\n", prefix);
virBufferAsprintf(buf, "%s </system>\n", prefix);
}
return;
}
/**
* virSysinfoFormat:
* @def: structure to convert to xml string
* @prefix: string to prefix before each line of xml
*
* This returns the XML description of the sysinfo, or NULL after
* generating an error message.
*/
char *
virSysinfoFormat(virSysinfoDefPtr def, const char *prefix)
{
const char *type = virSysinfoTypeToString(def->type);
virBuffer buf = VIR_BUFFER_INITIALIZER;
if (!type) {
virSmbiosReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected sysinfo type model %d"),
def->type);
return NULL;
}
virBufferAsprintf(&buf, "%s<sysinfo type='%s'>\n", prefix, type);
BIOSInfoFormat(def, prefix, &buf);
SystemInfoFormat(def, prefix, &buf);
virBufferAsprintf(&buf, "%s</sysinfo>\n", prefix);
return virBufferContentAndReset(&buf);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册