1/* 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 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) 29 * 30 * Now does proper error checking on i/o. Plus some further space savings. 31 */ 32 33#include <sys/utsname.h> 34#include "libbb.h" 35 36typedef struct { 37 struct utsname name; 38 char processor[8]; /* for "unknown" */ 39} uname_info_t; 40 41static const char options[] ALIGN1 = "snrvmpa"; 42static 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) 49}; 50 51int uname_main(int argc, char **argv); 52int uname_main(int argc, char **argv) 53{ 54 uname_info_t uname_info; 55#if defined(__sparc__) && defined(__linux__) 56 char *fake_sparc = getenv("FAKE_SPARC"); 57#endif 58 const unsigned short int *delta; 59 char toprint; 60 61 toprint = getopt32(argv, options); 62 63 if (argc != optind) { 64 bb_show_usage(); 65 } 66 67 if (toprint & (1 << 6)) { 68 toprint = 0x3f; 69 } 70 71 if (toprint == 0) { 72 toprint = 1; /* sysname */ 73 } 74 75 if (uname(&uname_info.name) == -1) { 76 bb_error_msg_and_die("cannot get system name"); 77 } 78 79#if defined(__sparc__) && defined(__linux__) 80 if ((fake_sparc != NULL) 81 && ((fake_sparc[0] == 'y') 82 || (fake_sparc[0] == 'Y'))) { 83 strcpy(uname_info.name.machine, "sparc"); 84 } 85#endif 86 87 strcpy(uname_info.processor, "unknown"); 88 89 delta = utsname_offset; 90 do { 91 if (toprint & 1) { 92 printf(((char *)(&uname_info)) + *delta); 93 if (toprint > 1) { 94 putchar(' '); 95 } 96 } 97 ++delta; 98 } while (toprint >>= 1); 99 putchar('\n'); 100 101 fflush_stdout_and_exit(EXIT_SUCCESS); 102} 103