wok diff coreutils/stuff/uname.u @ rev 22539

updated bird (2.0.3 -> 2.0.7)
author Hans-G?nter Theisgen
date Fri Jan 03 16:08:36 2020 +0100 (2020-01-03)
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/coreutils/stuff/uname.u	Fri Jan 03 16:08:36 2020 +0100
     1.3 @@ -0,0 +1,173 @@
     1.4 +On linux platforms, grok /proc/cpuinfo for the CPU/vendor info.
     1.5 +
     1.6 +Prob not suitable for upstream seeing as how it's 100% linux-specific
     1.7 +http://lists.gnu.org/archive/html/bug-coreutils/2005-09/msg00063.html
     1.8 +
     1.9 +Patch originally by Carlos E. Gorges <carlos@techlinux.com.br>, but 
    1.10 +heavily reworked to suck less.
    1.11 +
    1.12 +To add support for additional platforms, check out the show_cpuinfo()
    1.13 +func in the linux/arch/<ARCH>/ source tree of the kernel.
    1.14 +
    1.15 +--- coreutils/src/uname.c
    1.16 ++++ coreutils/src/uname.c
    1.17 +@@ -50,6 +50,11 @@
    1.18 + # include <mach-o/arch.h>
    1.19 + #endif
    1.20 + 
    1.21 ++#if defined(__linux__)
    1.22 ++# define USE_PROCINFO
    1.23 ++# define UNAME_HARDWARE_PLATFORM
    1.24 ++#endif
    1.25 ++
    1.26 + #include "system.h"
    1.27 + #include "error.h"
    1.28 + #include "quote.h"
    1.29 +@@ -138,6 +143,117 @@
    1.30 +   exit (status);
    1.31 + }
    1.32 + 
    1.33 ++#if defined(USE_PROCINFO)
    1.34 ++
    1.35 ++# if defined(__s390__) || defined(__s390x__)
    1.36 ++#  define CPUINFO_FILE    "/proc/sysinfo"
    1.37 ++#  define CPUINFO_FORMAT  "%64[^\t :]%*[ :]%256[^\n]%c"
    1.38 ++# else
    1.39 ++#  define CPUINFO_FILE    "/proc/cpuinfo"
    1.40 ++#  define CPUINFO_FORMAT  "%64[^\t:]\t:%256[^\n]%c"
    1.41 ++# endif
    1.42 ++
    1.43 ++# define PROCINFO_PROCESSOR      0
    1.44 ++# define PROCINFO_HARDWARE_PLATFORM 1
    1.45 ++
    1.46 ++static void __eat_cpuinfo_space(char *buf)
    1.47 ++{
    1.48 ++	/* first eat trailing space */
    1.49 ++	char *tmp = buf + strlen(buf) - 1;
    1.50 ++	while (tmp > buf && isspace(*tmp))
    1.51 ++		*tmp-- = '\0';
    1.52 ++	/* then eat leading space */
    1.53 ++	tmp = buf;
    1.54 ++	while (*tmp && isspace(*tmp))
    1.55 ++		tmp++;
    1.56 ++	if (tmp != buf)
    1.57 ++		memmove(buf, tmp, strlen(tmp)+1);
    1.58 ++	/* finally collapse whitespace */
    1.59 ++	tmp = buf;
    1.60 ++	while (tmp[0] && tmp[1]) {
    1.61 ++		if (isspace(tmp[0]) && isspace(tmp[1])) {
    1.62 ++			memmove(tmp, tmp+1, strlen(tmp));
    1.63 ++			continue;
    1.64 ++		}
    1.65 ++		++tmp;
    1.66 ++	}
    1.67 ++}
    1.68 ++
    1.69 ++static int __linux_procinfo(int x, char *fstr, size_t s)
    1.70 ++{
    1.71 ++	FILE *fp;
    1.72 ++
    1.73 ++	char *procinfo_keys[] = {
    1.74 ++		/* --processor --hardware-platform */
    1.75 ++		#if defined(__alpha__)
    1.76 ++			"cpu model", "system type"
    1.77 ++		#elif defined(__arm__)
    1.78 ++			"Processor", "Hardware"
    1.79 ++		#elif defined(__avr32__)
    1.80 ++			"processor", "cpu family"
    1.81 ++		#elif defined(__bfin__)
    1.82 ++			"CPU", "BOARD Name"
    1.83 ++		#elif defined(__cris__)
    1.84 ++			"cpu", "cpu model"
    1.85 ++		#elif defined(__frv__)
    1.86 ++			"CPU-Core", "System"
    1.87 ++		#elif defined(__i386__) || defined(__x86_64__)
    1.88 ++			"model name", "vendor_id"
    1.89 ++		#elif defined(__ia64__)
    1.90 ++			"family", "vendor"
    1.91 ++		#elif defined(__hppa__)
    1.92 ++			"cpu", "model"
    1.93 ++		#elif defined(__m68k__)
    1.94 ++			"CPU", "MMU"
    1.95 ++		#elif defined(__mips__)
    1.96 ++			"cpu model", "system type"
    1.97 ++		#elif defined(__powerpc__) || defined(__powerpc64__)
    1.98 ++			"cpu", "machine"
    1.99 ++		#elif defined(__s390__) || defined(__s390x__)
   1.100 ++			"Type", "Manufacturer"
   1.101 ++		#elif defined(__sh__)
   1.102 ++			"cpu type", "machine"
   1.103 ++		#elif defined(sparc) || defined(__sparc__)
   1.104 ++			"type", "cpu"
   1.105 ++		#elif defined(__vax__)
   1.106 ++			"cpu type", "cpu"
   1.107 ++		#else
   1.108 ++			"unknown", "unknown"
   1.109 ++		#endif
   1.110 ++	};
   1.111 ++
   1.112 ++	if ((fp = fopen(CPUINFO_FILE, "r")) != NULL) {
   1.113 ++		char key[65], value[257], eol, *ret = NULL;
   1.114 ++
   1.115 ++		while (fscanf(fp, CPUINFO_FORMAT, key, value, &eol) != EOF) {
   1.116 ++			__eat_cpuinfo_space(key);
   1.117 ++			if (!strcmp(key, procinfo_keys[x])) {
   1.118 ++				__eat_cpuinfo_space(value);
   1.119 ++				ret = value;
   1.120 ++				break;
   1.121 ++			}
   1.122 ++			if (eol != '\n') {
   1.123 ++				/* we need two fscanf's here in case the previous
   1.124 ++				 * length limit caused us to read right up to the
   1.125 ++				 * newline ... doing "%*[^\n]\n" wont eat the newline
   1.126 ++				 */
   1.127 ++				fscanf(fp, "%*[^\n]");
   1.128 ++				fscanf(fp, "\n");
   1.129 ++			}
   1.130 ++		}
   1.131 ++		fclose(fp);
   1.132 ++
   1.133 ++		if (ret) {
   1.134 ++			strncpy(fstr, ret, s);
   1.135 ++			return 0;
   1.136 ++		}
   1.137 ++	}
   1.138 ++
   1.139 ++	return -1;
   1.140 ++}
   1.141 ++
   1.142 ++#endif
   1.143 ++
   1.144 + /* Print ELEMENT, preceded by a space if something has already been
   1.145 +    printed.  */
   1.146 + 
   1.147 +@@ -250,10 +344,14 @@ main (int argc, char **argv)
   1.148 +   if (toprint & PRINT_PROCESSOR)
   1.149 +     {
   1.150 +       char const *element = unknown;
   1.151 +-#if HAVE_SYSINFO && defined SI_ARCHITECTURE
   1.152 ++#if ( HAVE_SYSINFO && defined SI_ARCHITECTURE ) || defined(USE_PROCINFO)
   1.153 +       {
   1.154 +         static char processor[257];
   1.155 ++#if defined(USE_PROCINFO)
   1.156 ++        if (0 <= __linux_procinfo (PROCINFO_PROCESSOR, processor, sizeof processor))
   1.157 ++#else
   1.158 +         if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor))
   1.159 ++#endif
   1.160 +           element = processor;
   1.161 +       }
   1.162 + #endif
   1.163 +@@ -306,9 +404,13 @@ main (int argc, char **argv)
   1.164 +       if (element == unknown)
   1.165 +         {
   1.166 +           static char hardware_platform[257];
   1.167 ++#if defined(USE_PROCINFO)
   1.168 ++          if (0 <= __linux_procinfo (PROCINFO_HARDWARE_PLATFORM, hardware_platform, sizeof hardware_platform))
   1.169 ++#else
   1.170 +           size_t s = sizeof hardware_platform;
   1.171 +           static int mib[] = { CTL_HW, UNAME_HARDWARE_PLATFORM };
   1.172 +           if (sysctl (mib, 2, hardware_platform, &s, 0, 0) >= 0)
   1.173 ++#endif
   1.174 +             element = hardware_platform;
   1.175 +         }
   1.176 + #endif