xref: /freebsd/sys/kern/kern_xxx.c (revision 52267f7411adcc76ede961420e08c0e42f42d415)
1 /*-
2  * Copyright (c) 1982, 1986, 1989, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 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  * 4. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *	@(#)kern_xxx.c	8.2 (Berkeley) 11/14/93
30  */
31 
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
34 
35 #include "opt_compat.h"
36 
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/sysproto.h>
40 #include <sys/kernel.h>
41 #include <sys/priv.h>
42 #include <sys/proc.h>
43 #include <sys/lock.h>
44 #include <sys/mutex.h>
45 #include <sys/sysctl.h>
46 #include <sys/utsname.h>
47 #include <sys/vimage.h>
48 
49 
50 #if defined(COMPAT_43)
51 
52 #ifndef _SYS_SYSPROTO_H_
53 struct gethostname_args {
54 	char	*hostname;
55 	u_int	len;
56 };
57 #endif
58 /* ARGSUSED */
59 int
60 ogethostname(td, uap)
61 	struct thread *td;
62 	struct gethostname_args *uap;
63 {
64 	int name[2];
65 	int error;
66 	size_t len = uap->len;
67 
68 	name[0] = CTL_KERN;
69 	name[1] = KERN_HOSTNAME;
70 	mtx_lock(&Giant);
71 	error = userland_sysctl(td, name, 2, uap->hostname, &len,
72 	    1, 0, 0, 0, 0);
73 	mtx_unlock(&Giant);
74 	return(error);
75 }
76 
77 #ifndef _SYS_SYSPROTO_H_
78 struct sethostname_args {
79 	char	*hostname;
80 	u_int	len;
81 };
82 #endif
83 /* ARGSUSED */
84 int
85 osethostname(td, uap)
86 	struct thread *td;
87 	register struct sethostname_args *uap;
88 {
89 	int name[2];
90 	int error;
91 
92 	name[0] = CTL_KERN;
93 	name[1] = KERN_HOSTNAME;
94 	mtx_lock(&Giant);
95 	error = userland_sysctl(td, name, 2, 0, 0, 0, uap->hostname,
96 	    uap->len, 0, 0);
97 	mtx_unlock(&Giant);
98 	return (error);
99 }
100 
101 #ifndef _SYS_SYSPROTO_H_
102 struct ogethostid_args {
103 	int	dummy;
104 };
105 #endif
106 /* ARGSUSED */
107 int
108 ogethostid(td, uap)
109 	struct thread *td;
110 	struct ogethostid_args *uap;
111 {
112 
113 	*(long *)(td->td_retval) = hostid;
114 	return (0);
115 }
116 #endif /* COMPAT_43 */
117 
118 #ifdef COMPAT_43
119 #ifndef _SYS_SYSPROTO_H_
120 struct osethostid_args {
121 	long	hostid;
122 };
123 #endif
124 /* ARGSUSED */
125 int
126 osethostid(td, uap)
127 	struct thread *td;
128 	struct osethostid_args *uap;
129 {
130 	int error;
131 
132 	error = priv_check(td, PRIV_SETHOSTID);
133 	if (error)
134 		return (error);
135 	mtx_lock(&Giant);
136 	hostid = uap->hostid;
137 	mtx_unlock(&Giant);
138 	return (0);
139 }
140 
141 int
142 oquota(td, uap)
143 	struct thread *td;
144 	struct oquota_args *uap;
145 {
146 
147 	return (ENOSYS);
148 }
149 #endif /* COMPAT_43 */
150 
151 #ifdef COMPAT_FREEBSD4
152 /*
153  * This is the FreeBSD-1.1 compatible uname(2) interface.  These days it is
154  * done in libc as a wrapper around a bunch of sysctl's.  This must maintain
155  * the old 1.1 binary ABI.
156  */
157 #if SYS_NMLN != 32
158 #error "FreeBSD-1.1 uname syscall has been broken"
159 #endif
160 #ifndef _SYS_SYSPROTO_H_
161 struct uname_args {
162 	struct utsname  *name;
163 };
164 #endif
165 /* ARGSUSED */
166 int
167 freebsd4_uname(struct thread *td, struct freebsd4_uname_args *uap)
168 {
169 	int name[2], error;
170 	size_t len;
171 	char *s, *us;
172 
173 	name[0] = CTL_KERN;
174 	name[1] = KERN_OSTYPE;
175 	len = sizeof (uap->name->sysname);
176 	mtx_lock(&Giant);
177 	error = userland_sysctl(td, name, 2, uap->name->sysname, &len,
178 		1, 0, 0, 0, 0);
179 	if (error)
180 		goto done2;
181 	subyte( uap->name->sysname + sizeof(uap->name->sysname) - 1, 0);
182 
183 	name[1] = KERN_HOSTNAME;
184 	len = sizeof uap->name->nodename;
185 	error = userland_sysctl(td, name, 2, uap->name->nodename, &len,
186 		1, 0, 0, 0, 0);
187 	if (error)
188 		goto done2;
189 	subyte( uap->name->nodename + sizeof(uap->name->nodename) - 1, 0);
190 
191 	name[1] = KERN_OSRELEASE;
192 	len = sizeof uap->name->release;
193 	error = userland_sysctl(td, name, 2, uap->name->release, &len,
194 		1, 0, 0, 0, 0);
195 	if (error)
196 		goto done2;
197 	subyte( uap->name->release + sizeof(uap->name->release) - 1, 0);
198 
199 /*
200 	name = KERN_VERSION;
201 	len = sizeof uap->name->version;
202 	error = userland_sysctl(td, name, 2, uap->name->version, &len,
203 		1, 0, 0, 0, 0);
204 	if (error)
205 		goto done2;
206 	subyte( uap->name->version + sizeof(uap->name->version) - 1, 0);
207 */
208 
209 /*
210  * this stupid hackery to make the version field look like FreeBSD 1.1
211  */
212 	for(s = version; *s && *s != '#'; s++);
213 
214 	for(us = uap->name->version; *s && *s != ':'; s++) {
215 		error = subyte( us++, *s);
216 		if (error)
217 			goto done2;
218 	}
219 	error = subyte( us++, 0);
220 	if (error)
221 		goto done2;
222 
223 	name[0] = CTL_HW;
224 	name[1] = HW_MACHINE;
225 	len = sizeof uap->name->machine;
226 	error = userland_sysctl(td, name, 2, uap->name->machine, &len,
227 		1, 0, 0, 0, 0);
228 	if (error)
229 		goto done2;
230 	subyte( uap->name->machine + sizeof(uap->name->machine) - 1, 0);
231 done2:
232 	mtx_unlock(&Giant);
233 	return (error);
234 }
235 
236 #ifndef _SYS_SYSPROTO_H_
237 struct getdomainname_args {
238 	char    *domainname;
239 	int     len;
240 };
241 #endif
242 /* ARGSUSED */
243 int
244 freebsd4_getdomainname(struct thread *td,
245     struct freebsd4_getdomainname_args *uap)
246 {
247 	int name[2];
248 	int error;
249 	size_t len = uap->len;
250 
251 	name[0] = CTL_KERN;
252 	name[1] = KERN_NISDOMAINNAME;
253 	mtx_lock(&Giant);
254 	error = userland_sysctl(td, name, 2, uap->domainname, &len,
255 	    1, 0, 0, 0, 0);
256 	mtx_unlock(&Giant);
257 	return(error);
258 }
259 
260 #ifndef _SYS_SYSPROTO_H_
261 struct setdomainname_args {
262 	char    *domainname;
263 	int     len;
264 };
265 #endif
266 /* ARGSUSED */
267 int
268 freebsd4_setdomainname(struct thread *td,
269     struct freebsd4_setdomainname_args *uap)
270 {
271 	int name[2];
272 	int error;
273 
274 	name[0] = CTL_KERN;
275 	name[1] = KERN_NISDOMAINNAME;
276 	mtx_lock(&Giant);
277 	error = userland_sysctl(td, name, 2, 0, 0, 0, uap->domainname,
278 	    uap->len, 0, 0);
279 	mtx_unlock(&Giant);
280 	return (error);
281 }
282 #endif /* COMPAT_FREEBSD4 */
283