uname.c revision 117137
11590Srgrimes/*- 2103518Sjmallett * Copyright (c) 2002 Juli Mallett. 31590Srgrimes * Copyright (c) 1993 41590Srgrimes * The Regents of the University of California. All rights reserved. 51590Srgrimes * 61590Srgrimes * Redistribution and use in source and binary forms, with or without 71590Srgrimes * modification, are permitted provided that the following conditions 81590Srgrimes * are met: 91590Srgrimes * 1. Redistributions of source code must retain the above copyright 101590Srgrimes * notice, this list of conditions and the following disclaimer. 111590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 121590Srgrimes * notice, this list of conditions and the following disclaimer in the 131590Srgrimes * documentation and/or other materials provided with the distribution. 141590Srgrimes * 3. All advertising materials mentioning features or use of this software 151590Srgrimes * must display the following acknowledgement: 161590Srgrimes * This product includes software developed by the University of 171590Srgrimes * California, Berkeley and its contributors. 181590Srgrimes * 4. Neither the name of the University nor the names of its contributors 191590Srgrimes * may be used to endorse or promote products derived from this software 201590Srgrimes * without specific prior written permission. 211590Srgrimes * 221590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 231590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 241590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 251590Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 261590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 271590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 281590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 291590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 301590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 311590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 321590Srgrimes * SUCH DAMAGE. 331590Srgrimes */ 341590Srgrimes 3587696Smarkm#include <sys/cdefs.h> 3687696Smarkm 3787696Smarkm__FBSDID("$FreeBSD: head/usr.bin/uname/uname.c 117137 2003-07-01 20:15:28Z jmallett $"); 3887696Smarkm 391590Srgrimes#ifndef lint 4087696Smarkmstatic const char copyright[] = 411590Srgrimes"@(#) Copyright (c) 1993\n\ 421590Srgrimes The Regents of the University of California. All rights reserved.\n"; 4387696Smarkm#endif 441590Srgrimes 451590Srgrimes#ifndef lint 4687696Smarkmstatic const char sccsid[] = "@(#)uname.c 8.2 (Berkeley) 5/4/95"; 4787696Smarkm#endif 481590Srgrimes 491590Srgrimes#include <sys/param.h> 501590Srgrimes#include <sys/sysctl.h> 511590Srgrimes 521590Srgrimes#include <err.h> 531590Srgrimes#include <stdio.h> 541590Srgrimes#include <stdlib.h> 5523690Speter#include <unistd.h> 561590Srgrimes 571590Srgrimes#define MFLAG 0x01 581590Srgrimes#define NFLAG 0x02 5989346Snyan#define PFLAG 0x04 6089346Snyan#define RFLAG 0x08 6189346Snyan#define SFLAG 0x10 6289346Snyan#define VFLAG 0x20 63116085Sjmallett#define IFLAG 0x40 64103518Sjmallett 65103518Sjmalletttypedef void (*get_t)(void); 66116085Sjmallettget_t get_ident, get_platform, get_hostname, get_arch, get_release, get_sysname, get_version; 67103518Sjmallett 68116085Sjmallettvoid native_ident(void); 69103518Sjmallettvoid native_platform(void); 70103518Sjmallettvoid native_hostname(void); 71103518Sjmallettvoid native_arch(void); 72103518Sjmallettvoid native_release(void); 73103518Sjmallettvoid native_sysname(void); 74103518Sjmallettvoid native_version(void); 75103518Sjmallettvoid print_uname(u_int); 76103518Sjmallettvoid setup_get(void); 77103518Sjmallettvoid usage(void); 78103518Sjmallett 79116085Sjmallettchar *ident, *platform, *hostname, *arch, *release, *sysname, *version; 80103837Sjmallettint space; 81103518Sjmallett 82103518Sjmallettint 83103518Sjmallettmain(int argc, char *argv[]) 84103518Sjmallett{ 851590Srgrimes u_int flags; 86103518Sjmallett int ch; 871590Srgrimes 88103518Sjmallett setup_get(); 89103846Sjmallett flags = 0; 90103518Sjmallett 91116085Sjmallett while ((ch = getopt(argc, argv, "aimnprsv")) != -1) 921590Srgrimes switch(ch) { 931590Srgrimes case 'a': 941590Srgrimes flags |= (MFLAG | NFLAG | RFLAG | SFLAG | VFLAG); 951590Srgrimes break; 96116085Sjmallett case 'i': 97116085Sjmallett flags |= IFLAG; 98116085Sjmallett break; 991590Srgrimes case 'm': 1001590Srgrimes flags |= MFLAG; 1011590Srgrimes break; 1021590Srgrimes case 'n': 1031590Srgrimes flags |= NFLAG; 1041590Srgrimes break; 10589346Snyan case 'p': 10689346Snyan flags |= PFLAG; 10789346Snyan break; 1081590Srgrimes case 'r': 1091590Srgrimes flags |= RFLAG; 1101590Srgrimes break; 1111590Srgrimes case 's': 1121590Srgrimes flags |= SFLAG; 1131590Srgrimes break; 1141590Srgrimes case 'v': 1151590Srgrimes flags |= VFLAG; 1161590Srgrimes break; 1171590Srgrimes case '?': 1181590Srgrimes default: 1191590Srgrimes usage(); 1201590Srgrimes } 1211590Srgrimes 1221590Srgrimes argc -= optind; 1231590Srgrimes argv += optind; 1241590Srgrimes 1251590Srgrimes if (argc) 1261590Srgrimes usage(); 1271590Srgrimes 1281590Srgrimes if (!flags) 1291590Srgrimes flags |= SFLAG; 1301590Srgrimes 131103518Sjmallett print_uname(flags); 132103518Sjmallett exit(0); 133103518Sjmallett} 1341590Srgrimes 135103837Sjmallett#define CHECK_ENV(opt,var) \ 136103837Sjmallettdo { \ 137103518Sjmallett if ((var = getenv("UNAME_" opt)) == NULL) { \ 138103837Sjmallett get_##var = native_##var; \ 139103837Sjmallett } else { \ 140103837Sjmallett get_##var = (get_t)NULL; \ 141103837Sjmallett } \ 142103518Sjmallett} while (0) 143103518Sjmallett 144103518Sjmallettvoid 145103518Sjmallettsetup_get(void) 146103518Sjmallett{ 147103518Sjmallett CHECK_ENV("s", sysname); 148103518Sjmallett CHECK_ENV("n", hostname); 149103518Sjmallett CHECK_ENV("r", release); 150103518Sjmallett CHECK_ENV("v", version); 151103518Sjmallett CHECK_ENV("m", platform); 152103518Sjmallett CHECK_ENV("p", arch); 153116085Sjmallett CHECK_ENV("i", ident); 154103518Sjmallett} 155103518Sjmallett 156103518Sjmallett#define PRINT_FLAG(flags,flag,var) \ 157103518Sjmallett if ((flags & flag) == flag) { \ 158103837Sjmallett if (space) \ 159103837Sjmallett printf(" "); \ 160103837Sjmallett else \ 161103837Sjmallett space++; \ 162103518Sjmallett if (get_##var != NULL) \ 163103518Sjmallett (*get_##var)(); \ 164103837Sjmallett printf("%s", var); \ 1651590Srgrimes } 166103518Sjmallett 167103518Sjmallettvoid 168103518Sjmallettprint_uname(u_int flags) 169103518Sjmallett{ 170103518Sjmallett PRINT_FLAG(flags, SFLAG, sysname); 171103518Sjmallett PRINT_FLAG(flags, NFLAG, hostname); 172103518Sjmallett PRINT_FLAG(flags, RFLAG, release); 173103518Sjmallett PRINT_FLAG(flags, VFLAG, version); 174103518Sjmallett PRINT_FLAG(flags, MFLAG, platform); 175103518Sjmallett PRINT_FLAG(flags, PFLAG, arch); 176116085Sjmallett PRINT_FLAG(flags, IFLAG, ident); 177103518Sjmallett printf("\n"); 1781590Srgrimes} 1791590Srgrimes 180103846Sjmallett#define NATIVE_SYSCTL2_GET(var,mib0,mib1) \ 181103846Sjmallettvoid \ 182103846Sjmallettnative_##var(void) \ 183103846Sjmallett{ \ 184103846Sjmallett int mib[] = { (mib0), (mib1) }; \ 185103846Sjmallett size_t len; \ 186103846Sjmallett static char buf[1024]; \ 187103846Sjmallett char **varp = &(var); \ 188103846Sjmallett \ 189103846Sjmallett len = sizeof buf; \ 190103846Sjmallett if (sysctl(mib, sizeof mib / sizeof mib[0], \ 191103846Sjmallett &buf, &len, NULL, 0) == -1) \ 192103518Sjmallett err(1, "sysctl"); 193103518Sjmallett 194116088Sjmallett#define NATIVE_SYSCTLNAME_GET(var,name) \ 195116088Sjmallettvoid \ 196116088Sjmallettnative_##var(void) \ 197116088Sjmallett{ \ 198116088Sjmallett size_t len; \ 199116088Sjmallett static char buf[1024]; \ 200116088Sjmallett char **varp = &(var); \ 201116088Sjmallett \ 202117137Sjmallett len = sizeof buf; \ 203116088Sjmallett if (sysctlbyname(name, &buf, &len, NULL,\ 204116088Sjmallett 0) == -1) \ 205116088Sjmallett err(1, "sysctlbyname"); 206116088Sjmallett 207103846Sjmallett#define NATIVE_SET \ 208103846Sjmallett *varp = buf; \ 209103846Sjmallett return; \ 210103846Sjmallett} struct __hack 211103518Sjmallett 212103846Sjmallett#define NATIVE_BUFFER (buf) 213103846Sjmallett#define NATIVE_LENGTH (len) 214103518Sjmallett 215103846SjmallettNATIVE_SYSCTL2_GET(sysname, CTL_KERN, KERN_OSTYPE) { 216103846Sjmallett} NATIVE_SET; 217103518Sjmallett 218103846SjmallettNATIVE_SYSCTL2_GET(hostname, CTL_KERN, KERN_HOSTNAME) { 219103846Sjmallett} NATIVE_SET; 220103518Sjmallett 221103846SjmallettNATIVE_SYSCTL2_GET(release, CTL_KERN, KERN_OSRELEASE) { 222103846Sjmallett} NATIVE_SET; 223103846Sjmallett 224103846SjmallettNATIVE_SYSCTL2_GET(version, CTL_KERN, KERN_VERSION) { 225103846Sjmallett size_t n; 226103518Sjmallett char *p; 227103518Sjmallett 228103846Sjmallett p = NATIVE_BUFFER; 229103846Sjmallett n = NATIVE_LENGTH; 230103846Sjmallett for (; n--; ++p) 231103518Sjmallett if (*p == '\n' || *p == '\t') 232103518Sjmallett *p = ' '; 233103846Sjmallett} NATIVE_SET; 234103518Sjmallett 235103846SjmallettNATIVE_SYSCTL2_GET(platform, CTL_HW, HW_MACHINE) { 236103846Sjmallett} NATIVE_SET; 237103518Sjmallett 238103846SjmallettNATIVE_SYSCTL2_GET(arch, CTL_HW, HW_MACHINE_ARCH) { 239103846Sjmallett} NATIVE_SET; 240103518Sjmallett 241116088SjmallettNATIVE_SYSCTLNAME_GET(ident, "kern.ident") { 242116085Sjmallett} NATIVE_SET; 243116085Sjmallett 244103518Sjmallettvoid 245102944Sdwmaloneusage(void) 2461590Srgrimes{ 247116085Sjmallett fprintf(stderr, "usage: uname [-aimnprsv]\n"); 2481590Srgrimes exit(1); 2491590Srgrimes} 250