arch: new applet (same as unmae -m). ~30 bytes.
No binary (build failed)
—
(log yok)
| @@ -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 */ | |
| } | |