uname: add support for -i and -o, fix printing of unknown -p value with -a option
No binary (build failed)
—
(log yok)
| @@ -9,25 +9,43 @@ | |
| /* http://www.opengroup.org/onlinepubs/007904975/utilities/uname.html */ | |
| /* Option Example | |
| + | * -s, --sysname SunOS |
| + | * -n, --nodename rocky8 |
| + | * -r, --release 4.0 |
| + | * -v, --version |
| + | * -m, --machine sun |
| + | * -a, --all SunOS rocky8 4.0 sun |
| + | * |
| + | * The default behavior is equivalent to '-s'. |
| + | * |
| + | * David MacKenzie <[email protected]> |
| + | * |
| + | * GNU coreutils 6.10: |
| + | * Option: struct Example(s): |
| + | * utsname |
| + | * field: |
| + | * -s, --kernel-name sysname Linux |
| + | * -n, --nodename nodename localhost.localdomain |
| + | * -r, --kernel-release release 2.6.29 |
| + | * -v, --kernel-version version #1 SMP Sun Jan 11 20:52:37 EST 2009 |
| + | * -m, --machine machine x86_64 i686 |
| + | * -p, --processor (none) x86_64 i686 |
| + | * -i, --hardware-platform (none) x86_64 i386 |
| + | * NB: vanilla coreutils reports "unknown" -p and -i, |
| + | * x86_64 and i686/i386 shown above are Fedora's inventions. |
| + | * -o, --operating-system (none) GNU/Linux |
| + | * -a, --all: all of the above, in the order shown. |
| + | * If -p or -i is not known, don't show them |
| + | */ |
| - | -s, --sysname SunOS |
| - | -n, --nodename rocky8 |
| - | -r, --release 4.0 |
| - | -v, --version |
| - | -m, --machine sun |
| - | -a, --all SunOS rocky8 4.0 sun |
| - | |
| - | The default behavior is equivalent to '-s'. |
| - | |
| - | David MacKenzie <[email protected]> */ |
| - | |
| - | /* Busyboxed by Erik Andersen */ |
| - | |
| - | /* Further size reductions by Glenn McGrath and Manuel Novoa III. */ |
| - | |
| - | /* Mar 16, 2003 Manuel Novoa III ([email protected]) |
| + | /* Busyboxed by Erik Andersen |
| * | |
| - | * Now does proper error checking on i/o. Plus some further space savings. |
| + | * Before 2003: Glenn McGrath and Manuel Novoa III |
| + | * Further size reductions. |
| + | * Mar 16, 2003: Manuel Novoa III ([email protected]) |
| + | * Now does proper error checking on i/o. Plus some further space savings. |
| + | * Jan 2009: |
| + | * Fix handling of -a to not print "unknown", add -o and -i support. |
| */ | |
| #include <sys/utsname.h> | |
| @@ -35,17 +53,21 @@ | |
| typedef struct { | |
| struct utsname name; | |
| - | char processor[8]; /* for "unknown" */ |
| + | char processor[sizeof(((struct utsname*)NULL)->machine)]; |
| + | char platform[sizeof(((struct utsname*)NULL)->machine)]; |
| + | char os[sizeof("GNU/Linux")]; |
| } uname_info_t; | |
| - | static const char options[] ALIGN1 = "snrvmpa"; |
| + | static const char options[] ALIGN1 = "snrvmpioa"; |
| static const unsigned short utsname_offset[] = { | |
| - | offsetof(uname_info_t, name.sysname), |
| - | offsetof(uname_info_t, name.nodename), |
| - | offsetof(uname_info_t, name.release), |
| - | offsetof(uname_info_t, name.version), |
| - | offsetof(uname_info_t, name.machine), |
| - | offsetof(uname_info_t, processor) |
| + | offsetof(uname_info_t, name.sysname), /* -s */ |
| + | offsetof(uname_info_t, name.nodename), /* -n */ |
| + | offsetof(uname_info_t, name.release), /* -r */ |
| + | offsetof(uname_info_t, name.version), /* -v */ |
| + | offsetof(uname_info_t, name.machine), /* -m */ |
| + | offsetof(uname_info_t, processor), /* -p */ |
| + | offsetof(uname_info_t, platform), /* -i */ |
| + | offsetof(uname_info_t, os), /* -o */ |
| }; | |
| int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |
| @@ -55,6 +77,8 @@ int uname_main(int argc UNUSED_PARAM, char **argv) | |
| #if defined(__sparc__) && defined(__linux__) | |
| char *fake_sparc = getenv("FAKE_SPARC"); | |
| #endif | |
| + | const char *unknown_str = "unknown"; |
| + | const char *fmt; |
| const unsigned short *delta; | |
| char toprint; | |
| @@ -64,8 +88,9 @@ int uname_main(int argc UNUSED_PARAM, char **argv) | |
| bb_show_usage(); | |
| } | |
| - | if (toprint & (1 << 6)) { /* -a => all opts on */ |
| - | toprint = 0x3f; |
| + | 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) */ | |
| @@ -79,16 +104,30 @@ int uname_main(int argc UNUSED_PARAM, char **argv) | |
| strcpy(uname_info.name.machine, "sparc"); | |
| } | |
| #endif | |
| - | |
| - | strcpy(uname_info.processor, "unknown"); |
| + | strcpy(uname_info.processor, unknown_str); |
| + | strcpy(uname_info.platform, unknown_str); |
| + | strcpy(uname_info.os, "GNU/Linux"); |
| + | #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'; |
| + | } |
| + | #endif |
| delta = utsname_offset; | |
| + | fmt = " %s" + 1; |
| do { | |
| if (toprint & 1) { | |
| - | /* printf would not be safe here */ |
| - | fputs((char *)(&uname_info) + *delta, stdout); |
| - | if (toprint > 1) { |
| - | bb_putchar(' '); |
| + | const char *p = (char *)(&uname_info) + *delta; |
| + | if (p[0]) { |
| + | printf(fmt, p); |
| + | fmt = " %s"; |
| } | |
| } | |
| ++delta; | |