uname: add support for -i and -o, fix printing of unknown -p
value with -a option function old new delta uname_main 166 185 +19 utsname_offset 12 16 +4 options 621 623 +2 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 3/0 up/down: 25/0) Total: 25 bytes
This commit is contained in:
		@@ -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 <djm@gnu.ai.mit.edu> */
 | 
			
		||||
 | 
			
		||||
/* Busyboxed by Erik Andersen */
 | 
			
		||||
 | 
			
		||||
/* Further size reductions by Glenn McGrath and Manuel Novoa III. */
 | 
			
		||||
 | 
			
		||||
/* Mar 16, 2003      Manuel Novoa III   (mjn3@codepoet.org)
 | 
			
		||||
 * -s, --sysname	SunOS
 | 
			
		||||
 * -n, --nodename	rocky8
 | 
			
		||||
 * -r, --release	4.0
 | 
			
		||||
 * -v, --version
 | 
			
		||||
 * -m, --machine	sun
 | 
			
		||||
 * -a, --all		SunOS rocky8 4.0  sun
 | 
			
		||||
 *
 | 
			
		||||
 * Now does proper error checking on i/o.  Plus some further space savings.
 | 
			
		||||
 * The default behavior is equivalent to '-s'.
 | 
			
		||||
 *
 | 
			
		||||
 * David MacKenzie <djm@gnu.ai.mit.edu>
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Busyboxed by Erik Andersen
 | 
			
		||||
 *
 | 
			
		||||
 * Before 2003: Glenn McGrath and Manuel Novoa III
 | 
			
		||||
 *  Further size reductions.
 | 
			
		||||
 * Mar 16, 2003: Manuel Novoa III (mjn3@codepoet.org)
 | 
			
		||||
 *  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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user