<del> 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)) </del>