kern_xxx.c revision 31778
1160995Ssam/*
2160995Ssam * Copyright (c) 1982, 1986, 1989, 1993
3160995Ssam *	The Regents of the University of California.  All rights reserved.
4160995Ssam *
5160995Ssam * Redistribution and use in source and binary forms, with or without
6160995Ssam * modification, are permitted provided that the following conditions
7160995Ssam * are met:
8160995Ssam * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *	This product includes software developed by the University of
16 *	California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 *	@(#)kern_xxx.c	8.2 (Berkeley) 11/14/93
34 * $Id: kern_xxx.c,v 1.26 1997/11/06 19:29:18 phk Exp $
35 */
36
37#include "opt_compat.h"
38
39#include <sys/param.h>
40#include <sys/systm.h>
41#include <sys/sysproto.h>
42#include <sys/kernel.h>
43#include <sys/proc.h>
44#include <sys/sysctl.h>
45#include <sys/utsname.h>
46
47
48#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
49
50#ifndef _SYS_SYSPROTO_H_
51struct gethostname_args {
52	char	*hostname;
53	u_int	len;
54};
55#endif
56/* ARGSUSED */
57int
58ogethostname(p, uap)
59	struct proc *p;
60	struct gethostname_args *uap;
61{
62	int name[2];
63
64	name[0] = CTL_KERN;
65	name[1] = KERN_HOSTNAME;
66	return (userland_sysctl(p, name, 2, uap->hostname, &uap->len,
67		1, 0, 0, 0));
68}
69
70#ifndef _SYS_SYSPROTO_H_
71struct sethostname_args {
72	char	*hostname;
73	u_int	len;
74};
75#endif
76/* ARGSUSED */
77int
78osethostname(p, uap)
79	struct proc *p;
80	register struct sethostname_args *uap;
81{
82	int name[2];
83	int error;
84
85	name[0] = CTL_KERN;
86	name[1] = KERN_HOSTNAME;
87	if ((error = suser(p->p_ucred, &p->p_acflag)))
88		return (error);
89	return (userland_sysctl(p, name, 2, 0, 0, 0,
90		uap->hostname, uap->len, 0));
91}
92
93#ifndef _SYS_SYSPROTO_H_
94struct ogethostid_args {
95	int	dummy;
96};
97#endif
98/* ARGSUSED */
99int
100ogethostid(p, uap)
101	struct proc *p;
102	struct ogethostid_args *uap;
103{
104
105	*(long *)(p->p_retval) = hostid;
106	return (0);
107}
108#endif /* COMPAT_43 || COMPAT_SUNOS */
109
110#ifdef COMPAT_43
111#ifndef _SYS_SYSPROTO_H_
112struct osethostid_args {
113	long	hostid;
114};
115#endif
116/* ARGSUSED */
117int
118osethostid(p, uap)
119	struct proc *p;
120	struct osethostid_args *uap;
121{
122	int error;
123
124	if ((error = suser(p->p_ucred, &p->p_acflag)))
125		return (error);
126	hostid = uap->hostid;
127	return (0);
128}
129
130int
131oquota(p, uap)
132	struct proc *p;
133	struct oquota_args *uap;
134{
135
136	return (ENOSYS);
137}
138#endif /* COMPAT_43 */
139
140#ifndef _SYS_SYSPROTO_H_
141struct uname_args {
142        struct utsname  *name;
143};
144#endif
145
146/* ARGSUSED */
147int
148uname(p, uap)
149	struct proc *p;
150	struct uname_args *uap;
151{
152	int name[2], len, rtval;
153	char *s, *us;
154
155	name[0] = CTL_KERN;
156	name[1] = KERN_OSTYPE;
157	len = sizeof uap->name->sysname;
158	rtval = userland_sysctl(p, name, 2, uap->name->sysname, &len,
159		1, 0, 0, 0);
160	if( rtval) return rtval;
161	subyte( uap->name->sysname + sizeof(uap->name->sysname) - 1, 0);
162
163	name[1] = KERN_HOSTNAME;
164	len = sizeof uap->name->nodename;
165	rtval = userland_sysctl(p, name, 2, uap->name->nodename, &len,
166		1, 0, 0, 0);
167	if( rtval) return rtval;
168	subyte( uap->name->nodename + sizeof(uap->name->nodename) - 1, 0);
169
170	name[1] = KERN_OSRELEASE;
171	len = sizeof uap->name->release;
172	rtval = userland_sysctl(p, name, 2, uap->name->release, &len,
173		1, 0, 0, 0);
174	if( rtval) return rtval;
175	subyte( uap->name->release + sizeof(uap->name->release) - 1, 0);
176
177/*
178	name = KERN_VERSION;
179	len = sizeof uap->name->version;
180	rtval = userland_sysctl(p, name, 2, uap->name->version, &len,
181		1, 0, 0, 0);
182	if( rtval) return rtval;
183	subyte( uap->name->version + sizeof(uap->name->version) - 1, 0);
184*/
185
186/*
187 * this stupid hackery to make the version field look like FreeBSD 1.1
188 */
189	for(s = version; *s && *s != '#'; s++);
190
191	for(us = uap->name->version; *s && *s != ':'; s++) {
192		rtval = subyte( us++, *s);
193		if( rtval)
194			return rtval;
195	}
196	rtval = subyte( us++, 0);
197	if( rtval)
198		return rtval;
199
200	name[1] = HW_MACHINE;
201	len = sizeof uap->name->machine;
202	rtval = userland_sysctl(p, name, 2, uap->name->machine, &len,
203		1, 0, 0, 0);
204	if( rtval) return rtval;
205	subyte( uap->name->machine + sizeof(uap->name->machine) - 1, 0);
206
207	return 0;
208}
209
210#ifndef _SYS_SYSPROTO_H_
211struct getdomainname_args {
212        char    *domainname;
213        int     len;
214};
215#endif
216
217/* ARGSUSED */
218int
219getdomainname(p, uap)
220        struct proc *p;
221        struct getdomainname_args *uap;
222{
223	int domainnamelen = strlen(domainname) + 1;
224	if ((u_int)uap->len > domainnamelen + 1)
225		uap->len = domainnamelen + 1;
226	return (copyout((caddr_t)domainname, (caddr_t)uap->domainname, uap->len));
227}
228
229#ifndef _SYS_SYSPROTO_H_
230struct setdomainname_args {
231        char    *domainname;
232        int     len;
233};
234#endif
235
236/* ARGSUSED */
237int
238setdomainname(p, uap)
239        struct proc *p;
240        struct setdomainname_args *uap;
241{
242        int error, domainnamelen;
243
244        if ((error = suser(p->p_ucred, &p->p_acflag)))
245                return (error);
246        if ((u_int)uap->len > sizeof (domainname) - 1)
247                return EINVAL;
248        domainnamelen = uap->len;
249        error = copyin((caddr_t)uap->domainname, domainname, uap->len);
250        domainname[domainnamelen] = 0;
251        return (error);
252}
253
254