xref: /freebsd/sys/compat/linux/linux_mib.c (revision 607d46ef28952f33bd8d2d28e20bf0d88a78dbd7)
1c6dfea0eSMarcel Moolenaar /*-
2c6dfea0eSMarcel Moolenaar  * Copyright (c) 1999 Marcel Moolenaar
3c6dfea0eSMarcel Moolenaar  * All rights reserved.
4c6dfea0eSMarcel Moolenaar  *
5c6dfea0eSMarcel Moolenaar  * Redistribution and use in source and binary forms, with or without
6c6dfea0eSMarcel Moolenaar  * modification, are permitted provided that the following conditions
7c6dfea0eSMarcel Moolenaar  * are met:
8c6dfea0eSMarcel Moolenaar  * 1. Redistributions of source code must retain the above copyright
9c6dfea0eSMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer
10c6dfea0eSMarcel Moolenaar  *    in this position and unchanged.
11c6dfea0eSMarcel Moolenaar  * 2. Redistributions in binary form must reproduce the above copyright
12c6dfea0eSMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer in the
13c6dfea0eSMarcel Moolenaar  *    documentation and/or other materials provided with the distribution.
14c6dfea0eSMarcel Moolenaar  * 3. The name of the author may not be used to endorse or promote products
15c6dfea0eSMarcel Moolenaar  *    derived from this software withough specific prior written permission
16c6dfea0eSMarcel Moolenaar  *
17c6dfea0eSMarcel Moolenaar  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18c6dfea0eSMarcel Moolenaar  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19c6dfea0eSMarcel Moolenaar  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20c6dfea0eSMarcel Moolenaar  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21c6dfea0eSMarcel Moolenaar  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22c6dfea0eSMarcel Moolenaar  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23c6dfea0eSMarcel Moolenaar  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24c6dfea0eSMarcel Moolenaar  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25c6dfea0eSMarcel Moolenaar  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26c6dfea0eSMarcel Moolenaar  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27c6dfea0eSMarcel Moolenaar  *
2828065282SPeter Wemm  * $FreeBSD$
29c6dfea0eSMarcel Moolenaar  */
30c6dfea0eSMarcel Moolenaar 
31c6dfea0eSMarcel Moolenaar #include <sys/param.h>
32c6dfea0eSMarcel Moolenaar #include <sys/kernel.h>
33c6dfea0eSMarcel Moolenaar #include <sys/systm.h>
34c6dfea0eSMarcel Moolenaar #include <sys/sysctl.h>
35c6dfea0eSMarcel Moolenaar #include <sys/proc.h>
36c6dfea0eSMarcel Moolenaar #include <sys/malloc.h>
37c6dfea0eSMarcel Moolenaar #include <sys/jail.h>
38c6dfea0eSMarcel Moolenaar 
39607d46efSMarcel Moolenaar #include <machine/../linux/linux.h>
40607d46efSMarcel Moolenaar #include <compat/linux/linux_mib.h>
41c6dfea0eSMarcel Moolenaar 
42c6dfea0eSMarcel Moolenaar struct linux_prison {
43c6dfea0eSMarcel Moolenaar 	char	pr_osname[LINUX_MAX_UTSNAME];
44c6dfea0eSMarcel Moolenaar 	char	pr_osrelease[LINUX_MAX_UTSNAME];
45c6dfea0eSMarcel Moolenaar 	int	pr_oss_version;
46c6dfea0eSMarcel Moolenaar };
47c6dfea0eSMarcel Moolenaar 
48c6dfea0eSMarcel Moolenaar SYSCTL_NODE(_compat, OID_AUTO, linux, CTLFLAG_RW, 0,
49c6dfea0eSMarcel Moolenaar 	    "Linux mode");
50c6dfea0eSMarcel Moolenaar 
51c6dfea0eSMarcel Moolenaar static char	linux_osname[LINUX_MAX_UTSNAME] = "Linux";
52c6dfea0eSMarcel Moolenaar 
53c6dfea0eSMarcel Moolenaar static int
5482d9ae4eSPoul-Henning Kamp linux_sysctl_osname(SYSCTL_HANDLER_ARGS)
55c6dfea0eSMarcel Moolenaar {
56c6dfea0eSMarcel Moolenaar 	char osname[LINUX_MAX_UTSNAME];
57c6dfea0eSMarcel Moolenaar 	int error;
58c6dfea0eSMarcel Moolenaar 
59c6dfea0eSMarcel Moolenaar 	strcpy(osname, linux_get_osname(req->p));
60c6dfea0eSMarcel Moolenaar 	error = sysctl_handle_string(oidp, osname, LINUX_MAX_UTSNAME, req);
61c6dfea0eSMarcel Moolenaar 	if (error || req->newptr == NULL)
62c6dfea0eSMarcel Moolenaar 		return (error);
63c6dfea0eSMarcel Moolenaar 	error = linux_set_osname(req->p, osname);
64c6dfea0eSMarcel Moolenaar 	return (error);
65c6dfea0eSMarcel Moolenaar }
66c6dfea0eSMarcel Moolenaar 
67c6dfea0eSMarcel Moolenaar SYSCTL_PROC(_compat_linux, OID_AUTO, osname,
68c6dfea0eSMarcel Moolenaar 	    CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON,
69c6dfea0eSMarcel Moolenaar 	    0, 0, linux_sysctl_osname, "A",
70c6dfea0eSMarcel Moolenaar 	    "Linux kernel OS name");
71c6dfea0eSMarcel Moolenaar 
72759eb461SMarcel Moolenaar static char	linux_osrelease[LINUX_MAX_UTSNAME] = "2.2.12";
73c6dfea0eSMarcel Moolenaar 
74c6dfea0eSMarcel Moolenaar static int
7582d9ae4eSPoul-Henning Kamp linux_sysctl_osrelease(SYSCTL_HANDLER_ARGS)
76c6dfea0eSMarcel Moolenaar {
77c6dfea0eSMarcel Moolenaar 	char osrelease[LINUX_MAX_UTSNAME];
78c6dfea0eSMarcel Moolenaar 	int error;
79c6dfea0eSMarcel Moolenaar 
80c6dfea0eSMarcel Moolenaar 	strcpy(osrelease, linux_get_osrelease(req->p));
81c6dfea0eSMarcel Moolenaar 	error = sysctl_handle_string(oidp, osrelease, LINUX_MAX_UTSNAME, req);
82c6dfea0eSMarcel Moolenaar 	if (error || req->newptr == NULL)
83c6dfea0eSMarcel Moolenaar 		return (error);
84c6dfea0eSMarcel Moolenaar 	error = linux_set_osrelease(req->p, osrelease);
85c6dfea0eSMarcel Moolenaar 	return (error);
86c6dfea0eSMarcel Moolenaar }
87c6dfea0eSMarcel Moolenaar 
88c6dfea0eSMarcel Moolenaar SYSCTL_PROC(_compat_linux, OID_AUTO, osrelease,
89c6dfea0eSMarcel Moolenaar 	    CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON,
90c6dfea0eSMarcel Moolenaar 	    0, 0, linux_sysctl_osrelease, "A",
91c6dfea0eSMarcel Moolenaar 	    "Linux kernel OS release");
92c6dfea0eSMarcel Moolenaar 
93c6dfea0eSMarcel Moolenaar static int	linux_oss_version = 0x030600;
94c6dfea0eSMarcel Moolenaar 
95c6dfea0eSMarcel Moolenaar static int
9682d9ae4eSPoul-Henning Kamp linux_sysctl_oss_version(SYSCTL_HANDLER_ARGS)
97c6dfea0eSMarcel Moolenaar {
98c6dfea0eSMarcel Moolenaar 	int oss_version;
99c6dfea0eSMarcel Moolenaar 	int error;
100c6dfea0eSMarcel Moolenaar 
101c6dfea0eSMarcel Moolenaar 	oss_version = linux_get_oss_version(req->p);
102c6dfea0eSMarcel Moolenaar 	error = sysctl_handle_int(oidp, &oss_version, 0, req);
103c6dfea0eSMarcel Moolenaar 	if (error || req->newptr == NULL)
104c6dfea0eSMarcel Moolenaar 		return (error);
105c6dfea0eSMarcel Moolenaar 	error = linux_set_oss_version(req->p, oss_version);
106c6dfea0eSMarcel Moolenaar 	return (error);
107c6dfea0eSMarcel Moolenaar }
108c6dfea0eSMarcel Moolenaar 
109c6dfea0eSMarcel Moolenaar SYSCTL_PROC(_compat_linux, OID_AUTO, oss_version,
110c6dfea0eSMarcel Moolenaar 	    CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_PRISON,
111c6dfea0eSMarcel Moolenaar 	    0, 0, linux_sysctl_oss_version, "I",
112c6dfea0eSMarcel Moolenaar 	    "Linux OSS version");
113c6dfea0eSMarcel Moolenaar 
114c6dfea0eSMarcel Moolenaar static struct linux_prison *
115c6dfea0eSMarcel Moolenaar get_prison(struct proc *p)
116c6dfea0eSMarcel Moolenaar {
117c6dfea0eSMarcel Moolenaar 	register struct prison *pr;
118c6dfea0eSMarcel Moolenaar 	register struct linux_prison *lpr;
119c6dfea0eSMarcel Moolenaar 
120c6dfea0eSMarcel Moolenaar 	pr = p->p_prison;
121c6dfea0eSMarcel Moolenaar 	if (pr == NULL)
122c6dfea0eSMarcel Moolenaar 		return (NULL);
123c6dfea0eSMarcel Moolenaar 
124c6dfea0eSMarcel Moolenaar 	if (pr->pr_linux == NULL) {
125c6dfea0eSMarcel Moolenaar 		MALLOC(lpr, struct linux_prison *, sizeof *lpr,
126c6dfea0eSMarcel Moolenaar 		       M_PRISON, M_WAITOK);
127c6dfea0eSMarcel Moolenaar 		bzero((caddr_t)lpr, sizeof *lpr);
128c6dfea0eSMarcel Moolenaar 		pr->pr_linux = lpr;
129c6dfea0eSMarcel Moolenaar 	}
130c6dfea0eSMarcel Moolenaar 
131c6dfea0eSMarcel Moolenaar 	return (pr->pr_linux);
132c6dfea0eSMarcel Moolenaar }
133c6dfea0eSMarcel Moolenaar 
134c6dfea0eSMarcel Moolenaar char *
135c6dfea0eSMarcel Moolenaar linux_get_osname(p)
136c6dfea0eSMarcel Moolenaar 	struct proc *p;
137c6dfea0eSMarcel Moolenaar {
138c6dfea0eSMarcel Moolenaar 	register struct prison *pr;
139c6dfea0eSMarcel Moolenaar 	register struct linux_prison *lpr;
140c6dfea0eSMarcel Moolenaar 
141c6dfea0eSMarcel Moolenaar 	pr = p->p_prison;
142c6dfea0eSMarcel Moolenaar 	if (pr != NULL && pr->pr_linux != NULL) {
143c6dfea0eSMarcel Moolenaar 		lpr = pr->pr_linux;
144c6dfea0eSMarcel Moolenaar 		if (lpr->pr_osname[0])
145c6dfea0eSMarcel Moolenaar 			return (lpr->pr_osname);
146c6dfea0eSMarcel Moolenaar 	}
147c6dfea0eSMarcel Moolenaar 
148c6dfea0eSMarcel Moolenaar 	return (linux_osname);
149c6dfea0eSMarcel Moolenaar }
150c6dfea0eSMarcel Moolenaar 
151c6dfea0eSMarcel Moolenaar int
152c6dfea0eSMarcel Moolenaar linux_set_osname(p, osname)
153c6dfea0eSMarcel Moolenaar 	struct proc *p;
154c6dfea0eSMarcel Moolenaar 	char *osname;
155c6dfea0eSMarcel Moolenaar {
156c6dfea0eSMarcel Moolenaar 	register struct linux_prison *lpr;
157c6dfea0eSMarcel Moolenaar 
158c6dfea0eSMarcel Moolenaar 	lpr = get_prison(p);
159c6dfea0eSMarcel Moolenaar 	if (lpr != NULL)
160c6dfea0eSMarcel Moolenaar 		strcpy(lpr->pr_osname, osname);
161c6dfea0eSMarcel Moolenaar 	else
162c6dfea0eSMarcel Moolenaar 		strcpy(linux_osname, osname);
163c6dfea0eSMarcel Moolenaar 
164c6dfea0eSMarcel Moolenaar 	return (0);
165c6dfea0eSMarcel Moolenaar }
166c6dfea0eSMarcel Moolenaar 
167c6dfea0eSMarcel Moolenaar char *
168c6dfea0eSMarcel Moolenaar linux_get_osrelease(p)
169c6dfea0eSMarcel Moolenaar 	struct proc *p;
170c6dfea0eSMarcel Moolenaar {
171c6dfea0eSMarcel Moolenaar 	register struct prison *pr;
172c6dfea0eSMarcel Moolenaar 	register struct linux_prison *lpr;
173c6dfea0eSMarcel Moolenaar 
174c6dfea0eSMarcel Moolenaar 	pr = p->p_prison;
175c6dfea0eSMarcel Moolenaar 	if (pr != NULL && pr->pr_linux != NULL) {
176c6dfea0eSMarcel Moolenaar 		lpr = pr->pr_linux;
177c6dfea0eSMarcel Moolenaar 		if (lpr->pr_osrelease[0])
178c6dfea0eSMarcel Moolenaar 			return (lpr->pr_osrelease);
179c6dfea0eSMarcel Moolenaar 	}
180c6dfea0eSMarcel Moolenaar 
181c6dfea0eSMarcel Moolenaar 	return (linux_osrelease);
182c6dfea0eSMarcel Moolenaar }
183c6dfea0eSMarcel Moolenaar 
184c6dfea0eSMarcel Moolenaar int
185c6dfea0eSMarcel Moolenaar linux_set_osrelease(p, osrelease)
186c6dfea0eSMarcel Moolenaar 	struct proc *p;
187c6dfea0eSMarcel Moolenaar 	char *osrelease;
188c6dfea0eSMarcel Moolenaar {
189c6dfea0eSMarcel Moolenaar 	register struct linux_prison *lpr;
190c6dfea0eSMarcel Moolenaar 
191c6dfea0eSMarcel Moolenaar 	lpr = get_prison(p);
192c6dfea0eSMarcel Moolenaar 	if (lpr != NULL)
193c6dfea0eSMarcel Moolenaar 		strcpy(lpr->pr_osrelease, osrelease);
194c6dfea0eSMarcel Moolenaar 	else
195c6dfea0eSMarcel Moolenaar 		strcpy(linux_osrelease, osrelease);
196c6dfea0eSMarcel Moolenaar 
197c6dfea0eSMarcel Moolenaar 	return (0);
198c6dfea0eSMarcel Moolenaar }
199c6dfea0eSMarcel Moolenaar 
200c6dfea0eSMarcel Moolenaar int
201c6dfea0eSMarcel Moolenaar linux_get_oss_version(p)
202c6dfea0eSMarcel Moolenaar 	struct proc *p;
203c6dfea0eSMarcel Moolenaar {
204c6dfea0eSMarcel Moolenaar 	register struct prison *pr;
205c6dfea0eSMarcel Moolenaar 	register struct linux_prison *lpr;
206c6dfea0eSMarcel Moolenaar 
207c6dfea0eSMarcel Moolenaar 	pr = p->p_prison;
208c6dfea0eSMarcel Moolenaar 	if (pr != NULL && pr->pr_linux != NULL) {
209c6dfea0eSMarcel Moolenaar 		lpr = pr->pr_linux;
210c6dfea0eSMarcel Moolenaar 		if (lpr->pr_oss_version)
211c6dfea0eSMarcel Moolenaar 			return (lpr->pr_oss_version);
212c6dfea0eSMarcel Moolenaar 	}
213c6dfea0eSMarcel Moolenaar 
214c6dfea0eSMarcel Moolenaar 	return (linux_oss_version);
215c6dfea0eSMarcel Moolenaar }
216c6dfea0eSMarcel Moolenaar 
217c6dfea0eSMarcel Moolenaar int
218c6dfea0eSMarcel Moolenaar linux_set_oss_version(p, oss_version)
219c6dfea0eSMarcel Moolenaar 	struct proc *p;
220c6dfea0eSMarcel Moolenaar 	int oss_version;
221c6dfea0eSMarcel Moolenaar {
222c6dfea0eSMarcel Moolenaar 	register struct linux_prison *lpr;
223c6dfea0eSMarcel Moolenaar 
224c6dfea0eSMarcel Moolenaar 	lpr = get_prison(p);
225c6dfea0eSMarcel Moolenaar 	if (lpr != NULL)
226c6dfea0eSMarcel Moolenaar 		lpr->pr_oss_version = oss_version;
227c6dfea0eSMarcel Moolenaar 	else
228c6dfea0eSMarcel Moolenaar 		linux_oss_version = oss_version;
229c6dfea0eSMarcel Moolenaar 
230c6dfea0eSMarcel Moolenaar 	return (0);
231c6dfea0eSMarcel Moolenaar }
232