source: patches/coreutils-8.19-uname-1.patch @ 68a11fb

clfs-2.1clfs-3.0.0-systemdclfs-3.0.0-sysvinitsystemdsysvinit
Last change on this file since 68a11fb was 68a11fb, checked in by William Harrington <kb0iic@…>, 12 years ago

Rediffed coreutils uname patch.

  • Property mode set to 100644
File size: 14.9 KB
RevLine 
[de4abd5]1Submitted By: Jim Gifford <jim at cross-lfs dot org>
2Date: 2010-07-26
3Initial Package Version: 5.97
4Upstream Status: Not Accepted
5Origin: Gentoo - http://sources.gentoo.org/viewcvs.py/gentoo/src/patchsets/coreutils
6Description: Display CPU Information from /proc/cpuinfo or /proc/sysinfo
7
8Rediffed for 7.1 by Jim Gifford
9Rediffed for 7.5 by Jim Gifford
10Rediffed for 8.4 by Joe Ciccone
11Rediffed for 8.9 by Joe Ciccone
12Rediffed for 8.16 by Jonathan Norman - 2012-06-10
[68a11fb]13Rediffed for 8.19 by William Harrington - 2012-08-27
[de4abd5]14
[68a11fb]15diff -Naur coreutils-8.19.orig/src/uname.c coreutils-8.19/src/uname.c
16--- coreutils-8.19.orig/src/uname.c     2012-07-21 14:54:31.000000000 +0000
17+++ coreutils-8.19/src/uname.c  2012-08-27 21:20:07.103876901 +0000
[de4abd5]18@@ -49,6 +49,11 @@
19 # include <mach-o/arch.h>
20 #endif
21 
22+#if defined (__linux__)
23+# define USE_PROCINFO
24+# define UNAME_HARDWARE_PLATFORM
25+#endif
26+
27 #include "system.h"
28 #include "error.h"
29 #include "quote.h"
30@@ -153,6 +158,117 @@
31   exit (status);
32 }
33 
34+#if defined(USE_PROCINFO)
35+
36+# if defined(__s390__) || defined(__s390x__)
37+#  define CPUINFO_FILE    "/proc/sysinfo"
38+#  define CPUINFO_FORMAT  "%64[^\t :]%*[ :]%256[^\n]%c"
39+# else
40+#  define CPUINFO_FILE    "/proc/cpuinfo"
41+#  define CPUINFO_FORMAT  "%64[^\t:]\t:%256[^\n]%c"
42+# endif
43+
44+# define PROCINFO_PROCESSOR      0
45+# define PROCINFO_HARDWARE_PLATFORM 1
46+
47+static void __eat_cpuinfo_space(char *buf)
48+{
49+       /* first eat trailing space */
50+       char *tmp = buf + strlen(buf) - 1;
51+       while (tmp > buf && isspace(*tmp))
52+               *tmp-- = '\0';
53+       /* then eat leading space */
54+       tmp = buf;
55+       while (*tmp && isspace(*tmp))
56+               tmp++;
57+       if (tmp != buf)
58+               memmove(buf, tmp, strlen(tmp)+1);
59+       /* finally collapse whitespace */
60+       tmp = buf;
61+       while (tmp[0] && tmp[1]) {
62+               if (isspace(tmp[0]) && isspace(tmp[1])) {
63+                       memmove(tmp, tmp+1, strlen(tmp));
64+                       continue;
65+               }
66+               ++tmp;
67+       }
68+}
69+
70+static int __linux_procinfo (int x, char *fstr, size_t s)
71+{
72+       FILE *fp;
73+
74+       char *procinfo_keys[] = {
75+               /* --processor --hardware-platform */
76+               #if defined(__alpha__)
77+                       "cpu model", "system type"
78+               #elif defined(__arm__)
79+                       "Processor", "Hardware"
80+               #elif defined(__avr32__)
81+                       "processor", "cpu family"
82+               #elif defined(__bfin__)
83+                       "CPU", "BOARD Name"
84+               #elif defined(__cris__)
85+                       "cpu", "cpu model"
86+               #elif defined(__frv__)
87+                       "CPU-Core", "System"
88+               #elif defined(__i386__) || defined(__x86_64__)
89+                       "model name", "vendor_id"
90+               #elif defined(__ia64__)
91+                       "family", "vendor"
92+               #elif defined(__hppa__)
93+                       "cpu", "model"
94+               #elif defined(__m68k__)
95+                       "CPU", "MMU"
96+               #elif defined(__mips__)
97+                       "cpu model", "system type"
98+               #elif defined(__powerpc__) || defined(__powerpc64__)
99+                       "cpu", "machine"
100+               #elif defined(__s390__) || defined(__s390x__)
101+                       "Type", "Manufacturer"
102+               #elif defined(__sh__)
103+                       "cpu type", "machine"
104+               #elif defined(sparc) || defined(__sparc__)
105+                       "type", "cpu"
106+               #elif defined(__vax__)
107+                       "cpu type", "cpu"
108+               #else
109+                       "unknown", "unknown"
110+               #endif
111+       };
112+
113+       if ((fp = fopen(CPUINFO_FILE, "r")) != NULL) {
114+               char key[65], value[257], eol, *ret = NULL;
115+
116+               while (fscanf(fp, CPUINFO_FORMAT, key, value, &eol) != EOF) {
117+                       __eat_cpuinfo_space(key);
118+                       if (!strcmp(key, procinfo_keys[x])) {
119+                               __eat_cpuinfo_space(value);
120+                               ret = value;
121+                               break;
122+                       }
123+                       if (eol != '\n') {
124+                               /* we need two fscanf's here in case the previous
125+                                * length limit caused us to read right up to the
126+                                * newline ... doing "%*[^\n]\n" wont eat the newline
127+                                */
128+                               fscanf(fp, "%*[^\n]");
129+                               fscanf(fp, "\n");
130+                       }
131+               }
132+               fclose(fp);
133+
134+               if (ret) {
135+                       strncpy(fstr, ret, s);
136+                       return 0;
137+               }
138+       }
139+
140+       return -1;
141+}
142+
143+#endif
144+
145 /* Print ELEMENT, preceded by a space if something has already been
146    printed.  */
147 
148@@ -300,10 +416,14 @@
149   if (toprint & PRINT_PROCESSOR)
150     {
151       char const *element = unknown;
152-#if HAVE_SYSINFO && defined SI_ARCHITECTURE
153+#if ( HAVE_SYSINFO && defined SI_ARCHITECTURE ) || defined(USE_PROCINFO)
154       {
155         static char processor[257];
156+#if defined(USE_PROCINFO)
157+        if (0 <= __linux_procinfo (PROCINFO_PROCESSOR, processor, sizeof processor))
158+#else
159         if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor))
160+#endif
161           element = processor;
162       }
163 #endif
164@@ -356,9 +476,13 @@
165       if (element == unknown)
166         {
167           static char hardware_platform[257];
168+#if defined(USE_PROCINFO)
169+        if (0 <= __linux_procinfo (PROCINFO_HARDWARE_PLATFORM, hardware_platform, sizeof hardware_platform))
170+#else
171           size_t s = sizeof hardware_platform;
172           static int mib[] = { CTL_HW, UNAME_HARDWARE_PLATFORM };
173           if (sysctl (mib, 2, hardware_platform, &s, 0, 0) >= 0)
174+#endif
175             element = hardware_platform;
176         }
177 #endif
[68a11fb]178diff -Naur coreutils-8.19.orig/src/uname.c.orig coreutils-8.19/src/uname.c.orig
179--- coreutils-8.19.orig/src/uname.c.orig        1970-01-01 00:00:00.000000000 +0000
180+++ coreutils-8.19/src/uname.c.orig     2012-08-27 21:20:07.103876901 +0000
[de4abd5]181@@ -0,0 +1,375 @@
182+/* uname -- print system information
183+
184+   Copyright (C) 1989-2012 Free Software Foundation, Inc.
185+
186+   This program is free software: you can redistribute it and/or modify
187+   it under the terms of the GNU General Public License as published by
188+   the Free Software Foundation, either version 3 of the License, or
189+   (at your option) any later version.
190+
191+   This program is distributed in the hope that it will be useful,
192+   but WITHOUT ANY WARRANTY; without even the implied warranty of
193+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
194+   GNU General Public License for more details.
195+
196+   You should have received a copy of the GNU General Public License
197+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
198+
199+/* Written by David MacKenzie <djm@gnu.ai.mit.edu> */
200+
201+#include <config.h>
202+#include <stdio.h>
203+#include <sys/types.h>
204+#include <sys/utsname.h>
205+#include <getopt.h>
206+
207+#if HAVE_SYSINFO && HAVE_SYS_SYSTEMINFO_H
208+# include <sys/systeminfo.h>
209+#endif
210+
211+#if HAVE_SYS_SYSCTL_H
212+# if HAVE_SYS_PARAM_H
213+#  include <sys/param.h> /* needed for OpenBSD 3.0 */
214+# endif
215+# include <sys/sysctl.h>
216+# ifdef HW_MODEL
217+#  ifdef HW_MACHINE_ARCH
218+/* E.g., FreeBSD 4.5, NetBSD 1.5.2 */
219+#   define UNAME_HARDWARE_PLATFORM HW_MODEL
220+#   define UNAME_PROCESSOR HW_MACHINE_ARCH
221+#  else
222+/* E.g., OpenBSD 3.0 */
223+#   define UNAME_PROCESSOR HW_MODEL
224+#  endif
225+# endif
226+#endif
227+
228+#ifdef __APPLE__
229+# include <mach/machine.h>
230+# include <mach-o/arch.h>
231+#endif
232+
233+#include "system.h"
234+#include "error.h"
235+#include "quote.h"
236+#include "uname.h"
237+
238+/* The official name of this program (e.g., no 'g' prefix).  */
239+#define PROGRAM_NAME (uname_mode == UNAME_UNAME ? "uname" : "arch")
240+
241+#define AUTHORS proper_name ("David MacKenzie")
242+#define ARCH_AUTHORS "David MacKenzie", "Karel Zak"
243+
244+/* Values that are bitwise or'd into 'toprint'. */
245+/* Kernel name. */
246+#define PRINT_KERNEL_NAME 1
247+
248+/* Node name on a communications network. */
249+#define PRINT_NODENAME 2
250+
251+/* Kernel release. */
252+#define PRINT_KERNEL_RELEASE 4
253+
254+/* Kernel version. */
255+#define PRINT_KERNEL_VERSION 8
256+
257+/* Machine hardware name. */
258+#define PRINT_MACHINE 16
259+
260+/* Processor type. */
261+#define PRINT_PROCESSOR 32
262+
263+/* Hardware platform.  */
264+#define PRINT_HARDWARE_PLATFORM 64
265+
266+/* Operating system.  */
267+#define PRINT_OPERATING_SYSTEM 128
268+
269+static struct option const uname_long_options[] =
270+{
271+  {"all", no_argument, NULL, 'a'},
272+  {"kernel-name", no_argument, NULL, 's'},
273+  {"sysname", no_argument, NULL, 's'}, /* Obsolescent.  */
274+  {"nodename", no_argument, NULL, 'n'},
275+  {"kernel-release", no_argument, NULL, 'r'},
276+  {"release", no_argument, NULL, 'r'},  /* Obsolescent.  */
277+  {"kernel-version", no_argument, NULL, 'v'},
278+  {"machine", no_argument, NULL, 'm'},
279+  {"processor", no_argument, NULL, 'p'},
280+  {"hardware-platform", no_argument, NULL, 'i'},
281+  {"operating-system", no_argument, NULL, 'o'},
282+  {GETOPT_HELP_OPTION_DECL},
283+  {GETOPT_VERSION_OPTION_DECL},
284+  {NULL, 0, NULL, 0}
285+};
286+
287+static struct option const arch_long_options[] =
288+{
289+  {GETOPT_HELP_OPTION_DECL},
290+  {GETOPT_VERSION_OPTION_DECL},
291+  {NULL, 0, NULL, 0}
292+};
293+
294+void
295+usage (int status)
296+{
297+  if (status != EXIT_SUCCESS)
298+    emit_try_help ();
299+  else
300+    {
301+      printf (_("Usage: %s [OPTION]...\n"), program_name);
302+
303+      if (uname_mode == UNAME_UNAME)
304+        {
305+          fputs (_("\
306+Print certain system information.  With no OPTION, same as -s.\n\
307+\n\
308+  -a, --all                print all information, in the following order,\n\
309+                             except omit -p and -i if unknown:\n\
310+  -s, --kernel-name        print the kernel name\n\
311+  -n, --nodename           print the network node hostname\n\
312+  -r, --kernel-release     print the kernel release\n\
313+"), stdout);
314+          fputs (_("\
315+  -v, --kernel-version     print the kernel version\n\
316+  -m, --machine            print the machine hardware name\n\
317+  -p, --processor          print the processor type or \"unknown\"\n\
318+  -i, --hardware-platform  print the hardware platform or \"unknown\"\n\
319+  -o, --operating-system   print the operating system\n\
320+"), stdout);
321+        }
322+      else
323+        {
324+          fputs (_("\
325+Print machine architecture.\n\
326+\n\
327+"), stdout);
328+        }
329+
330+      fputs (HELP_OPTION_DESCRIPTION, stdout);
331+      fputs (VERSION_OPTION_DESCRIPTION, stdout);
332+      emit_ancillary_info ();
333+    }
334+  exit (status);
335+}
336+
337+/* Print ELEMENT, preceded by a space if something has already been
338+   printed.  */
339+
340+static void
341+print_element (char const *element)
342+{
343+  static bool printed;
344+  if (printed)
345+    putchar (' ');
346+  printed = true;
347+  fputs (element, stdout);
348+}
349+
350+
351+/* Set all the option flags according to the switches specified.
352+   Return the mask indicating which elements to print.  */
353+
354+static int
355+decode_switches (int argc, char **argv)
356+{
357+  int c;
358+  unsigned int toprint = 0;
359+
360+  if (uname_mode == UNAME_ARCH)
361+    {
362+      while ((c = getopt_long (argc, argv, "",
363+                               arch_long_options, NULL)) != -1)
364+        {
365+          switch (c)
366+            {
367+            case_GETOPT_HELP_CHAR;
368+
369+            case_GETOPT_VERSION_CHAR (PROGRAM_NAME, ARCH_AUTHORS);
370+
371+            default:
372+              usage (EXIT_FAILURE);
373+            }
374+        }
375+      toprint = PRINT_MACHINE;
376+    }
377+  else
378+    {
379+      while ((c = getopt_long (argc, argv, "asnrvmpio",
380+                               uname_long_options, NULL)) != -1)
381+        {
382+          switch (c)
383+            {
384+            case 'a':
385+              toprint = UINT_MAX;
386+              break;
387+
388+            case 's':
389+              toprint |= PRINT_KERNEL_NAME;
390+              break;
391+
392+            case 'n':
393+              toprint |= PRINT_NODENAME;
394+              break;
395+
396+            case 'r':
397+              toprint |= PRINT_KERNEL_RELEASE;
398+              break;
399+
400+            case 'v':
401+              toprint |= PRINT_KERNEL_VERSION;
402+              break;
403+
404+            case 'm':
405+              toprint |= PRINT_MACHINE;
406+              break;
407+
408+            case 'p':
409+              toprint |= PRINT_PROCESSOR;
410+              break;
411+
412+            case 'i':
413+              toprint |= PRINT_HARDWARE_PLATFORM;
414+              break;
415+
416+            case 'o':
417+              toprint |= PRINT_OPERATING_SYSTEM;
418+              break;
419+
420+            case_GETOPT_HELP_CHAR;
421+
422+            case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
423+
424+            default:
425+              usage (EXIT_FAILURE);
426+            }
427+        }
428+    }
429+
430+  if (argc != optind)
431+    {
432+      error (0, 0, _("extra operand %s"), quote (argv[optind]));
433+      usage (EXIT_FAILURE);
434+    }
435+
436+  return toprint;
437+}
438+
439+int
440+main (int argc, char **argv)
441+{
442+  static char const unknown[] = "unknown";
443+
444+  /* Mask indicating which elements to print. */
445+  unsigned int toprint = 0;
446+
447+  initialize_main (&argc, &argv);
448+  set_program_name (argv[0]);
449+  setlocale (LC_ALL, "");
450+  bindtextdomain (PACKAGE, LOCALEDIR);
451+  textdomain (PACKAGE);
452+
453+  atexit (close_stdout);
454+
455+  toprint = decode_switches (argc, argv);
456+
457+  if (toprint == 0)
458+    toprint = PRINT_KERNEL_NAME;
459+
460+  if (toprint
461+       & (PRINT_KERNEL_NAME | PRINT_NODENAME | PRINT_KERNEL_RELEASE
462+          | PRINT_KERNEL_VERSION | PRINT_MACHINE))
463+    {
464+      struct utsname name;
465+
466+      if (uname (&name) == -1)
467+        error (EXIT_FAILURE, errno, _("cannot get system name"));
468+
469+      if (toprint & PRINT_KERNEL_NAME)
470+        print_element (name.sysname);
471+      if (toprint & PRINT_NODENAME)
472+        print_element (name.nodename);
473+      if (toprint & PRINT_KERNEL_RELEASE)
474+        print_element (name.release);
475+      if (toprint & PRINT_KERNEL_VERSION)
476+        print_element (name.version);
477+      if (toprint & PRINT_MACHINE)
478+        print_element (name.machine);
479+    }
480+
481+  if (toprint & PRINT_PROCESSOR)
482+    {
483+      char const *element = unknown;
484+#if HAVE_SYSINFO && defined SI_ARCHITECTURE
485+      {
486+        static char processor[257];
487+        if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor))
488+          element = processor;
489+      }
490+#endif
491+#ifdef UNAME_PROCESSOR
492+      if (element == unknown)
493+        {
494+          static char processor[257];
495+          size_t s = sizeof processor;
496+          static int mib[] = { CTL_HW, UNAME_PROCESSOR };
497+          if (sysctl (mib, 2, processor, &s, 0, 0) >= 0)
498+            element = processor;
499+
500+# ifdef __APPLE__
501+          /* This kludge works around a bug in Mac OS X.  */
502+          if (element == unknown)
503+            {
504+              cpu_type_t cputype;
505+              size_t s = sizeof cputype;
506+              NXArchInfo const *ai;
507+              if (sysctlbyname ("hw.cputype", &cputype, &s, NULL, 0) == 0
508+                  && (ai = NXGetArchInfoFromCpuType (cputype,
509+                                                     CPU_SUBTYPE_MULTIPLE))
510+                  != NULL)
511+                element = ai->name;
512+
513+              /* Hack "safely" around the ppc vs. powerpc return value. */
514+              if (cputype == CPU_TYPE_POWERPC
515+                  && STRNCMP_LIT (element, "ppc") == 0)
516+                element = "powerpc";
517+            }
518+# endif
519+        }
520+#endif
521+      if (! (toprint == UINT_MAX && element == unknown))
522+        print_element (element);
523+    }
524+
525+  if (toprint & PRINT_HARDWARE_PLATFORM)
526+    {
527+      char const *element = unknown;
528+#if HAVE_SYSINFO && defined SI_PLATFORM
529+      {
530+        static char hardware_platform[257];
531+        if (0 <= sysinfo (SI_PLATFORM,
532+                          hardware_platform, sizeof hardware_platform))
533+          element = hardware_platform;
534+      }
535+#endif
536+#ifdef UNAME_HARDWARE_PLATFORM
537+      if (element == unknown)
538+        {
539+          static char hardware_platform[257];
540+          size_t s = sizeof hardware_platform;
541+          static int mib[] = { CTL_HW, UNAME_HARDWARE_PLATFORM };
542+          if (sysctl (mib, 2, hardware_platform, &s, 0, 0) >= 0)
543+            element = hardware_platform;
544+        }
545+#endif
546+      if (! (toprint == UINT_MAX && element == unknown))
547+        print_element (element);
548+    }
549+
550+  if (toprint & PRINT_OPERATING_SYSTEM)
551+    print_element (HOST_OPERATING_SYSTEM);
552+
553+  putchar ('\n');
554+
555+  exit (EXIT_SUCCESS);
556+}
Note: See TracBrowser for help on using the repository browser.