diff options
-rw-r--r-- | coreutils/uname.c | 165 |
1 files changed, 96 insertions, 69 deletions
diff --git a/coreutils/uname.c b/coreutils/uname.c index 4d98fde25..9c6a06ebb 100644 --- a/coreutils/uname.c +++ b/coreutils/uname.c @@ -55,10 +55,20 @@ //config: help //config: Sets the operating system name reported by uname -o. The //config: default is "GNU/Linux". +//config: +//can't use "ARCH" for this applet, all hell breaks loose in build system :) +//config:config BBARCH +//config: bool "arch" +//config: default y +//config: help +//config: Same as uname -m. //applet:IF_UNAME(APPLET(uname, BB_DIR_BIN, BB_SUID_DROP)) +// APPLET_ODDNAME:name main location suid_type help +//applet:IF_BBARCH(APPLET_ODDNAME(arch, uname, BB_DIR_BIN, BB_SUID_DROP, arch)) -//kbuild:lib-$(CONFIG_UNAME) += uname.o +//kbuild:lib-$(CONFIG_UNAME) += uname.o +//kbuild:lib-$(CONFIG_BBARCH) += uname.o /* BB_AUDIT SUSv3 compliant */ /* http://www.opengroup.org/onlinepubs/007904975/utilities/uname.html */ @@ -81,6 +91,11 @@ //usage: "$ uname -a\n" //usage: "Linux debian 2.4.23 #2 Tue Dec 23 17:09:10 MST 2003 i686 GNU/Linux\n" +//usage:#define arch_trivial_usage +//usage: "" +//usage:#define arch_full_usage "\n\n" +//usage: "Print system architecture" + #include "libbb.h" /* After libbb.h, since it needs sys/types.h on some systems */ #include <sys/utsname.h> @@ -92,7 +107,8 @@ typedef struct { char os[sizeof(CONFIG_UNAME_OSNAME)]; } uname_info_t; -static const char options[] ALIGN1 = "snrvmpioa"; +#if ENABLE_UNAME +#define options "snrvmpioa" static const unsigned short utsname_offset[] = { offsetof(uname_info_t, name.sysname), /* -s */ offsetof(uname_info_t, name.nodename), /* -n */ @@ -103,86 +119,97 @@ static const unsigned short utsname_offset[] = { offsetof(uname_info_t, platform), /* -i */ offsetof(uname_info_t, os), /* -o */ }; +#endif int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -int uname_main(int argc UNUSED_PARAM, char **argv) +int uname_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) { -#if ENABLE_LONG_OPTS - static const char uname_longopts[] ALIGN1 = - /* name, has_arg, val */ - "all\0" No_argument "a" - "kernel-name\0" No_argument "s" - "nodename\0" No_argument "n" - "kernel-release\0" No_argument "r" - "release\0" No_argument "r" - "kernel-version\0" No_argument "v" - "machine\0" No_argument "m" - "processor\0" No_argument "p" - "hardware-platform\0" No_argument "i" - "operating-system\0" No_argument "o" - ; -#endif uname_info_t uname_info; -#if defined(__sparc__) && defined(__linux__) - char *fake_sparc = getenv("FAKE_SPARC"); -#endif - const char *unknown_str = "unknown"; - const char *fmt; - const unsigned short *delta; + IF_UNAME(const char *unknown_str = "unknown";) unsigned toprint; - IF_LONG_OPTS(applet_long_options = uname_longopts); - toprint = getopt32(argv, options); - - if (argv[optind]) { /* coreutils-6.9 compat */ - bb_show_usage(); - } - - if (toprint & (1 << 8)) { /* -a => all opts on */ - toprint = (1 << 8) - 1; - unknown_str = ""; /* -a does not print unknown fields */ - } - - if (toprint == 0) { /* no opts => -s (sysname) */ - toprint = 1; - } + toprint = (1 << 4); /* "arch" = "uname -m" */ + +#if ENABLE_UNAME + if (!ENABLE_BBARCH || applet_name[0] == 'u') { +# if ENABLE_LONG_OPTS + static const char uname_longopts[] ALIGN1 = + /* name, has_arg, val */ + "all\0" No_argument "a" + "kernel-name\0" No_argument "s" + "nodename\0" No_argument "n" + "kernel-release\0" No_argument "r" + "release\0" No_argument "r" + "kernel-version\0" No_argument "v" + "machine\0" No_argument "m" + "processor\0" No_argument "p" + "hardware-platform\0" No_argument "i" + "operating-system\0" No_argument "o" + ; +# endif + IF_LONG_OPTS(applet_long_options = uname_longopts); + toprint = getopt32(argv, options); + if (argv[optind]) { /* coreutils-6.9 compat */ + bb_show_usage(); + } + if (toprint & (1 << 8)) { /* -a => all opts on */ + toprint = (1 << 8) - 1; + unknown_str = ""; /* -a does not print unknown fields */ + } + if (toprint == 0) { /* no opts => -s (sysname) */ + toprint = 1; + } + } /* if "uname" */ +#endif uname(&uname_info.name); /* never fails */ #if defined(__sparc__) && defined(__linux__) - if (fake_sparc && (fake_sparc[0] | 0x20) == 'y') { - strcpy(uname_info.name.machine, "sparc"); - } -#endif - strcpy(uname_info.processor, unknown_str); - strcpy(uname_info.platform, unknown_str); - strcpy(uname_info.os, CONFIG_UNAME_OSNAME); -#if 0 - /* Fedora does something like this */ - strcpy(uname_info.processor, uname_info.name.machine); - strcpy(uname_info.platform, uname_info.name.machine); - if (uname_info.platform[0] == 'i' - && uname_info.platform[1] - && uname_info.platform[2] == '8' - && uname_info.platform[3] == '6' - ) { - uname_info.platform[1] = '3'; + { + char *fake_sparc = getenv("FAKE_SPARC"); + if (fake_sparc && (fake_sparc[0] | 0x20) == 'y') { + strcpy(uname_info.name.machine, "sparc"); + } } #endif - - delta = utsname_offset; - fmt = " %s" + 1; - do { - if (toprint & 1) { - const char *p = (char *)(&uname_info) + *delta; - if (p[0]) { - printf(fmt, p); - fmt = " %s"; - } + if (ENABLE_BBARCH && (!ENABLE_UNAME || applet_name[0] == 'a')) { + puts(uname_info.name.machine); + } else { +#if ENABLE_UNAME + /* "uname" */ + const char *fmt; + const unsigned short *delta; + + strcpy(uname_info.processor, unknown_str); + strcpy(uname_info.platform, unknown_str); + strcpy(uname_info.os, CONFIG_UNAME_OSNAME); +# if 0 + /* Fedora does something like this */ + strcpy(uname_info.processor, uname_info.name.machine); + strcpy(uname_info.platform, uname_info.name.machine); + if (uname_info.platform[0] == 'i' + && uname_info.platform[1] + && uname_info.platform[2] == '8' + && uname_info.platform[3] == '6' + ) { + uname_info.platform[1] = '3'; } - ++delta; - } while (toprint >>= 1); - bb_putchar('\n'); +# endif + delta = utsname_offset; + fmt = " %s" + 1; + do { + if (toprint & 1) { + const char *p = (char *)(&uname_info) + *delta; + if (p[0]) { + printf(fmt, p); + fmt = " %s"; + } + } + ++delta; + } while (toprint >>= 1); + bb_putchar('\n'); +#endif + } fflush_stdout_and_exit(EXIT_SUCCESS); /* coreutils-6.9 compat */ } |