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
main(int argc,char * argv[],char * envp[])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
usage(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