xref: /freebsd/lib/libc/gen/__xuname.c (revision 16511f59a93048ffe2d63f97845684f1b141a8b9)
158f0484fSRodney W. Grimes /*-
258f0484fSRodney W. Grimes  * Copyright (c) 1994
358f0484fSRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
458f0484fSRodney W. Grimes  *
558f0484fSRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
658f0484fSRodney W. Grimes  * modification, are permitted provided that the following conditions
758f0484fSRodney W. Grimes  * are met:
858f0484fSRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
958f0484fSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
1058f0484fSRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
1158f0484fSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
1258f0484fSRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
1358f0484fSRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
1458f0484fSRodney W. Grimes  *    may be used to endorse or promote products derived from this software
1558f0484fSRodney W. Grimes  *    without specific prior written permission.
1658f0484fSRodney W. Grimes  *
1758f0484fSRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1858f0484fSRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1958f0484fSRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2058f0484fSRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2158f0484fSRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2258f0484fSRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2358f0484fSRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2458f0484fSRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2558f0484fSRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2658f0484fSRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2758f0484fSRodney W. Grimes  * SUCH DAMAGE.
2858f0484fSRodney W. Grimes  */
2958f0484fSRodney W. Grimes 
3058f0484fSRodney W. Grimes #if defined(LIBC_SCCS) && !defined(lint)
31b938dc24SGarrett Wollman /*static char sccsid[] = "From: @(#)uname.c	8.1 (Berkeley) 1/4/94";*/
3258f0484fSRodney W. Grimes #endif /* LIBC_SCCS and not lint */
33ea8d448aSDavid E. O'Brien #include <sys/cdefs.h>
34ea8d448aSDavid E. O'Brien __FBSDID("$FreeBSD$");
3558f0484fSRodney W. Grimes 
3658f0484fSRodney W. Grimes #include <sys/param.h>
3758f0484fSRodney W. Grimes #include <sys/sysctl.h>
3858f0484fSRodney W. Grimes #include <sys/utsname.h>
39b938dc24SGarrett Wollman #include <errno.h>
4000bb0c6bSDoug Ambrisko #include <stdlib.h>
4100bb0c6bSDoug Ambrisko #include <string.h>
4258f0484fSRodney W. Grimes 
4358f0484fSRodney W. Grimes int
4432e47970SPeter Wemm __xuname(int namesize, void *namebuf)
4558f0484fSRodney W. Grimes {
4658f0484fSRodney W. Grimes 	int mib[2], rval;
4758f0484fSRodney W. Grimes 	size_t len;
4816511f59SKonstantin Belousov 	char *p, *q;
49b938dc24SGarrett Wollman 	int oerrno;
5058f0484fSRodney W. Grimes 
5158f0484fSRodney W. Grimes 	rval = 0;
5216511f59SKonstantin Belousov 	q = (char *)namebuf;
5358f0484fSRodney W. Grimes 
5458f0484fSRodney W. Grimes 	mib[0] = CTL_KERN;
5516511f59SKonstantin Belousov 
56d630a05fSDoug Ambrisko 	if ((p = getenv("UNAME_s")))
5716511f59SKonstantin Belousov 		strlcpy(q, p, namesize);
5816511f59SKonstantin Belousov 	else {
5916511f59SKonstantin Belousov 		mib[1] = KERN_OSTYPE;
6016511f59SKonstantin Belousov 		len = namesize;
6116511f59SKonstantin Belousov 		oerrno = errno;
6216511f59SKonstantin Belousov 		if (sysctl(mib, 2, q, &len, NULL, 0) == -1) {
6316511f59SKonstantin Belousov 			if (errno == ENOMEM)
6416511f59SKonstantin Belousov 				errno = oerrno;
6516511f59SKonstantin Belousov 			else
6616511f59SKonstantin Belousov 				rval = -1;
6716511f59SKonstantin Belousov 		}
6816511f59SKonstantin Belousov 		q[namesize - 1] = '\0';
6916511f59SKonstantin Belousov 	}
7016511f59SKonstantin Belousov 	q += namesize;
7158f0484fSRodney W. Grimes 
7258f0484fSRodney W. Grimes 	mib[1] = KERN_HOSTNAME;
7316511f59SKonstantin Belousov 	len = namesize;
74b938dc24SGarrett Wollman 	oerrno = errno;
7516511f59SKonstantin Belousov 	if (sysctl(mib, 2, q, &len, NULL, 0) == -1) {
76b938dc24SGarrett Wollman 		if (errno == ENOMEM)
77b938dc24SGarrett Wollman 			errno = oerrno;
78b938dc24SGarrett Wollman 		else
7958f0484fSRodney W. Grimes 			rval = -1;
80b938dc24SGarrett Wollman 	}
8116511f59SKonstantin Belousov 	q[namesize - 1] = '\0';
8216511f59SKonstantin Belousov 	q += namesize;
8358f0484fSRodney W. Grimes 
84d630a05fSDoug Ambrisko 	if ((p = getenv("UNAME_r")))
8516511f59SKonstantin Belousov 		strlcpy(q, p, namesize);
8616511f59SKonstantin Belousov 	else {
8716511f59SKonstantin Belousov 		mib[1] = KERN_OSRELEASE;
8816511f59SKonstantin Belousov 		len = namesize;
89b938dc24SGarrett Wollman 		oerrno = errno;
9016511f59SKonstantin Belousov 		if (sysctl(mib, 2, q, &len, NULL, 0) == -1) {
91b938dc24SGarrett Wollman 			if (errno == ENOMEM)
92b938dc24SGarrett Wollman 				errno = oerrno;
9358f0484fSRodney W. Grimes 			else
94b938dc24SGarrett Wollman 				rval = -1;
95a9680d71SMike Pritchard 		}
9616511f59SKonstantin Belousov 		q[namesize - 1] = '\0';
9716511f59SKonstantin Belousov 	}
9816511f59SKonstantin Belousov 	q += namesize;
9916511f59SKonstantin Belousov 
10016511f59SKonstantin Belousov 	if ((p = getenv("UNAME_v")))
10116511f59SKonstantin Belousov 		strlcpy(q, p, namesize);
10216511f59SKonstantin Belousov 	else {
10316511f59SKonstantin Belousov 
10416511f59SKonstantin Belousov 		/*
10516511f59SKonstantin Belousov 		 * The version may have newlines in it, turn them into
10616511f59SKonstantin Belousov 		 * spaces.
10716511f59SKonstantin Belousov 		 */
10816511f59SKonstantin Belousov 		mib[1] = KERN_VERSION;
10916511f59SKonstantin Belousov 		len = namesize;
11016511f59SKonstantin Belousov 		oerrno = errno;
11116511f59SKonstantin Belousov 		if (sysctl(mib, 2, q, &len, NULL, 0) == -1) {
11216511f59SKonstantin Belousov 			if (errno == ENOMEM)
11316511f59SKonstantin Belousov 				errno = oerrno;
11416511f59SKonstantin Belousov 			else
11516511f59SKonstantin Belousov 				rval = -1;
11616511f59SKonstantin Belousov 		}
11716511f59SKonstantin Belousov 		q[namesize - 1] = '\0';
11816511f59SKonstantin Belousov 		for (p = q; len--; ++p) {
119b938dc24SGarrett Wollman 			if (*p == '\n' || *p == '\t') {
12058f0484fSRodney W. Grimes 				if (len > 1)
12158f0484fSRodney W. Grimes 					*p = ' ';
12258f0484fSRodney W. Grimes 				else
12358f0484fSRodney W. Grimes 					*p = '\0';
124b938dc24SGarrett Wollman 			}
125b938dc24SGarrett Wollman 		}
12616511f59SKonstantin Belousov 	}
12716511f59SKonstantin Belousov 	q += namesize;
12858f0484fSRodney W. Grimes 
12916511f59SKonstantin Belousov 	if ((p = getenv("UNAME_m")))
13016511f59SKonstantin Belousov 		strlcpy(q, p, namesize);
13116511f59SKonstantin Belousov 	else {
13258f0484fSRodney W. Grimes 		mib[0] = CTL_HW;
13358f0484fSRodney W. Grimes 		mib[1] = HW_MACHINE;
13416511f59SKonstantin Belousov 		len = namesize;
135b938dc24SGarrett Wollman 		oerrno = errno;
13616511f59SKonstantin Belousov 		if (sysctl(mib, 2, &q, &len, NULL, 0) == -1) {
137b938dc24SGarrett Wollman 			if (errno == ENOMEM)
138b938dc24SGarrett Wollman 				errno = oerrno;
139b938dc24SGarrett Wollman 			else
14058f0484fSRodney W. Grimes 				rval = -1;
141b938dc24SGarrett Wollman 		}
14216511f59SKonstantin Belousov 		q[namesize - 1] = '\0';
14316511f59SKonstantin Belousov 	}
14416511f59SKonstantin Belousov 
14558f0484fSRodney W. Grimes 	return (rval);
14658f0484fSRodney W. Grimes }
147