changeset 326:531b4d716460

Add uname
author Rob Landley <rob@landley.net>
date Thu, 27 Nov 2008 07:31:34 -0600
parents 5d0fbdb2fc86
children a50d2c0f96ed
files toys/uname.c
diffstat 1 files changed, 75 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toys/uname.c	Thu Nov 27 07:31:34 2008 -0600
@@ -0,0 +1,75 @@
+/* vi: set sw=4 ts=4:
+ *
+ * uname.c - return system name
+ *
+ * Copyright 2008 Rob Landley <rob@landley.net>
+ *
+ * See http://www.opengroup.org/onlinepubs/009695399/utilities/uname.html
+
+USE_UNAME(NEWTOY(uname, "amvrns", TOYFLAG_BIN))
+
+config UNAME
+	bool "uname"
+	default y
+	help
+	  usage: uname [-asnrvmpio]
+
+	  Print system information.
+
+	  -s	System name
+	  -n	Network (domain) name
+	  -r	Release number
+	  -v	Version (build date)
+	  -m	Machine (hardware) name
+	  -a	All of the above
+*/
+
+#include "toys.h"
+#include <sys/utsname.h>
+
+// If a 32 bit x86 build environment working in a chroot under an x86-64
+// kernel returns x86_64 for -m it confuses ./configure.  Special case it.
+
+#if defined(__i686__)
+#define GROSS "i686"
+#elif defined(__i586__)
+#define GROSS "i586"
+#elif defined(__i486__)
+#define GROSS "i486"
+#elif defined(__i386__)
+#define GROSS "i386"
+#endif
+
+#define FLAG_a (1<<5)
+
+void uname_main(void)
+{
+	int i, flags = toys.optflags, needspace=0;
+
+	uname((void *)toybuf);
+
+	if (!flags) flags=1;
+	for (i=0; i<5; i++) {
+		char *c = toybuf+(65*i);
+
+		if (flags & ((1<<i)|FLAG_a)) {
+			int len = strlen(c);
+
+			// This problem originates in autoconf, so of course the solution
+			// is horribly ugly.
+#ifdef GROSS
+			if (i==4 && !strcmp(c,"x86_64")) printf(GROSS)
+	        else
+#endif
+
+			if (needspace++) {
+				// We can't decrement on the first entry, because
+				// needspace would be 0
+				*(--c)=' ';
+				len++;
+			}
+			xwrite(1, c, len);
+		}
+	}
+	putchar('\n');
+}