summary refs log tree commit diff
path: root/pkgs/tools/misc/coreutils/fix-arm64-macos.patch
blob: d8880b23dcbfc91f6f81419fc301e43456232bd4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
diff --git a/src/uname.c b/src/uname.c
index ae9b8e29d..e84fc477a 100644
--- a/src/uname.c
+++ b/src/uname.c
@@ -27,7 +27,7 @@
 # include <sys/systeminfo.h>
 #endif
 
-#if HAVE_SYS_SYSCTL_H && ! defined __GLIBC__
+#if HAVE_SYS_SYSCTL_H && ! defined __GLIBC__ && ! defined __APPLE__
 # if HAVE_SYS_PARAM_H
 #  include <sys/param.h> /* needed for OpenBSD 3.0 */
 # endif
@@ -44,11 +44,6 @@
 # endif
 #endif
 
-#ifdef __APPLE__
-# include <mach/machine.h>
-# include <mach-o/arch.h>
-#endif
-
 #include "system.h"
 #include "die.h"
 #include "error.h"
@@ -167,6 +162,24 @@ print_element (char const *element)
   fputs (element, stdout);
 }
 
+/* Print ELEMENT, preceded by a space if something has already been
+   printed.  But if the environment variable ENVVAR is set, print its
+   value instead of ELEMENT.  */
+
+static void
+print_element_env (char const *element, char const *envvar)
+{
+#ifdef __APPLE__
+  if (envvar)
+    {
+      char const *val = getenv (envvar);
+      if (val)
+        element = val;
+    }
+#endif
+  print_element (element);
+}
+
 
 /* Set all the option flags according to the switches specified.
    Return the mask indicating which elements to print.  */
@@ -287,26 +300,36 @@ main (int argc, char **argv)
         die (EXIT_FAILURE, errno, _("cannot get system name"));
 
       if (toprint & PRINT_KERNEL_NAME)
-        print_element (name.sysname);
+        print_element_env (name.sysname, "UNAME_SYSNAME");
       if (toprint & PRINT_NODENAME)
-        print_element (name.nodename);
+        print_element_env (name.nodename, "UNAME_NODENAME");
       if (toprint & PRINT_KERNEL_RELEASE)
-        print_element (name.release);
+        print_element_env (name.release, "UNAME_RELEASE");
       if (toprint & PRINT_KERNEL_VERSION)
-        print_element (name.version);
+        print_element_env (name.version, "UNAME_VERSION");
       if (toprint & PRINT_MACHINE)
-        print_element (name.machine);
+        print_element_env (name.machine, "UNAME_MACHINE");
     }
 
   if (toprint & PRINT_PROCESSOR)
     {
       char const *element = unknown;
+#ifdef __APPLE__
+# if defined __arm__ || defined __arm64__
+      element = "arm";
+# elif defined __i386__ || defined __x86_64__
+      element = "i386";
+# elif defined __ppc__ || defined __ppc64__
+      element = "powerpc";
+# endif
+#endif
 #if HAVE_SYSINFO && defined SI_ARCHITECTURE
-      {
-        static char processor[257];
-        if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor))
-          element = processor;
-      }
+      if (element == unknown)
+        {
+          static char processor[257];
+          if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor))
+            element = processor;
+        }
 #endif
 #ifdef UNAME_PROCESSOR
       if (element == unknown)
@@ -316,26 +339,6 @@ main (int argc, char **argv)
           static int mib[] = { CTL_HW, UNAME_PROCESSOR };
           if (sysctl (mib, 2, processor, &s, 0, 0) >= 0)
             element = processor;
-
-# ifdef __APPLE__
-          /* This kludge works around a bug in Mac OS X.  */
-          if (element == unknown)
-            {
-              cpu_type_t cputype;
-              size_t cs = sizeof cputype;
-              NXArchInfo const *ai;
-              if (sysctlbyname ("hw.cputype", &cputype, &cs, NULL, 0) == 0
-                  && (ai = NXGetArchInfoFromCpuType (cputype,
-                                                     CPU_SUBTYPE_MULTIPLE))
-                  != NULL)
-                element = ai->name;
-
-              /* Hack "safely" around the ppc vs. powerpc return value. */
-              if (cputype == CPU_TYPE_POWERPC
-                  && STRNCMP_LIT (element, "ppc") == 0)
-                element = "powerpc";
-            }
-# endif
         }
 #endif
       if (! (toprint == UINT_MAX && element == unknown))