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