1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 * 21 * Copyright (c) 2012 Nexenta Systems, Inc. All rights reserved. 22 * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved. 23 */ 24 25 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 26 /* All Rights Reserved */ 27 28 /* 29 * University Copyright- Copyright (c) 1982, 1986, 1988 30 * The Regents of the University of California 31 * All Rights Reserved 32 * 33 * University Acknowledgment- Portions of this document are derived from 34 * software developed by the University of California, Berkeley, and its 35 * contributors. 36 */ 37 38 #define __EXTENSIONS__ 39 #include <sys/types.h> 40 #include <stdio.h> 41 #include <stdio.h> 42 #include <string.h> 43 #include <locale.h> 44 #include <unistd.h> 45 #include <stdlib.h> 46 #include <errno.h> 47 #include <sys/fcntl.h> 48 #include <sys/stat.h> 49 #include <sys/utsname.h> 50 #include <sys/systeminfo.h> 51 52 #define OS_NAME "illumos" 53 54 static void usage(void); 55 56 /* ARGSUSED */ 57 int 58 main(int argc, char *argv[], char *envp[]) 59 { 60 char *nodename; 61 char *optstring = "asnrpvmioS:X"; 62 int sflg = 0, nflg = 0, rflg = 0, vflg = 0, mflg = 0; 63 int pflg = 0, iflg = 0, oflg = 0, Sflg = 0; 64 int errflg = 0, optlet; 65 int Xflg = 0; 66 struct utsname unstr, *un; 67 char fmt_string[] = " %.*s"; 68 char *fs = &fmt_string[1]; 69 char procbuf[SYS_NMLN]; 70 71 (void) umask(~(S_IRWXU|S_IRGRP|S_IROTH) & S_IAMB); 72 un = &unstr; 73 (void) uname(un); 74 75 (void) setlocale(LC_ALL, ""); 76 #if !defined(TEXT_DOMAIN) 77 #define TEXT_DOMAIN "SYS_TEST" 78 #endif 79 (void) textdomain(TEXT_DOMAIN); 80 81 while ((optlet = getopt(argc, argv, optstring)) != EOF) 82 switch (optlet) { 83 case 'a': 84 sflg++; nflg++; rflg++; vflg++; mflg++; 85 pflg++; 86 iflg++; 87 break; 88 case 's': 89 sflg++; 90 break; 91 case 'n': 92 nflg++; 93 break; 94 case 'r': 95 rflg++; 96 break; 97 case 'v': 98 vflg++; 99 break; 100 case 'm': 101 mflg++; 102 break; 103 case 'p': 104 pflg++; 105 break; 106 case 'i': 107 iflg++; 108 break; 109 case 'o': 110 oflg++; 111 break; 112 case 'S': 113 Sflg++; 114 nodename = optarg; 115 break; 116 case 'X': 117 Xflg++; 118 break; 119 120 case '?': 121 errflg++; 122 } 123 124 if (errflg || (optind != argc)) 125 usage(); 126 127 if ((Sflg > 1) || 128 (Sflg && (sflg || nflg || rflg || vflg || mflg || pflg || iflg || 129 oflg || Xflg))) { 130 usage(); 131 } 132 133 /* If we're changing the system name */ 134 if (Sflg) { 135 int len = strlen(nodename); 136 137 if (len > SYS_NMLN - 1) { 138 (void) fprintf(stderr, gettext( 139 "uname: name must be <= %d letters\n"), 140 SYS_NMLN-1); 141 exit(1); 142 } 143 if (sysinfo(SI_SET_HOSTNAME, nodename, len) < 0) { 144 int err = errno; 145 (void) fprintf(stderr, gettext( 146 "uname: error in setting name: %s\n"), 147 strerror(err)); 148 exit(1); 149 } 150 return (0); 151 } 152 153 /* 154 * "uname -s" is the default 155 */ 156 if (!(sflg || nflg || rflg || vflg || mflg || pflg || iflg || 157 oflg || Xflg)) 158 sflg++; 159 if (sflg) { 160 (void) fprintf(stdout, fs, sizeof (un->sysname), 161 un->sysname); 162 fs = fmt_string; 163 } 164 if (nflg) { 165 (void) fprintf(stdout, fs, sizeof (un->nodename), un->nodename); 166 fs = fmt_string; 167 } 168 if (rflg) { 169 (void) fprintf(stdout, fs, sizeof (un->release), un->release); 170 fs = fmt_string; 171 } 172 if (vflg) { 173 (void) fprintf(stdout, fs, sizeof (un->version), un->version); 174 fs = fmt_string; 175 } 176 if (mflg) { 177 (void) fprintf(stdout, fs, sizeof (un->machine), un->machine); 178 fs = fmt_string; 179 } 180 if (pflg) { 181 if (sysinfo(SI_ARCHITECTURE, procbuf, sizeof (procbuf)) == -1) { 182 (void) fprintf(stderr, gettext( 183 "uname: sysinfo failed\n")); 184 exit(1); 185 } 186 (void) fprintf(stdout, fs, strlen(procbuf), procbuf); 187 fs = fmt_string; 188 } 189 if (iflg) { 190 if (sysinfo(SI_PLATFORM, procbuf, sizeof (procbuf)) == -1) { 191 (void) fprintf(stderr, gettext( 192 "uname: sysinfo failed\n")); 193 exit(1); 194 } 195 (void) fprintf(stdout, fs, strlen(procbuf), procbuf); 196 fs = fmt_string; 197 } 198 if (oflg) { 199 (void) fprintf(stdout, fs, strlen(OS_NAME), OS_NAME); 200 fs = fmt_string; 201 } 202 if (Xflg) { 203 int val; 204 205 (void) fprintf(stdout, "System = %.*s\n", sizeof (un->sysname), 206 un->sysname); 207 (void) fprintf(stdout, "Node = %.*s\n", sizeof (un->nodename), 208 un->nodename); 209 (void) fprintf(stdout, "Release = %.*s\n", sizeof (un->release), 210 un->release); 211 (void) fprintf(stdout, "KernelID = %.*s\n", 212 sizeof (un->version), un->version); 213 (void) fprintf(stdout, "Machine = %.*s\n", sizeof (un->machine), 214 un->machine); 215 216 /* Not availible on Solaris so hardcode the output */ 217 (void) fprintf(stdout, "BusType = <unknown>\n"); 218 219 /* Serialization is not supported in 2.6, so hard code output */ 220 (void) fprintf(stdout, "Serial = <unknown>\n"); 221 (void) fprintf(stdout, "Users = <unknown>\n"); 222 (void) fprintf(stdout, "OEM# = 0\n"); 223 (void) fprintf(stdout, "Origin# = 1\n"); 224 225 val = sysconf(_SC_NPROCESSORS_CONF); 226 (void) fprintf(stdout, "NumCPU = %d\n", val); 227 } 228 (void) putchar('\n'); 229 return (0); 230 } 231 232 static void 233 usage(void) 234 { 235 { 236 (void) fprintf(stderr, gettext( 237 "usage: uname [-snrvmapioX]\n" 238 " uname [-S system_name]\n")); 239 } 240 exit(1); 241 } 242