Annotation of /trunk/coreutils/patches-6.12/coreutils-5.3.0-uname.patch
Parent Directory | Revision Log
Revision 701 -
(hide annotations)
(download)
Mon Oct 13 19:44:35 2008 UTC (15 years, 11 months ago) by niro
File size: 3319 byte(s)
Mon Oct 13 19:44:35 2008 UTC (15 years, 11 months ago) by niro
File size: 3319 byte(s)
-patchset for 6.12
1 | niro | 701 | On linux platforms, grok /proc/cpuinfo for the CPU/vendor info. |
2 | |||
3 | Prob not suitable for upstream seeing as how it's 100% linux-specific | ||
4 | |||
5 | Patch originally by Carlos E. Gorges <carlos@techlinux.com.br>, but | ||
6 | heavily reworked to suck less. | ||
7 | |||
8 | --- coreutils/src/uname.c | ||
9 | +++ coreutils/src/uname.c | ||
10 | @@ -44,6 +44,11 @@ | ||
11 | # include <mach-o/arch.h> | ||
12 | #endif | ||
13 | |||
14 | +#if defined (__linux__) | ||
15 | +# define USE_PROCINFO | ||
16 | +# define UNAME_HARDWARE_PLATFORM | ||
17 | +#endif | ||
18 | + | ||
19 | #include "system.h" | ||
20 | #include "error.h" | ||
21 | #include "quote.h" | ||
22 | @@ -129,6 +134,84 @@ | ||
23 | exit (status); | ||
24 | } | ||
25 | |||
26 | +#if defined(USE_PROCINFO) | ||
27 | + | ||
28 | +# if defined(__s390__) || defined(__s390x__) | ||
29 | +# define CPUINFO_FILE "/proc/sysinfo" | ||
30 | +# define CPUINFO_FORMAT "%[^\t :]%*[ :]%[^\n]\n" | ||
31 | +# else | ||
32 | +# define CPUINFO_FILE "/proc/cpuinfo" | ||
33 | +# define CPUINFO_FORMAT "%[^\t:]\t:%[^\n]\n" | ||
34 | +# endif | ||
35 | + | ||
36 | +# define PROCINFO_ARCHITECTURE 0 | ||
37 | +# define PROCINFO_HARDWARE_PLATFORM 1 | ||
38 | + | ||
39 | +static void __eat_trailing_space(char *buf) | ||
40 | +{ | ||
41 | + char *tmp = buf + strlen(buf) - 1; | ||
42 | + while (tmp > buf && isspace(*tmp)) | ||
43 | + *tmp-- = '\0'; | ||
44 | +} | ||
45 | + | ||
46 | +static int __linux_procinfo (int x, char *fstr) | ||
47 | +{ | ||
48 | + FILE *fp; | ||
49 | + | ||
50 | + char *procinfo_keys[] = { | ||
51 | + #if defined(__i386__) || defined(__x86_64__) | ||
52 | + "model name", "vendor_id" | ||
53 | + #elif defined(__ia64__) | ||
54 | + "model", "vendor" | ||
55 | + #elif defined(__alpha__) | ||
56 | + "cpu model", "system type" | ||
57 | + #elif defined(sparc) || defined(__sparc__) | ||
58 | + "type", "cpu" | ||
59 | + #elif defined(__hppa__) | ||
60 | + "cpu", "model" | ||
61 | + #elif defined(__mips__) | ||
62 | + "cpu model", "system type" | ||
63 | + #elif defined(__powerpc__) || defined(__powerpc64__) | ||
64 | + "cpu", "machine" | ||
65 | + #elif defined(__arm__) | ||
66 | + "Processor", "Hardware" | ||
67 | + #elif defined(__s390__) || defined(__s390x__) | ||
68 | + "Type", "Manufacturer" | ||
69 | + #elif defined(__sh__) | ||
70 | + "cpu family", "Machine" | ||
71 | + #elif defined(__m68k__) | ||
72 | + "CPU", "MMU" | ||
73 | + #elif defined(__cris__) | ||
74 | + "cpu", "cpu model" | ||
75 | + #else | ||
76 | + "???", "???" | ||
77 | + #endif | ||
78 | + }; | ||
79 | + | ||
80 | + if ((fp = fopen(CPUINFO_FILE, "r")) != NULL) { | ||
81 | + char key[64], value[257], *ret = NULL; | ||
82 | + | ||
83 | + while (fscanf(fp, CPUINFO_FORMAT, key, value) != EOF) { | ||
84 | + __eat_trailing_space(key); | ||
85 | + if (!strcmp(key, procinfo_keys[x])) { | ||
86 | + __eat_trailing_space(value); | ||
87 | + ret = value + (isblank(*value) ? 1 : 0); | ||
88 | + break; | ||
89 | + } | ||
90 | + } | ||
91 | + fclose(fp); | ||
92 | + | ||
93 | + if (ret) { | ||
94 | + strncpy(fstr, ret, 257); | ||
95 | + return 0; | ||
96 | + } | ||
97 | + } | ||
98 | + | ||
99 | + return -1; | ||
100 | +} | ||
101 | + | ||
102 | +#endif | ||
103 | + | ||
104 | /* Print ELEMENT, preceded by a space if something has already been | ||
105 | printed. */ | ||
106 | |||
107 | @@ -243,10 +328,14 @@ | ||
108 | if (toprint & PRINT_PROCESSOR) | ||
109 | { | ||
110 | char const *element = unknown; | ||
111 | -#if HAVE_SYSINFO && defined SI_ARCHITECTURE | ||
112 | +#if ( HAVE_SYSINFO && defined SI_ARCHITECTURE ) || defined(USE_PROCINFO) | ||
113 | { | ||
114 | static char processor[257]; | ||
115 | +#if defined(USE_PROCINFO) | ||
116 | + if (0 <= __linux_procinfo (PROCINFO_ARCHITECTURE, processor)) | ||
117 | +#else | ||
118 | if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor)) | ||
119 | +#endif | ||
120 | element = processor; | ||
121 | } | ||
122 | #endif | ||
123 | @@ -278,9 +369,13 @@ | ||
124 | if (element == unknown) | ||
125 | { | ||
126 | static char hardware_platform[257]; | ||
127 | +#if defined(USE_PROCINFO) | ||
128 | + if (0 <= __linux_procinfo (PROCINFO_HARDWARE_PLATFORM, hardware_platform)) | ||
129 | +#else | ||
130 | size_t s = sizeof hardware_platform; | ||
131 | static int mib[] = { CTL_HW, UNAME_HARDWARE_PLATFORM }; | ||
132 | if (sysctl (mib, 2, hardware_platform, &s, 0, 0) >= 0) | ||
133 | +#endif | ||
134 | element = hardware_platform; | ||
135 | } | ||
136 | #endif |