OSDN Git Service

Add uname
authorRob Landley <rob@landley.net>
Thu, 27 Nov 2008 13:31:34 +0000 (07:31 -0600)
committerRob Landley <rob@landley.net>
Thu, 27 Nov 2008 13:31:34 +0000 (07:31 -0600)
toys/uname.c [new file with mode: 0644]

diff --git a/toys/uname.c b/toys/uname.c
new file mode 100644 (file)
index 0000000..fe76238
--- /dev/null
@@ -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');
+}