1/* vi: set sw=4 ts=4: */ 2/* uname -- print system information 3 Copyright (C) 1989-1999 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2, or (at your option) 8 any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software Foundation, 17 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 18 19/* Option Example 20 21 -s, --sysname SunOS 22 -n, --nodename rocky8 23 -r, --release 4.0 24 -v, --version 25 -m, --machine sun 26 -a, --all SunOS rocky8 4.0 sun 27 28 The default behavior is equivalent to `-s'. 29 30 David MacKenzie <djm@gnu.ai.mit.edu> */ 31 32/* Busyboxed by Erik Andersen */ 33 34#include <stdio.h> 35#include <stdlib.h> 36#include <string.h> 37#include <sys/types.h> 38#include <sys/utsname.h> 39 40#if defined(HAVE_SYSINFO) && defined(HAVE_SYS_SYSTEMINFO_H) 41# include <sys/systeminfo.h> 42#endif 43#include "busybox.h" 44 45static void print_element(unsigned int mask, char *element); 46 47/* Values that are bitwise or'd into `toprint'. */ 48/* Operating system name. */ 49static const int PRINT_SYSNAME = 1; 50 51/* Node name on a communications network. */ 52static const int PRINT_NODENAME = 2; 53 54/* Operating system release. */ 55static const int PRINT_RELEASE = 4; 56 57/* Operating system version. */ 58static const int PRINT_VERSION = 8; 59 60/* Machine hardware name. */ 61static const int PRINT_MACHINE = 16; 62 63 /* Host processor type. */ 64static const int PRINT_PROCESSOR = 32; 65 66/* Mask indicating which elements of the name to print. */ 67static unsigned char toprint; 68 69 70int uname_main(int argc, char **argv) 71{ 72 struct utsname name; 73 char processor[256]; 74 75#if defined(__sparc__) && defined(__linux__) 76 char *fake_sparc = getenv("FAKE_SPARC"); 77#endif 78 79 toprint = 0; 80 81 /* Parse any options */ 82 //fprintf(stderr, "argc=%d, argv=%s\n", argc, *argv); 83 while (--argc > 0 && **(++argv) == '-') { 84 while (*(++(*argv))) { 85 switch (**argv) { 86 case 's': 87 toprint |= PRINT_SYSNAME; 88 break; 89 case 'n': 90 toprint |= PRINT_NODENAME; 91 break; 92 case 'r': 93 toprint |= PRINT_RELEASE; 94 break; 95 case 'v': 96 toprint |= PRINT_VERSION; 97 break; 98 case 'm': 99 toprint |= PRINT_MACHINE; 100 break; 101 case 'p': 102 toprint |= PRINT_PROCESSOR; 103 break; 104 case 'a': 105 toprint = (PRINT_SYSNAME | PRINT_NODENAME | PRINT_RELEASE | 106 PRINT_PROCESSOR | PRINT_VERSION | 107 PRINT_MACHINE); 108 break; 109 default: 110 show_usage(); 111 } 112 } 113 } 114 115 if (toprint == 0) 116 toprint = PRINT_SYSNAME; 117 118 if (uname(&name) == -1) 119 perror_msg("cannot get system name"); 120 121#if defined(HAVE_SYSINFO) && defined(SI_ARCHITECTURE) 122 if (sysinfo(SI_ARCHITECTURE, processor, sizeof(processor)) == -1) 123 perror_msg("cannot get processor type"); 124} 125 126#else 127 strcpy(processor, "unknown"); 128#endif 129 130#if defined(__sparc__) && defined(__linux__) 131 if (fake_sparc != NULL 132 && (fake_sparc[0] == 'y' 133 || fake_sparc[0] == 'Y')) strcpy(name.machine, "sparc"); 134#endif 135 136 print_element(PRINT_SYSNAME, name.sysname); 137 print_element(PRINT_NODENAME, name.nodename); 138 print_element(PRINT_RELEASE, name.release); 139 print_element(PRINT_VERSION, name.version); 140 print_element(PRINT_MACHINE, name.machine); 141 print_element(PRINT_PROCESSOR, processor); 142 143 return EXIT_SUCCESS; 144} 145 146/* If the name element set in MASK is selected for printing in `toprint', 147 print ELEMENT; then print a space unless it is the last element to 148 be printed, in which case print a newline. */ 149 150static void print_element(unsigned int mask, char *element) 151{ 152 if (toprint & mask) { 153 toprint &= ~mask; 154 printf("%s%c", element, toprint ? ' ' : '\n'); 155 } 156} 157