uname.c revision 116085
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 116085 2003-06-09 09:38:20Z 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
194103846Sjmallett#define	NATIVE_SET				\
195103846Sjmallett	*varp = buf;				\
196103846Sjmallett	return;					\
197103846Sjmallett}	struct __hack
198103518Sjmallett
199103846Sjmallett#define	NATIVE_BUFFER	(buf)
200103846Sjmallett#define	NATIVE_LENGTH	(len)
201103518Sjmallett
202103846SjmallettNATIVE_SYSCTL2_GET(sysname, CTL_KERN, KERN_OSTYPE) {
203103846Sjmallett} NATIVE_SET;
204103518Sjmallett
205103846SjmallettNATIVE_SYSCTL2_GET(hostname, CTL_KERN, KERN_HOSTNAME) {
206103846Sjmallett} NATIVE_SET;
207103518Sjmallett
208103846SjmallettNATIVE_SYSCTL2_GET(release, CTL_KERN, KERN_OSRELEASE) {
209103846Sjmallett} NATIVE_SET;
210103846Sjmallett
211103846SjmallettNATIVE_SYSCTL2_GET(version, CTL_KERN, KERN_VERSION) {
212103846Sjmallett	size_t n;
213103518Sjmallett	char *p;
214103518Sjmallett
215103846Sjmallett	p = NATIVE_BUFFER;
216103846Sjmallett	n = NATIVE_LENGTH;
217103846Sjmallett	for (; n--; ++p)
218103518Sjmallett		if (*p == '\n' || *p == '\t')
219103518Sjmallett			*p = ' ';
220103846Sjmallett} NATIVE_SET;
221103518Sjmallett
222103846SjmallettNATIVE_SYSCTL2_GET(platform, CTL_HW, HW_MACHINE) {
223103846Sjmallett} NATIVE_SET;
224103518Sjmallett
225103846SjmallettNATIVE_SYSCTL2_GET(arch, CTL_HW, HW_MACHINE_ARCH) {
226103846Sjmallett} NATIVE_SET;
227103518Sjmallett
228116085SjmallettNATIVE_SYSCTL2_GET(ident, CTL_KERN, KERN_IDENT) {
229116085Sjmallett} NATIVE_SET;
230116085Sjmallett
231103518Sjmallettvoid
232102944Sdwmaloneusage(void)
2331590Srgrimes{
234116085Sjmallett	fprintf(stderr, "usage: uname [-aimnprsv]\n");
2351590Srgrimes	exit(1);
2361590Srgrimes}
237