]> git.saurik.com Git - apple/shell_cmds.git/blobdiff - uname/uname.c
shell_cmds-207.11.1.tar.gz
[apple/shell_cmds.git] / uname / uname.c
index 72a617860628331409d7f19f2d1b2644b12e0fa5..7dadd5296e52a206acac1e8f3e671812b120d2df 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: uname.c,v 1.9 1997/10/20 02:16:39 lukem Exp $  */
+/*     $NetBSD: uname.c,v 1.10 1998/11/09 13:24:05 kleink Exp $        */
 
 /*
  * Copyright (c) 1994 Winning Strategies, Inc.
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: uname.c,v 1.9 1997/10/20 02:16:39 lukem Exp $");
+__RCSID("$NetBSD: uname.c,v 1.10 1998/11/09 13:24:05 kleink Exp $");
 #endif /* not lint */
 
+#include <sys/param.h>
+#include <limits.h>
+#include <locale.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
-#include <locale.h>
 #include <unistd.h>
-#include <sys/utsname.h>
 #include <err.h>
+#ifdef __APPLE__
+#include <string.h>
+#endif /* __APPLE__ */
+
+#include <sys/sysctl.h>
+#include <sys/utsname.h>
+
+#ifdef __APPLE__
+#include <get_compat.h>
+#else  /* !__APPLE__ */
+#define COMPAT_MODE(a,b) (1)
+#endif /* __APPLE__ */
 
 int    main __P((int, char **));
 static void usage __P((void));
 
-#define        PRINT_SYSNAME   0x01
-#define        PRINT_NODENAME  0x02
-#define        PRINT_RELEASE   0x04
-#define        PRINT_VERSION   0x08
-#define        PRINT_MACHINE   0x10
-#define        PRINT_PROCESSOR 0x20
-#define        PRINT_ALL       0x3f
+/* Note that PRINT_MACHINE_ARCH is excluded from PRINT_ALL! */
+#define        PRINT_SYSNAME           0x01
+#define        PRINT_NODENAME          0x02
+#define        PRINT_RELEASE           0x04
+#define        PRINT_VERSION           0x08
+#define        PRINT_MACHINE           0x10
+#define        PRINT_MACHINE_ARCH      0x20
+#define        PRINT_ALL               \
+    (PRINT_SYSNAME|PRINT_NODENAME|PRINT_RELEASE|PRINT_VERSION|PRINT_MACHINE)
 
 int
 main(argc, argv) 
@@ -61,16 +75,24 @@ main(argc, argv)
        char **argv;
 {
        struct utsname u;
+#ifndef __APPLE__
+       char machine_arch[SYS_NMLN];
+#endif /* !__APPLE__ */
        int c;
        int space = 0;
        int print_mask = 0;
 
-       setlocale(LC_ALL, "");
+       (void)setlocale(LC_ALL, "");
 
-       while ((c = getopt(argc,argv,"amnprsv")) != -1 ) {
-               switch ( c ) {
+       while ((c = getopt(argc,argv,"amnprsv")) != -1) {
+               switch (c) {
                case 'a':
                        print_mask |= PRINT_ALL;
+#ifdef __APPLE__
+                       if (!COMPAT_MODE("bin/uname", "Unix2003")) {
+                               print_mask |= PRINT_MACHINE_ARCH;
+                       }
+#endif /* __APPLE__ */
                        break;
                case 'm':
                        print_mask |= PRINT_MACHINE;
@@ -78,8 +100,8 @@ main(argc, argv)
                case 'n':
                        print_mask |= PRINT_NODENAME;
                        break;
-               case 'p': 
-                       print_mask |= PRINT_PROCESSOR;
+               case 'p':
+                       print_mask |= PRINT_MACHINE_ARCH;
                        break;
                case 'r': 
                        print_mask |= PRINT_RELEASE;
@@ -105,11 +127,22 @@ main(argc, argv)
                print_mask = PRINT_SYSNAME;
        }
 
-       if (uname(&u)) {
-               err(1, "uname");
+       if (uname(&u) != 0) {
+               err(EXIT_FAILURE, "uname");
                /* NOTREACHED */
        }
+#ifndef __APPLE__
+       if (print_mask & PRINT_MACHINE_ARCH) {
+               int mib[2] = { CTL_HW, HW_MACHINE_ARCH };
+               size_t len = sizeof (machine_arch);
 
+               if (sysctl(mib, sizeof (mib) / sizeof (mib[0]), machine_arch,
+                   &len, NULL, 0) < 0)
+                       err(EXIT_FAILURE, "sysctl");
+       }
+#endif /* !__APPLE__ */
+
+#ifdef __APPLE__
        /*
         * Let's allow the user to override the output of uname via the shell environment.
         * This is a useful feature for cross-compiling (eg. during an OS bringup).
@@ -123,6 +156,7 @@ main(argc, argv)
                s = getenv ("UNAME_VERSION");  if (s) strncpy (u.version,  s, sizeof (u.version));
                s = getenv ("UNAME_MACHINE");  if (s) strncpy (u.machine,  s, sizeof (u.machine));
        }
+#endif /* __APPLE__ */
 
        if (print_mask & PRINT_SYSNAME) {
                space++;
@@ -144,19 +178,25 @@ main(argc, argv)
                if (space++) putchar(' ');
                fputs(u.machine, stdout);
        }
-       if (print_mask & PRINT_PROCESSOR) {
+       if (print_mask & PRINT_MACHINE_ARCH) {
                if (space++) putchar(' ');
-#if   defined(__ppc__)
+#ifndef __APPLE__
+               fputs(machine_arch, stdout);
+#else
+#if defined(__ppc__) || defined(__ppc64__)
                fputs("powerpc", stdout);
-#elif defined(__i386__)
+#elif defined(__i386__) || defined(__x86_64__)
                fputs("i386", stdout);
+#elif defined(__arm__) || defined(__arm64__)
+               fputs("arm", stdout);
 #else
                fputs("unknown", stdout);
 #endif
+#endif /* __APPLE__ */
        }
        putchar('\n');
 
-       exit(0);
+       exit(EXIT_SUCCESS);
        /* NOTREACHED */
 }
 
@@ -164,5 +204,5 @@ static void
 usage()
 {
        fprintf(stderr, "usage: uname [-amnprsv]\n");
-       exit(1);
+       exit(EXIT_FAILURE);
 }