Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/coreutils/uname.c
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/coreutils/uname.c
r1765 r2725 3 3 * Copyright (C) 1989-1999 Free Software Foundation, Inc. 4 4 * 5 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.5 * Licensed under GPLv2 or later, see file LICENSE in this source tree. 6 6 */ 7 7 … … 10 10 11 11 /* Option Example 12 13 -s, --sysname SunOS 14 -n, --nodename rocky8 15 -r, --release 4.0 16 -v, --version 17 -m, --machine sun 18 -a, --all SunOS rocky8 4.0 sun 19 20 The default behavior is equivalent to `-s'. 21 22 David MacKenzie <djm@gnu.ai.mit.edu> */ 23 24 /* Busyboxed by Erik Andersen */ 25 26 /* Further size reductions by Glenn McGrath and Manuel Novoa III. */ 27 28 /* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) 12 * -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 29 18 * 30 * Now does proper error checking on i/o. Plus some further space savings. 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 31 39 */ 32 40 41 /* Busyboxed by Erik Andersen 42 * 43 * 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 */ 50 51 #include "libbb.h" 52 /* After libbb.h, since it needs sys/types.h on some systems */ 33 53 #include <sys/utsname.h> 34 #include "libbb.h"35 54 36 55 typedef struct { 37 56 struct utsname name; 38 char processor[8]; /* for "unknown" */ 57 char processor[sizeof(((struct utsname*)NULL)->machine)]; 58 char platform[sizeof(((struct utsname*)NULL)->machine)]; 59 char os[sizeof("GNU/Linux")]; 39 60 } uname_info_t; 40 61 41 static const char options[] ALIGN1 = "snrvmpa"; 42 static const unsigned short utsname_offset[] ALIGN2 = { 43 offsetof(uname_info_t,name.sysname), 44 offsetof(uname_info_t,name.nodename), 45 offsetof(uname_info_t,name.release), 46 offsetof(uname_info_t,name.version), 47 offsetof(uname_info_t,name.machine), 48 offsetof(uname_info_t,processor) 62 static const char options[] ALIGN1 = "snrvmpioa"; 63 static const unsigned short utsname_offset[] = { 64 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 */ 49 72 }; 50 73 51 int uname_main(int argc, char **argv) ;52 int uname_main(int argc , char **argv)74 int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 75 int uname_main(int argc UNUSED_PARAM, char **argv) 53 76 { 77 #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 54 92 uname_info_t uname_info; 55 93 #if defined(__sparc__) && defined(__linux__) 56 94 char *fake_sparc = getenv("FAKE_SPARC"); 57 95 #endif 58 const unsigned short int *delta; 59 char toprint; 96 const char *unknown_str = "unknown"; 97 const char *fmt; 98 const unsigned short *delta; 99 unsigned toprint; 60 100 101 IF_LONG_OPTS(applet_long_options = uname_longopts); 61 102 toprint = getopt32(argv, options); 62 103 63 if (arg c != optind) {104 if (argv[optind]) { /* coreutils-6.9 compat */ 64 105 bb_show_usage(); 65 106 } 66 107 67 if (toprint & (1 << 6)) { 68 toprint = 0x3f; 108 if (toprint & (1 << 8)) { /* -a => all opts on */ 109 toprint = (1 << 8) - 1; 110 unknown_str = ""; /* -a does not print unknown fields */ 69 111 } 70 112 71 if (toprint == 0) { 72 toprint = 1; /* sysname */113 if (toprint == 0) { /* no opts => -s (sysname) */ 114 toprint = 1; 73 115 } 74 116 75 if (uname(&uname_info.name) == -1) { 76 bb_error_msg_and_die("cannot get system name"); 77 } 117 uname(&uname_info.name); /* never fails */ 78 118 79 119 #if defined(__sparc__) && defined(__linux__) 80 if ((fake_sparc != NULL) 81 && ((fake_sparc[0] == 'y') 82 || (fake_sparc[0] == 'Y'))) { 120 if (fake_sparc && (fake_sparc[0] | 0x20) == 'y') { 83 121 strcpy(uname_info.name.machine, "sparc"); 84 122 } 85 123 #endif 86 87 strcpy(uname_info.processor, "unknown"); 124 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 88 139 89 140 delta = utsname_offset; 141 fmt = " %s" + 1; 90 142 do { 91 143 if (toprint & 1) { 92 printf(((char *)(&uname_info)) + *delta); 93 if (toprint > 1) { 94 putchar(' '); 144 const char *p = (char *)(&uname_info) + *delta; 145 if (p[0]) { 146 printf(fmt, p); 147 fmt = " %s"; 95 148 } 96 149 } 97 150 ++delta; 98 151 } while (toprint >>= 1); 99 putchar('\n');152 bb_putchar('\n'); 100 153 101 fflush_stdout_and_exit(EXIT_SUCCESS); 154 fflush_stdout_and_exit(EXIT_SUCCESS); /* coreutils-6.9 compat */ 102 155 }
Note:
See TracChangeset
for help on using the changeset viewer.