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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84#include "libbb.h"
85
86#include <sys/utsname.h>
87
88typedef struct {
89 struct utsname name;
90 char processor[sizeof(((struct utsname*)NULL)->machine)];
91 char platform[sizeof(((struct utsname*)NULL)->machine)];
92 char os[sizeof(CONFIG_UNAME_OSNAME)];
93} uname_info_t;
94
95static const char options[] ALIGN1 = "snrvmpioa";
96static const unsigned short utsname_offset[] = {
97 offsetof(uname_info_t, name.sysname),
98 offsetof(uname_info_t, name.nodename),
99 offsetof(uname_info_t, name.release),
100 offsetof(uname_info_t, name.version),
101 offsetof(uname_info_t, name.machine),
102 offsetof(uname_info_t, processor),
103 offsetof(uname_info_t, platform),
104 offsetof(uname_info_t, os),
105};
106
107int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
108int uname_main(int argc UNUSED_PARAM, char **argv)
109{
110#if ENABLE_LONG_OPTS
111 static const char uname_longopts[] ALIGN1 =
112
113 "all\0" No_argument "a"
114 "kernel-name\0" No_argument "s"
115 "nodename\0" No_argument "n"
116 "kernel-release\0" No_argument "r"
117 "release\0" No_argument "r"
118 "kernel-version\0" No_argument "v"
119 "machine\0" No_argument "m"
120 "processor\0" No_argument "p"
121 "hardware-platform\0" No_argument "i"
122 "operating-system\0" No_argument "o"
123 ;
124#endif
125 uname_info_t uname_info;
126#if defined(__sparc__) && defined(__linux__)
127 char *fake_sparc = getenv("FAKE_SPARC");
128#endif
129 const char *unknown_str = "unknown";
130 const char *fmt;
131 const unsigned short *delta;
132 unsigned toprint;
133
134 IF_LONG_OPTS(applet_long_options = uname_longopts);
135 toprint = getopt32(argv, options);
136
137 if (argv[optind]) {
138 bb_show_usage();
139 }
140
141 if (toprint & (1 << 8)) {
142 toprint = (1 << 8) - 1;
143 unknown_str = "";
144 }
145
146 if (toprint == 0) {
147 toprint = 1;
148 }
149
150 uname(&uname_info.name);
151
152#if defined(__sparc__) && defined(__linux__)
153 if (fake_sparc && (fake_sparc[0] | 0x20) == 'y') {
154 strcpy(uname_info.name.machine, "sparc");
155 }
156#endif
157 strcpy(uname_info.processor, unknown_str);
158 strcpy(uname_info.platform, unknown_str);
159 strcpy(uname_info.os, CONFIG_UNAME_OSNAME);
160#if 0
161
162 strcpy(uname_info.processor, uname_info.name.machine);
163 strcpy(uname_info.platform, uname_info.name.machine);
164 if (uname_info.platform[0] == 'i'
165 && uname_info.platform[1]
166 && uname_info.platform[2] == '8'
167 && uname_info.platform[3] == '6'
168 ) {
169 uname_info.platform[1] = '3';
170 }
171#endif
172
173 delta = utsname_offset;
174 fmt = " %s" + 1;
175 do {
176 if (toprint & 1) {
177 const char *p = (char *)(&uname_info) + *delta;
178 if (p[0]) {
179 printf(fmt, p);
180 fmt = " %s";
181 }
182 }
183 ++delta;
184 } while (toprint >>= 1);
185 bb_putchar('\n');
186
187 fflush_stdout_and_exit(EXIT_SUCCESS);
188}
189