123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- On linux platforms, grok /proc/cpuinfo for the CPU/vendor info.
- Prob not suitable for upstream seeing as how it's 100% linux-specific
- http://lists.gnu.org/archive/html/bug-coreutils/2005-09/msg00063.html
- Patch originally by Carlos E. Gorges <carlos at techlinux.com.br>, but
- heavily reworked to suck less.
- To add support for additional platforms, check out the show_cpuinfo()
- func in the linux/arch/<ARCH>/ source tree of the kernel.
- --- coreutils/src/uname.c
- +++ coreutils/src/uname.c
- @@ -50,6 +50,11 @@
- # include <mach-o/arch.h>
- #endif
-
- +#if defined(__linux__)
- +# define USE_PROCINFO
- +# define UNAME_HARDWARE_PLATFORM
- +#endif
- +
- #include "system.h"
- #include "error.h"
- #include "quote.h"
- @@ -138,6 +143,117 @@
- exit (status);
- }
-
- +#if defined(USE_PROCINFO)
- +
- +# if defined(__s390__) || defined(__s390x__)
- +# define CPUINFO_FILE "/proc/sysinfo"
- +# define CPUINFO_FORMAT "%64[^\t :]%*[ :]%256[^\n]%c"
- +# else
- +# define CPUINFO_FILE "/proc/cpuinfo"
- +# define CPUINFO_FORMAT "%64[^\t:]\t:%256[^\n]%c"
- +# endif
- +
- +# define PROCINFO_PROCESSOR 0
- +# define PROCINFO_HARDWARE_PLATFORM 1
- +
- +static void __eat_cpuinfo_space(char *buf)
- +{
- + /* first eat trailing space */
- + char *tmp = buf + strlen(buf) - 1;
- + while (tmp > buf && isspace(*tmp))
- + *tmp-- = '\0';
- + /* then eat leading space */
- + tmp = buf;
- + while (*tmp && isspace(*tmp))
- + tmp++;
- + if (tmp != buf)
- + memmove(buf, tmp, strlen(tmp)+1);
- + /* finally collapse whitespace */
- + tmp = buf;
- + while (tmp[0] && tmp[1]) {
- + if (isspace(tmp[0]) && isspace(tmp[1])) {
- + memmove(tmp, tmp+1, strlen(tmp));
- + continue;
- + }
- + ++tmp;
- + }
- +}
- +
- +static int __linux_procinfo(int x, char *fstr, size_t s)
- +{
- + FILE *fp;
- +
- + char *procinfo_keys[] = {
- + /* --processor --hardware-platform */
- + #if defined(__alpha__)
- + "cpu model", "system type"
- + #elif defined(__arm__)
- + "Processor", "Hardware"
- + #elif defined(__avr32__)
- + "processor", "cpu family"
- + #elif defined(__bfin__)
- + "CPU", "BOARD Name"
- + #elif defined(__cris__)
- + "cpu", "cpu model"
- + #elif defined(__frv__)
- + "CPU-Core", "System"
- + #elif defined(__i386__) || defined(__x86_64__)
- + "model name", "vendor_id"
- + #elif defined(__ia64__)
- + "family", "vendor"
- + #elif defined(__hppa__)
- + "cpu", "model"
- + #elif defined(__m68k__)
- + "CPU", "MMU"
- + #elif defined(__mips__)
- + "cpu model", "system type"
- + #elif defined(__powerpc__) || defined(__powerpc64__)
- + "cpu", "machine"
- + #elif defined(__s390__) || defined(__s390x__)
- + "Type", "Manufacturer"
- + #elif defined(__sh__)
- + "cpu type", "machine"
- + #elif defined(sparc) || defined(__sparc__)
- + "type", "cpu"
- + #elif defined(__vax__)
- + "cpu type", "cpu"
- + #else
- + "unknown", "unknown"
- + #endif
- + };
- +
- + if ((fp = fopen(CPUINFO_FILE, "r")) != NULL) {
- + char key[65], value[257], eol, *ret = NULL;
- +
- + while (fscanf(fp, CPUINFO_FORMAT, key, value, &eol) != EOF) {
- + __eat_cpuinfo_space(key);
- + if (!strcmp(key, procinfo_keys[x])) {
- + __eat_cpuinfo_space(value);
- + ret = value;
- + break;
- + }
- + if (eol != '\n') {
- + /* we need two fscanf's here in case the previous
- + * length limit caused us to read right up to the
- + * newline ... doing "%*[^\n]\n" wont eat the newline
- + */
- + fscanf(fp, "%*[^\n]");
- + fscanf(fp, "\n");
- + }
- + }
- + fclose(fp);
- +
- + if (ret) {
- + strncpy(fstr, ret, s);
- + return 0;
- + }
- + }
- +
- + return -1;
- +}
- +
- +#endif
- +
- /* Print ELEMENT, preceded by a space if something has already been
- printed. */
-
- @@ -250,10 +344,14 @@ main (int argc, char **argv)
- if (toprint & PRINT_PROCESSOR)
- {
- char const *element = unknown;
- -#if HAVE_SYSINFO && defined SI_ARCHITECTURE
- +#if ( HAVE_SYSINFO && defined SI_ARCHITECTURE ) || defined(USE_PROCINFO)
- {
- static char processor[257];
- +#if defined(USE_PROCINFO)
- + if (0 <= __linux_procinfo (PROCINFO_PROCESSOR, processor, sizeof processor))
- +#else
- if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor))
- +#endif
- element = processor;
- }
- #endif
- @@ -306,9 +404,13 @@ main (int argc, char **argv)
- if (element == unknown)
- {
- static char hardware_platform[257];
- +#if defined(USE_PROCINFO)
- + if (0 <= __linux_procinfo (PROCINFO_HARDWARE_PLATFORM, hardware_platform, sizeof hardware_platform))
- +#else
- size_t s = sizeof hardware_platform;
- static int mib[] = { CTL_HW, UNAME_HARDWARE_PLATFORM };
- if (sysctl (mib, 2, hardware_platform, &s, 0, 0) >= 0)
- +#endif
- element = hardware_platform;
- }
- #endif
|