1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67#include "libbb.h"
68
69#include <sys/utsname.h>
70
71typedef struct {
72 struct utsname name;
73 char processor[sizeof(((struct utsname*)NULL)->machine)];
74 char platform[sizeof(((struct utsname*)NULL)->machine)];
75 char os[sizeof("GNU/Linux")];
76} uname_info_t;
77
78static const char options[] ALIGN1 = "snrvmpioa";
79static const unsigned short utsname_offset[] = {
80 offsetof(uname_info_t, name.sysname),
81 offsetof(uname_info_t, name.nodename),
82 offsetof(uname_info_t, name.release),
83 offsetof(uname_info_t, name.version),
84 offsetof(uname_info_t, name.machine),
85 offsetof(uname_info_t, processor),
86 offsetof(uname_info_t, platform),
87 offsetof(uname_info_t, os),
88};
89
90int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
91int uname_main(int argc UNUSED_PARAM, char **argv)
92{
93#if ENABLE_LONG_OPTS
94 static const char uname_longopts[] ALIGN1 =
95
96 "all\0" No_argument "a"
97 "kernel-name\0" No_argument "s"
98 "nodename\0" No_argument "n"
99 "kernel-release\0" No_argument "r"
100 "release\0" No_argument "r"
101 "kernel-version\0" No_argument "v"
102 "machine\0" No_argument "m"
103 "processor\0" No_argument "p"
104 "hardware-platform\0" No_argument "i"
105 "operating-system\0" No_argument "o"
106 ;
107#endif
108 uname_info_t uname_info;
109#if defined(__sparc__) && defined(__linux__)
110 char *fake_sparc = getenv("FAKE_SPARC");
111#endif
112 const char *unknown_str = "unknown";
113 const char *fmt;
114 const unsigned short *delta;
115 unsigned toprint;
116
117 IF_LONG_OPTS(applet_long_options = uname_longopts);
118 toprint = getopt32(argv, options);
119
120 if (argv[optind]) {
121 bb_show_usage();
122 }
123
124 if (toprint & (1 << 8)) {
125 toprint = (1 << 8) - 1;
126 unknown_str = "";
127 }
128
129 if (toprint == 0) {
130 toprint = 1;
131 }
132
133 uname(&uname_info.name);
134
135#if defined(__sparc__) && defined(__linux__)
136 if (fake_sparc && (fake_sparc[0] | 0x20) == 'y') {
137 strcpy(uname_info.name.machine, "sparc");
138 }
139#endif
140 strcpy(uname_info.processor, unknown_str);
141 strcpy(uname_info.platform, unknown_str);
142 strcpy(uname_info.os, "GNU/Linux");
143#if 0
144
145 strcpy(uname_info.processor, uname_info.name.machine);
146 strcpy(uname_info.platform, uname_info.name.machine);
147 if (uname_info.platform[0] == 'i'
148 && uname_info.platform[1]
149 && uname_info.platform[2] == '8'
150 && uname_info.platform[3] == '6'
151 ) {
152 uname_info.platform[1] = '3';
153 }
154#endif
155
156 delta = utsname_offset;
157 fmt = " %s" + 1;
158 do {
159 if (toprint & 1) {
160 const char *p = (char *)(&uname_info) + *delta;
161 if (p[0]) {
162 printf(fmt, p);
163 fmt = " %s";
164 }
165 }
166 ++delta;
167 } while (toprint >>= 1);
168 bb_putchar('\n');
169
170 fflush_stdout_and_exit(EXIT_SUCCESS);
171}
172