diff --git a/src/Makefile.am b/src/Makefile.am index 62c8743151..a296d71f2c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -173,7 +173,7 @@ UTIL_SOURCES = \ util/virstorageencryption.c util/virstorageencryption.h \ util/virstoragefile.c util/virstoragefile.h \ util/virstring.h util/virstring.c \ - util/virsysinfo.c util/virsysinfo.h \ + util/virsysinfo.c util/virsysinfo.h util/virsysinfopriv.h \ util/virsystemd.c util/virsystemd.h util/virsystemdpriv.h \ util/virthread.c util/virthread.h \ util/virthreadjob.c util/virthreadjob.h \ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index b5505072ce..fb361d1afb 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2561,6 +2561,13 @@ virSysinfoSetup; virSysinfoSystemDefFree; +# util/virsysinfopriv.h +virSysinfoReadARM; +virSysinfoReadPPC; +virSysinfoReadS390; +virSysinfoReadX86; + + # util/virsystemd.h virSystemdCanHibernate; virSystemdCanHybridSleep; diff --git a/src/util/virsysinfo.c b/src/util/virsysinfo.c index e8dbd4d01a..bdd4304701 100644 --- a/src/util/virsysinfo.c +++ b/src/util/virsysinfo.c @@ -37,6 +37,9 @@ #include "virfile.h" #include "virstring.h" +#define __VIR_SYSINFO_PRIV_H_ALLOW__ +#include "virsysinfopriv.h" + #define VIR_FROM_THIS VIR_FROM_SYSINFO @@ -156,17 +159,9 @@ void virSysinfoDefFree(virSysinfoDefPtr def) VIR_FREE(def); } -/** - * virSysinfoRead: - * - * Tries to read the SMBIOS information from the current host - * - * Returns: a filled up sysinfo structure or NULL in case of error - */ -#if defined(__powerpc__) static int -virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *sysdef) +virSysinfoParsePPCSystem(const char *base, virSysinfoSystemDefPtr *sysdef) { int ret = -1; char *eol = NULL; @@ -218,7 +213,7 @@ virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *sysdef) } static int -virSysinfoParseProcessor(const char *base, virSysinfoDefPtr ret) +virSysinfoParsePPCProcessor(const char *base, virSysinfoDefPtr ret) { const char *cur; char *eol, *tmp_base; @@ -265,7 +260,7 @@ virSysinfoParseProcessor(const char *base, virSysinfoDefPtr ret) /* virSysinfoRead for PowerPC * Gathers sysinfo data from /proc/cpuinfo */ virSysinfoDefPtr -virSysinfoRead(void) +virSysinfoReadPPC(void) { virSysinfoDefPtr ret = NULL; char *outbuf = NULL; @@ -281,10 +276,10 @@ virSysinfoRead(void) ret->nprocessor = 0; ret->processor = NULL; - if (virSysinfoParseProcessor(outbuf, ret) < 0) + if (virSysinfoParsePPCProcessor(outbuf, ret) < 0) goto no_memory; - if (virSysinfoParseSystem(outbuf, &ret->system) < 0) + if (virSysinfoParsePPCSystem(outbuf, &ret->system) < 0) goto no_memory; return ret; @@ -294,9 +289,9 @@ virSysinfoRead(void) return NULL; } -#elif defined(__arm__) || defined(__aarch64__) + static int -virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *sysdef) +virSysinfoParseARMSystem(const char *base, virSysinfoSystemDefPtr *sysdef) { int ret = -1; char *eol = NULL; @@ -348,7 +343,7 @@ virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *sysdef) } static int -virSysinfoParseProcessor(const char *base, virSysinfoDefPtr ret) +virSysinfoParseARMProcessor(const char *base, virSysinfoDefPtr ret) { const char *cur; char *eol, *tmp_base; @@ -397,7 +392,7 @@ virSysinfoParseProcessor(const char *base, virSysinfoDefPtr ret) /* virSysinfoRead for ARMv7 * Gathers sysinfo data from /proc/cpuinfo */ virSysinfoDefPtr -virSysinfoRead(void) +virSysinfoReadARM(void) { virSysinfoDefPtr ret = NULL; char *outbuf = NULL; @@ -413,10 +408,10 @@ virSysinfoRead(void) ret->nprocessor = 0; ret->processor = NULL; - if (virSysinfoParseProcessor(outbuf, ret) < 0) + if (virSysinfoParseARMProcessor(outbuf, ret) < 0) goto no_memory; - if (virSysinfoParseSystem(outbuf, &ret->system) < 0) + if (virSysinfoParseARMSystem(outbuf, &ret->system) < 0) goto no_memory; return ret; @@ -427,13 +422,12 @@ virSysinfoRead(void) } -#elif defined(__s390__) || defined(__s390x__) VIR_WARNINGS_NO_WLOGICALOP_STRCHR static char * -virSysinfoParseDelimited(const char *base, const char *name, char **value, - char delim1, char delim2) +virSysinfoParseS390Delimited(const char *base, const char *name, char **value, + char delim1, char delim2) { const char *start; char *end; @@ -453,13 +447,13 @@ virSysinfoParseDelimited(const char *base, const char *name, char **value, } static char * -virSysinfoParseLine(const char *base, const char *name, char **value) +virSysinfoParseS390Line(const char *base, const char *name, char **value) { - return virSysinfoParseDelimited(base, name, value, ':', '\n'); + return virSysinfoParseS390Delimited(base, name, value, ':', '\n'); } static int -virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *sysdef) +virSysinfoParseS390System(const char *base, virSysinfoSystemDefPtr *sysdef) { int ret = -1; virSysinfoSystemDefPtr def; @@ -467,16 +461,13 @@ virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *sysdef) if (VIR_ALLOC(def) < 0) return ret; - if (!virSysinfoParseLine(base, "Manufacturer", - &def->manufacturer)) + if (!virSysinfoParseS390Line(base, "Manufacturer", &def->manufacturer)) goto cleanup; - if (!virSysinfoParseLine(base, "Type", - &def->family)) + if (!virSysinfoParseS390Line(base, "Type", &def->family)) goto cleanup; - if (!virSysinfoParseLine(base, "Sequence Code", - &def->serial)) + if (!virSysinfoParseS390Line(base, "Sequence Code", &def->serial)) goto cleanup; if (!def->manufacturer && !def->product && !def->version && @@ -494,7 +485,7 @@ virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *sysdef) } static int -virSysinfoParseProcessor(const char *base, virSysinfoDefPtr ret) +virSysinfoParseS390Processor(const char *base, virSysinfoDefPtr ret) { char *tmp_base; char *manufacturer = NULL; @@ -502,28 +493,28 @@ virSysinfoParseProcessor(const char *base, virSysinfoDefPtr ret) int result = -1; virSysinfoProcessorDefPtr processor; - if (!(tmp_base = virSysinfoParseLine(base, "vendor_id", &manufacturer))) + if (!(tmp_base = virSysinfoParseS390Line(base, "vendor_id", &manufacturer))) goto cleanup; /* Find processor N: line and gather the processor manufacturer, version, serial number, and family */ while ((tmp_base = strstr(tmp_base, "processor ")) - && (tmp_base = virSysinfoParseLine(tmp_base, "processor ", - &procline))) { + && (tmp_base = virSysinfoParseS390Line(tmp_base, "processor ", + &procline))) { if (VIR_EXPAND_N(ret->processor, ret->nprocessor, 1) < 0) goto cleanup; processor = &ret->processor[ret->nprocessor - 1]; if (VIR_STRDUP(processor->processor_manufacturer, manufacturer) < 0) goto cleanup; - if (!virSysinfoParseDelimited(procline, "version", - &processor->processor_version, - '=', ',') || - !virSysinfoParseDelimited(procline, "identification", - &processor->processor_serial_number, - '=', ',') || - !virSysinfoParseDelimited(procline, "machine", - &processor->processor_family, - '=', '\n')) + if (!virSysinfoParseS390Delimited(procline, "version", + &processor->processor_version, + '=', ',') || + !virSysinfoParseS390Delimited(procline, "identification", + &processor->processor_serial_number, + '=', ',') || + !virSysinfoParseS390Delimited(procline, "machine", + &processor->processor_family, + '=', '\n')) goto cleanup; } result = 0; @@ -537,7 +528,7 @@ virSysinfoParseProcessor(const char *base, virSysinfoDefPtr ret) /* virSysinfoRead for s390x * Gathers sysinfo data from /proc/sysinfo and /proc/cpuinfo */ virSysinfoDefPtr -virSysinfoRead(void) +virSysinfoReadS390(void) { virSysinfoDefPtr ret = NULL; char *outbuf = NULL; @@ -554,7 +545,7 @@ virSysinfoRead(void) ret->nprocessor = 0; ret->processor = NULL; - if (virSysinfoParseProcessor(outbuf, ret) < 0) + if (virSysinfoParseS390Processor(outbuf, ret) < 0) goto no_memory; /* Free buffer before reading next file */ @@ -567,7 +558,7 @@ virSysinfoRead(void) return NULL; } - if (virSysinfoParseSystem(outbuf, &ret->system) < 0) + if (virSysinfoParseS390System(outbuf, &ret->system) < 0) goto no_memory; return ret; @@ -578,26 +569,6 @@ virSysinfoRead(void) return NULL; } -#elif defined(WIN32) || \ - !(defined(__x86_64__) || \ - defined(__i386__) || \ - defined(__amd64__) || \ - defined(__arm__) || \ - defined(__aarch64__) || \ - defined(__powerpc__)) -virSysinfoDefPtr -virSysinfoRead(void) -{ - /* - * this can probably be extracted from Windows using API or registry - * http://www.microsoft.com/whdc/system/platform/firmware/SMBIOS.mspx - */ - virReportSystemError(ENOSYS, "%s", - _("Host sysinfo extraction not supported on this platform")); - return NULL; -} - -#else /* !WIN32 && x86 */ static int virSysinfoParseBIOS(const char *base, virSysinfoBIOSDefPtr *bios) @@ -653,7 +624,7 @@ virSysinfoParseBIOS(const char *base, virSysinfoBIOSDefPtr *bios) } static int -virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *sysdef) +virSysinfoParseX86System(const char *base, virSysinfoSystemDefPtr *sysdef) { int ret = -1; const char *cur, *eol = NULL; @@ -724,9 +695,9 @@ virSysinfoParseSystem(const char *base, virSysinfoSystemDefPtr *sysdef) } static int -virSysinfoParseBaseBoard(const char *base, - virSysinfoBaseBoardDefPtr *baseBoard, - size_t *nbaseBoard) +virSysinfoParseX86BaseBoard(const char *base, + virSysinfoBaseBoardDefPtr *baseBoard, + size_t *nbaseBoard) { int ret = -1; const char *cur, *eol = NULL; @@ -802,7 +773,7 @@ virSysinfoParseBaseBoard(const char *base, } static int -virSysinfoParseProcessor(const char *base, virSysinfoDefPtr ret) +virSysinfoParseX86Processor(const char *base, virSysinfoDefPtr ret) { const char *cur, *tmp_base; char *eol; @@ -909,7 +880,7 @@ virSysinfoParseProcessor(const char *base, virSysinfoDefPtr ret) } static int -virSysinfoParseMemory(const char *base, virSysinfoDefPtr ret) +virSysinfoParseX86Memory(const char *base, virSysinfoDefPtr ret) { const char *cur, *tmp_base; char *eol; @@ -1008,7 +979,7 @@ virSysinfoParseMemory(const char *base, virSysinfoDefPtr ret) } virSysinfoDefPtr -virSysinfoRead(void) +virSysinfoReadX86(void) { char *path; virSysinfoDefPtr ret = NULL; @@ -1037,20 +1008,20 @@ virSysinfoRead(void) if (virSysinfoParseBIOS(outbuf, &ret->bios) < 0) goto error; - if (virSysinfoParseSystem(outbuf, &ret->system) < 0) + if (virSysinfoParseX86System(outbuf, &ret->system) < 0) goto error; - if (virSysinfoParseBaseBoard(outbuf, &ret->baseBoard, &ret->nbaseBoard) < 0) + if (virSysinfoParseX86BaseBoard(outbuf, &ret->baseBoard, &ret->nbaseBoard) < 0) goto error; ret->nprocessor = 0; ret->processor = NULL; - if (virSysinfoParseProcessor(outbuf, ret) < 0) + if (virSysinfoParseX86Processor(outbuf, ret) < 0) goto error; ret->nmemory = 0; ret->memory = NULL; - if (virSysinfoParseMemory(outbuf, ret) < 0) + if (virSysinfoParseX86Memory(outbuf, ret) < 0) goto error; cleanup: @@ -1064,7 +1035,43 @@ virSysinfoRead(void) ret = NULL; goto cleanup; } + + +/** + * virSysinfoRead: + * + * Tries to read the SMBIOS information from the current host + * + * Returns: a filled up sysinfo structure or NULL in case of error + */ +virSysinfoDefPtr +virSysinfoRead(void) +{ +#if defined(__powerpc__) + return virSysinfoReadPPC(); +#elif defined(__arm__) || defined(__aarch64__) + return virSysinfoReadARM(); +#elif defined(__s390__) || defined(__s390x__) + return virSysinfoReadS390(); +#elif defined(WIN32) || \ + !(defined(__x86_64__) || \ + defined(__i386__) || \ + defined(__amd64__) || \ + defined(__arm__) || \ + defined(__aarch64__) || \ + defined(__powerpc__)) + /* + * this can probably be extracted from Windows using API or registry + * http://www.microsoft.com/whdc/system/platform/firmware/SMBIOS.mspx + */ + virReportSystemError(ENOSYS, "%s", + _("Host sysinfo extraction not supported on this platform")); + return NULL; +#else /* !WIN32 && x86 */ + return virSysinfoReadX86(); #endif /* !WIN32 && x86 */ +} + static void virSysinfoBIOSFormat(virBufferPtr buf, virSysinfoBIOSDefPtr def) diff --git a/src/util/virsysinfopriv.h b/src/util/virsysinfopriv.h new file mode 100644 index 0000000000..9152364796 --- /dev/null +++ b/src/util/virsysinfopriv.h @@ -0,0 +1,39 @@ +/* + * virsysinfopriv.h: Header for functions tested in the test suite + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + * + */ + +#ifndef __VIR_SYSINFO_PRIV_H_ALLOW__ +# error "virsysinfopriv.h may only be included by virsysinfo.c or test suites" +#endif + +#ifndef __VIR_SYSINFO_PRIV_H__ +# define __VIR_SYSINFO_PRIV_H__ + +virSysinfoDefPtr +virSysinfoReadPPC(void); + +virSysinfoDefPtr +virSysinfoReadARM(void); + +virSysinfoDefPtr +virSysinfoReadS390(void); + +virSysinfoDefPtr +virSysinfoReadX86(void); + +#endif /* __VIR_SYSINFO_PRIV_H__ */