/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * Copyright (c) 2012 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */ /* * University Copyright- Copyright (c) 1982, 1986, 1988 * The Regents of the University of California * All Rights Reserved * * University Acknowledgment- Portions of this document are derived from * software developed by the University of California, Berkeley, and its * contributors. */ #define __EXTENSIONS__ #include #include #include #include #include #include #include #include #include #include #include #include #define OS_NAME "illumos" static void usage(void); /* ARGSUSED */ int main(int argc, char *argv[], char *envp[]) { char *nodename; char *optstring = "asnrpvmioS:X"; int sflg = 0, nflg = 0, rflg = 0, vflg = 0, mflg = 0; int pflg = 0, iflg = 0, oflg = 0, Sflg = 0; int errflg = 0, optlet; int Xflg = 0; struct utsname unstr, *un; char fmt_string[] = " %.*s"; char *fs = &fmt_string[1]; char procbuf[SYS_NMLN]; (void) umask(~(S_IRWXU|S_IRGRP|S_IROTH) & S_IAMB); un = &unstr; (void) uname(un); (void) setlocale(LC_ALL, ""); #if !defined(TEXT_DOMAIN) #define TEXT_DOMAIN "SYS_TEST" #endif (void) textdomain(TEXT_DOMAIN); while ((optlet = getopt(argc, argv, optstring)) != EOF) switch (optlet) { case 'a': sflg++; nflg++; rflg++; vflg++; mflg++; pflg++; iflg++; break; case 's': sflg++; break; case 'n': nflg++; break; case 'r': rflg++; break; case 'v': vflg++; break; case 'm': mflg++; break; case 'p': pflg++; break; case 'i': iflg++; break; case 'o': oflg++; break; case 'S': Sflg++; nodename = optarg; break; case 'X': Xflg++; break; case '?': errflg++; } if (errflg || (optind != argc)) usage(); if ((Sflg > 1) || (Sflg && (sflg || nflg || rflg || vflg || mflg || pflg || iflg || oflg || Xflg))) { usage(); } /* If we're changing the system name */ if (Sflg) { int len = strlen(nodename); if (len > SYS_NMLN - 1) { (void) fprintf(stderr, gettext( "uname: name must be <= %d letters\n"), SYS_NMLN-1); exit(1); } if (sysinfo(SI_SET_HOSTNAME, nodename, len) < 0) { int err = errno; (void) fprintf(stderr, gettext( "uname: error in setting name: %s\n"), strerror(err)); exit(1); } return (0); } /* * "uname -s" is the default */ if (!(sflg || nflg || rflg || vflg || mflg || pflg || iflg || oflg || Xflg)) sflg++; if (sflg) { (void) fprintf(stdout, fs, sizeof (un->sysname), un->sysname); fs = fmt_string; } if (nflg) { (void) fprintf(stdout, fs, sizeof (un->nodename), un->nodename); fs = fmt_string; } if (rflg) { (void) fprintf(stdout, fs, sizeof (un->release), un->release); fs = fmt_string; } if (vflg) { (void) fprintf(stdout, fs, sizeof (un->version), un->version); fs = fmt_string; } if (mflg) { (void) fprintf(stdout, fs, sizeof (un->machine), un->machine); fs = fmt_string; } if (pflg) { if (sysinfo(SI_ARCHITECTURE, procbuf, sizeof (procbuf)) == -1) { (void) fprintf(stderr, gettext( "uname: sysinfo failed\n")); exit(1); } (void) fprintf(stdout, fs, strlen(procbuf), procbuf); fs = fmt_string; } if (iflg) { if (sysinfo(SI_PLATFORM, procbuf, sizeof (procbuf)) == -1) { (void) fprintf(stderr, gettext( "uname: sysinfo failed\n")); exit(1); } (void) fprintf(stdout, fs, strlen(procbuf), procbuf); fs = fmt_string; } if (oflg) { (void) fprintf(stdout, fs, strlen(OS_NAME), OS_NAME); fs = fmt_string; } if (Xflg) { int val; (void) fprintf(stdout, "System = %.*s\n", sizeof (un->sysname), un->sysname); (void) fprintf(stdout, "Node = %.*s\n", sizeof (un->nodename), un->nodename); (void) fprintf(stdout, "Release = %.*s\n", sizeof (un->release), un->release); (void) fprintf(stdout, "KernelID = %.*s\n", sizeof (un->version), un->version); (void) fprintf(stdout, "Machine = %.*s\n", sizeof (un->machine), un->machine); /* Not availible on Solaris so hardcode the output */ (void) fprintf(stdout, "BusType = \n"); /* Serialization is not supported in 2.6, so hard code output */ (void) fprintf(stdout, "Serial = \n"); (void) fprintf(stdout, "Users = \n"); (void) fprintf(stdout, "OEM# = 0\n"); (void) fprintf(stdout, "Origin# = 1\n"); val = sysconf(_SC_NPROCESSORS_CONF); (void) fprintf(stdout, "NumCPU = %d\n", val); } (void) putchar('\n'); return (0); } static void usage(void) { { (void) fprintf(stderr, gettext( "usage: uname [-snrvmapioX]\n" " uname [-S system_name]\n")); } exit(1); }