Annotation of /trunk/mkinitrd-magellan/busybox/coreutils/uname.c
Parent Directory | Revision Log
Revision 984 -
(hide annotations)
(download)
Sun May 30 11:32:42 2010 UTC (14 years ago) by niro
File MIME type: text/plain
File size: 4765 byte(s)
Sun May 30 11:32:42 2010 UTC (14 years ago) by niro
File MIME type: text/plain
File size: 4765 byte(s)
-updated to busybox-1.16.1 and enabled blkid/uuid support in default config
1 | niro | 532 | /* vi: set sw=4 ts=4: */ |
2 | /* uname -- print system information | ||
3 | * Copyright (C) 1989-1999 Free Software Foundation, Inc. | ||
4 | * | ||
5 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | ||
6 | */ | ||
7 | |||
8 | /* BB_AUDIT SUSv3 compliant */ | ||
9 | /* http://www.opengroup.org/onlinepubs/007904975/utilities/uname.html */ | ||
10 | |||
11 | /* Option Example | ||
12 | niro | 984 | * -s, --sysname SunOS |
13 | * -n, --nodename rocky8 | ||
14 | * -r, --release 4.0 | ||
15 | * -v, --version | ||
16 | * -m, --machine sun | ||
17 | * -a, --all SunOS rocky8 4.0 sun | ||
18 | * | ||
19 | * The default behavior is equivalent to '-s'. | ||
20 | * | ||
21 | * David MacKenzie <djm@gnu.ai.mit.edu> | ||
22 | * | ||
23 | * GNU coreutils 6.10: | ||
24 | * Option: struct Example(s): | ||
25 | * utsname | ||
26 | * field: | ||
27 | * -s, --kernel-name sysname Linux | ||
28 | * -n, --nodename nodename localhost.localdomain | ||
29 | * -r, --kernel-release release 2.6.29 | ||
30 | * -v, --kernel-version version #1 SMP Sun Jan 11 20:52:37 EST 2009 | ||
31 | * -m, --machine machine x86_64 i686 | ||
32 | * -p, --processor (none) x86_64 i686 | ||
33 | * -i, --hardware-platform (none) x86_64 i386 | ||
34 | * NB: vanilla coreutils reports "unknown" -p and -i, | ||
35 | * x86_64 and i686/i386 shown above are Fedora's inventions. | ||
36 | * -o, --operating-system (none) GNU/Linux | ||
37 | * -a, --all: all of the above, in the order shown. | ||
38 | * If -p or -i is not known, don't show them | ||
39 | */ | ||
40 | niro | 532 | |
41 | niro | 984 | /* Busyboxed by Erik Andersen |
42 | niro | 532 | * |
43 | niro | 984 | * Before 2003: Glenn McGrath and Manuel Novoa III |
44 | * Further size reductions. | ||
45 | * Mar 16, 2003: Manuel Novoa III (mjn3@codepoet.org) | ||
46 | * Now does proper error checking on i/o. Plus some further space savings. | ||
47 | * Jan 2009: | ||
48 | * Fix handling of -a to not print "unknown", add -o and -i support. | ||
49 | niro | 532 | */ |
50 | |||
51 | niro | 984 | #include "libbb.h" |
52 | /* After libbb.h, since it needs sys/types.h on some systems */ | ||
53 | niro | 532 | #include <sys/utsname.h> |
54 | |||
55 | typedef struct { | ||
56 | struct utsname name; | ||
57 | niro | 984 | char processor[sizeof(((struct utsname*)NULL)->machine)]; |
58 | char platform[sizeof(((struct utsname*)NULL)->machine)]; | ||
59 | char os[sizeof("GNU/Linux")]; | ||
60 | niro | 532 | } uname_info_t; |
61 | |||
62 | niro | 984 | static const char options[] ALIGN1 = "snrvmpioa"; |
63 | niro | 816 | static const unsigned short utsname_offset[] = { |
64 | niro | 984 | offsetof(uname_info_t, name.sysname), /* -s */ |
65 | offsetof(uname_info_t, name.nodename), /* -n */ | ||
66 | offsetof(uname_info_t, name.release), /* -r */ | ||
67 | offsetof(uname_info_t, name.version), /* -v */ | ||
68 | offsetof(uname_info_t, name.machine), /* -m */ | ||
69 | offsetof(uname_info_t, processor), /* -p */ | ||
70 | offsetof(uname_info_t, platform), /* -i */ | ||
71 | offsetof(uname_info_t, os), /* -o */ | ||
72 | niro | 532 | }; |
73 | |||
74 | niro | 816 | int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
75 | int uname_main(int argc UNUSED_PARAM, char **argv) | ||
76 | niro | 532 | { |
77 | niro | 984 | #if ENABLE_LONG_OPTS |
78 | static const char uname_longopts[] ALIGN1 = | ||
79 | /* name, has_arg, val */ | ||
80 | "all\0" No_argument "a" | ||
81 | "kernel-name\0" No_argument "s" | ||
82 | "nodename\0" No_argument "n" | ||
83 | "kernel-release\0" No_argument "r" | ||
84 | "release\0" No_argument "r" | ||
85 | "kernel-version\0" No_argument "v" | ||
86 | "machine\0" No_argument "m" | ||
87 | "processor\0" No_argument "p" | ||
88 | "hardware-platform\0" No_argument "i" | ||
89 | "operating-system\0" No_argument "o" | ||
90 | ; | ||
91 | #endif | ||
92 | niro | 532 | uname_info_t uname_info; |
93 | #if defined(__sparc__) && defined(__linux__) | ||
94 | char *fake_sparc = getenv("FAKE_SPARC"); | ||
95 | #endif | ||
96 | niro | 984 | const char *unknown_str = "unknown"; |
97 | const char *fmt; | ||
98 | niro | 816 | const unsigned short *delta; |
99 | niro | 984 | unsigned toprint; |
100 | niro | 532 | |
101 | niro | 984 | IF_LONG_OPTS(applet_long_options = uname_longopts); |
102 | niro | 816 | toprint = getopt32(argv, options); |
103 | niro | 532 | |
104 | niro | 816 | if (argv[optind]) { /* coreutils-6.9 compat */ |
105 | niro | 532 | bb_show_usage(); |
106 | } | ||
107 | |||
108 | niro | 984 | if (toprint & (1 << 8)) { /* -a => all opts on */ |
109 | toprint = (1 << 8) - 1; | ||
110 | unknown_str = ""; /* -a does not print unknown fields */ | ||
111 | niro | 532 | } |
112 | |||
113 | niro | 816 | if (toprint == 0) { /* no opts => -s (sysname) */ |
114 | toprint = 1; | ||
115 | niro | 532 | } |
116 | |||
117 | niro | 816 | uname(&uname_info.name); /* never fails */ |
118 | niro | 532 | |
119 | #if defined(__sparc__) && defined(__linux__) | ||
120 | niro | 816 | if (fake_sparc && (fake_sparc[0] | 0x20) == 'y') { |
121 | niro | 532 | strcpy(uname_info.name.machine, "sparc"); |
122 | } | ||
123 | #endif | ||
124 | niro | 984 | strcpy(uname_info.processor, unknown_str); |
125 | strcpy(uname_info.platform, unknown_str); | ||
126 | strcpy(uname_info.os, "GNU/Linux"); | ||
127 | #if 0 | ||
128 | /* Fedora does something like this */ | ||
129 | strcpy(uname_info.processor, uname_info.name.machine); | ||
130 | strcpy(uname_info.platform, uname_info.name.machine); | ||
131 | if (uname_info.platform[0] == 'i' | ||
132 | && uname_info.platform[1] | ||
133 | && uname_info.platform[2] == '8' | ||
134 | && uname_info.platform[3] == '6' | ||
135 | ) { | ||
136 | uname_info.platform[1] = '3'; | ||
137 | } | ||
138 | #endif | ||
139 | niro | 532 | |
140 | delta = utsname_offset; | ||
141 | niro | 984 | fmt = " %s" + 1; |
142 | niro | 532 | do { |
143 | if (toprint & 1) { | ||
144 | niro | 984 | const char *p = (char *)(&uname_info) + *delta; |
145 | if (p[0]) { | ||
146 | printf(fmt, p); | ||
147 | fmt = " %s"; | ||
148 | niro | 532 | } |
149 | } | ||
150 | ++delta; | ||
151 | } while (toprint >>= 1); | ||
152 | niro | 816 | bb_putchar('\n'); |
153 | niro | 532 | |
154 | niro | 816 | fflush_stdout_and_exit(EXIT_SUCCESS); /* coreutils-6.9 compat */ |
155 | niro | 532 | } |