11573Srgrimes/*-
21573Srgrimes * Copyright (c) 1994
31573Srgrimes *	The Regents of the University of California.  All rights reserved.
41573Srgrimes *
51573Srgrimes * Redistribution and use in source and binary forms, with or without
61573Srgrimes * modification, are permitted provided that the following conditions
71573Srgrimes * are met:
81573Srgrimes * 1. Redistributions of source code must retain the above copyright
91573Srgrimes *    notice, this list of conditions and the following disclaimer.
101573Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
111573Srgrimes *    notice, this list of conditions and the following disclaimer in the
121573Srgrimes *    documentation and/or other materials provided with the distribution.
131573Srgrimes * 4. Neither the name of the University nor the names of its contributors
141573Srgrimes *    may be used to endorse or promote products derived from this software
151573Srgrimes *    without specific prior written permission.
161573Srgrimes *
171573Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
181573Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
191573Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
201573Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
211573Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
221573Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
231573Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
241573Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
251573Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
261573Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
271573Srgrimes * SUCH DAMAGE.
281573Srgrimes */
291573Srgrimes
301573Srgrimes#if defined(LIBC_SCCS) && !defined(lint)
313565Swollman/*static char sccsid[] = "From: @(#)uname.c	8.1 (Berkeley) 1/4/94";*/
321573Srgrimes#endif /* LIBC_SCCS and not lint */
3390039Sobrien#include <sys/cdefs.h>
3490039Sobrien__FBSDID("$FreeBSD$");
351573Srgrimes
361573Srgrimes#include <sys/param.h>
371573Srgrimes#include <sys/sysctl.h>
381573Srgrimes#include <sys/utsname.h>
393565Swollman#include <errno.h>
40153009Sambrisko#include <stdlib.h>
41153009Sambrisko#include <string.h>
421573Srgrimes
431573Srgrimesint
4474729Speter__xuname(int namesize, void *namebuf)
451573Srgrimes{
461573Srgrimes	int mib[2], rval;
471573Srgrimes	size_t len;
48184177Skib	char *p, *q;
493565Swollman	int oerrno;
501573Srgrimes
511573Srgrimes	rval = 0;
52184177Skib	q = (char *)namebuf;
531573Srgrimes
541573Srgrimes	mib[0] = CTL_KERN;
55184177Skib
56184177Skib	if ((p = getenv("UNAME_s")))
57184177Skib		strlcpy(q, p, namesize);
58184177Skib	else {
59184177Skib		mib[1] = KERN_OSTYPE;
60184177Skib		len = namesize;
61184177Skib		oerrno = errno;
62184177Skib		if (sysctl(mib, 2, q, &len, NULL, 0) == -1) {
63184177Skib			if (errno == ENOMEM)
64184177Skib				errno = oerrno;
65184177Skib			else
66184177Skib				rval = -1;
67184177Skib		}
68184177Skib		q[namesize - 1] = '\0';
693565Swollman	}
70184177Skib	q += namesize;
711573Srgrimes
721573Srgrimes	mib[1] = KERN_HOSTNAME;
73184177Skib	len = namesize;
743565Swollman	oerrno = errno;
75184177Skib	if (sysctl(mib, 2, q, &len, NULL, 0) == -1) {
76184177Skib		if (errno == ENOMEM)
773565Swollman			errno = oerrno;
783565Swollman		else
793565Swollman			rval = -1;
803565Swollman	}
81184177Skib	q[namesize - 1] = '\0';
82184177Skib	q += namesize;
831573Srgrimes
84153002Sambrisko	if ((p = getenv("UNAME_r")))
85184177Skib		strlcpy(q, p, namesize);
86184177Skib	else {
87184177Skib		mib[1] = KERN_OSRELEASE;
88184177Skib		len = namesize;
89184177Skib		oerrno = errno;
90184177Skib		if (sysctl(mib, 2, q, &len, NULL, 0) == -1) {
91184177Skib			if (errno == ENOMEM)
92184177Skib				errno = oerrno;
939817Smpp			else
94184177Skib				rval = -1;
953565Swollman		}
96184177Skib		q[namesize - 1] = '\0';
973565Swollman	}
98184177Skib	q += namesize;
99184177Skib
100153002Sambrisko	if ((p = getenv("UNAME_v")))
101184177Skib		strlcpy(q, p, namesize);
102184177Skib	else {
1031573Srgrimes
104184177Skib		/*
105184177Skib		 * The version may have newlines in it, turn them into
106184177Skib		 * spaces.
107184177Skib		 */
108184177Skib		mib[1] = KERN_VERSION;
109184177Skib		len = namesize;
110184177Skib		oerrno = errno;
111184177Skib		if (sysctl(mib, 2, q, &len, NULL, 0) == -1) {
112184177Skib			if (errno == ENOMEM)
113184177Skib				errno = oerrno;
114184177Skib			else
115184177Skib				rval = -1;
116184177Skib		}
117184177Skib		q[namesize - 1] = '\0';
118184177Skib		for (p = q; len--; ++p) {
119184177Skib			if (*p == '\n' || *p == '\t') {
120184177Skib				if (len > 1)
121184177Skib					*p = ' ';
122184177Skib				else
123184177Skib					*p = '\0';
124184177Skib			}
125184177Skib		}
1263565Swollman	}
127184177Skib	q += namesize;
128184177Skib
129153002Sambrisko	if ((p = getenv("UNAME_m")))
130184177Skib		strlcpy(q, p, namesize);
131184177Skib	else {
132184177Skib		mib[0] = CTL_HW;
133184177Skib		mib[1] = HW_MACHINE;
134184177Skib		len = namesize;
135184177Skib		oerrno = errno;
136184185Skib		if (sysctl(mib, 2, q, &len, NULL, 0) == -1) {
137184177Skib			if (errno == ENOMEM)
138184177Skib				errno = oerrno;
139184177Skib			else
140184177Skib				rval = -1;
141184177Skib		}
142184177Skib		q[namesize - 1] = '\0';
143184177Skib	}
144184177Skib
1451573Srgrimes	return (rval);
1461573Srgrimes}
147