1 /* uname.c - return system name
2  *
3  * Copyright 2008 Rob Landley <rob@landley.net>
4  *
5  * See http://opengroup.org/onlinepubs/9699919799/utilities/uname.html
6 
7 USE_UNAME(NEWTOY(uname, "oamvrns[+os]", TOYFLAG_BIN))
8 USE_ARCH(NEWTOY(arch, 0, TOYFLAG_USR|TOYFLAG_BIN))
9 
10 config ARCH
11   bool "arch"
12   default y
13   help
14     usage: arch
15 
16     Print machine (hardware) name, same as uname -m.
17 
18 config UNAME
19   bool "uname"
20   default y
21   help
22     usage: uname [-asnrvm]
23 
24     Print system information.
25 
26     -s	System name
27     -n	Network (domain) name
28     -r	Kernel Release number
29     -v	Kernel Version
30     -m	Machine (hardware) name
31     -a	All of the above
32 */
33 
34 #define FOR_uname
35 #define FORCE_FLAGS
36 #include "toys.h"
37 
38 // If a 32 bit x86 build environment working in a chroot under an x86-64
39 // kernel returns x86_64 for -m it confuses ./configure.  Special case it.
40 
41 #if defined(__i686__)
42 #define GROSS "i686"
43 #elif defined(__i586__)
44 #define GROSS "i586"
45 #elif defined(__i486__)
46 #define GROSS "i486"
47 #elif defined(__i386__)
48 #define GROSS "i386"
49 #endif
50 
uname_main(void)51 void uname_main(void)
52 {
53   int i, flags = toys.optflags, needspace=0;
54   struct utsname u;
55 
56   uname(&u);
57 
58   if (!flags) flags = FLAG_s;
59   for (i=0; i<5; i++) {
60     char *c = ((char *) &u)+(sizeof(u.sysname)*i);
61 
62     if (flags & ((1<<i)|FLAG_a)) {
63       int len = strlen(c);
64 
65       // This problem originates in autoconf, so of course the solution
66       // is horribly ugly.
67 #ifdef GROSS
68       if (i==4 && !strcmp(c,"x86_64")) {
69         printf(GROSS);
70         continue;
71       }
72 #endif
73 
74       if (needspace++) {
75         // We can't decrement on the first entry, because
76         // needspace would be 0
77         *(--c)=' ';
78         len++;
79       }
80       xwrite(1, c, len);
81     }
82   }
83   putchar('\n');
84 }
85 
arch_main(void)86 void arch_main(void)
87 {
88   toys.optflags = FLAG_m;
89   uname_main();
90 }
91