init_sysctl.c revision 1.104.2.2 1 1.104.2.2 yamt /* $NetBSD: init_sysctl.c,v 1.104.2.2 2007/08/06 11:51:47 yamt Exp $ */
2 1.104.2.2 yamt
3 1.104.2.2 yamt /*-
4 1.104.2.2 yamt * Copyright (c) 2003 The NetBSD Foundation, Inc.
5 1.104.2.2 yamt * All rights reserved.
6 1.104.2.2 yamt *
7 1.104.2.2 yamt * This code is derived from software contributed to The NetBSD Foundation
8 1.104.2.2 yamt * by Andrew Brown.
9 1.104.2.2 yamt *
10 1.104.2.2 yamt * Redistribution and use in source and binary forms, with or without
11 1.104.2.2 yamt * modification, are permitted provided that the following conditions
12 1.104.2.2 yamt * are met:
13 1.104.2.2 yamt * 1. Redistributions of source code must retain the above copyright
14 1.104.2.2 yamt * notice, this list of conditions and the following disclaimer.
15 1.104.2.2 yamt * 2. Redistributions in binary form must reproduce the above copyright
16 1.104.2.2 yamt * notice, this list of conditions and the following disclaimer in the
17 1.104.2.2 yamt * documentation and/or other materials provided with the distribution.
18 1.104.2.2 yamt * 3. All advertising materials mentioning features or use of this software
19 1.104.2.2 yamt * must display the following acknowledgement:
20 1.104.2.2 yamt * This product includes software developed by the NetBSD
21 1.104.2.2 yamt * Foundation, Inc. and its contributors.
22 1.104.2.2 yamt * 4. Neither the name of The NetBSD Foundation nor the names of its
23 1.104.2.2 yamt * contributors may be used to endorse or promote products derived
24 1.104.2.2 yamt * from this software without specific prior written permission.
25 1.104.2.2 yamt *
26 1.104.2.2 yamt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 1.104.2.2 yamt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 1.104.2.2 yamt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 1.104.2.2 yamt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 1.104.2.2 yamt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 1.104.2.2 yamt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 1.104.2.2 yamt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 1.104.2.2 yamt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 1.104.2.2 yamt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 1.104.2.2 yamt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 1.104.2.2 yamt * POSSIBILITY OF SUCH DAMAGE.
37 1.104.2.2 yamt */
38 1.104.2.2 yamt
39 1.104.2.2 yamt #include <sys/cdefs.h>
40 1.104.2.2 yamt __KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.104.2.2 2007/08/06 11:51:47 yamt Exp $");
41 1.104.2.2 yamt
42 1.104.2.2 yamt #include "opt_sysv.h"
43 1.104.2.2 yamt #include "opt_multiprocessor.h"
44 1.104.2.2 yamt #include "opt_posix.h"
45 1.104.2.2 yamt #include "opt_compat_netbsd32.h"
46 1.104.2.2 yamt #include "opt_ktrace.h"
47 1.104.2.2 yamt #include "pty.h"
48 1.104.2.2 yamt #include "rnd.h"
49 1.104.2.2 yamt
50 1.104.2.2 yamt #include <sys/types.h>
51 1.104.2.2 yamt #include <sys/param.h>
52 1.104.2.2 yamt #include <sys/sysctl.h>
53 1.104.2.2 yamt #include <sys/cpu.h>
54 1.104.2.2 yamt #include <sys/errno.h>
55 1.104.2.2 yamt #include <sys/systm.h>
56 1.104.2.2 yamt #include <sys/kernel.h>
57 1.104.2.2 yamt #include <sys/unistd.h>
58 1.104.2.2 yamt #include <sys/disklabel.h>
59 1.104.2.2 yamt #include <sys/rnd.h>
60 1.104.2.2 yamt #include <sys/vnode.h>
61 1.104.2.2 yamt #include <sys/mount.h>
62 1.104.2.2 yamt #include <sys/namei.h>
63 1.104.2.2 yamt #include <sys/msgbuf.h>
64 1.104.2.2 yamt #include <dev/cons.h>
65 1.104.2.2 yamt #include <sys/socketvar.h>
66 1.104.2.2 yamt #include <sys/file.h>
67 1.104.2.2 yamt #include <sys/filedesc.h>
68 1.104.2.2 yamt #include <sys/tty.h>
69 1.104.2.2 yamt #include <sys/malloc.h>
70 1.104.2.2 yamt #include <sys/resource.h>
71 1.104.2.2 yamt #include <sys/resourcevar.h>
72 1.104.2.2 yamt #include <sys/exec.h>
73 1.104.2.2 yamt #include <sys/conf.h>
74 1.104.2.2 yamt #include <sys/device.h>
75 1.104.2.2 yamt #include <sys/stat.h>
76 1.104.2.2 yamt #include <sys/kauth.h>
77 1.104.2.2 yamt #ifdef KTRACE
78 1.104.2.2 yamt #include <sys/ktrace.h>
79 1.104.2.2 yamt #endif
80 1.104.2.2 yamt
81 1.104.2.2 yamt #ifdef COMPAT_NETBSD32
82 1.104.2.2 yamt #include <compat/netbsd32/netbsd32.h>
83 1.104.2.2 yamt #endif
84 1.104.2.2 yamt
85 1.104.2.2 yamt #include <machine/cpu.h>
86 1.104.2.2 yamt
87 1.104.2.2 yamt /* XXX this should not be here */
88 1.104.2.2 yamt int security_setidcore_dump;
89 1.104.2.2 yamt char security_setidcore_path[MAXPATHLEN] = "/var/crash/%n.core";
90 1.104.2.2 yamt uid_t security_setidcore_owner = 0;
91 1.104.2.2 yamt gid_t security_setidcore_group = 0;
92 1.104.2.2 yamt mode_t security_setidcore_mode = (S_IRUSR|S_IWUSR);
93 1.104.2.2 yamt
94 1.104.2.2 yamt static const u_int sysctl_flagmap[] = {
95 1.104.2.2 yamt PK_ADVLOCK, P_ADVLOCK,
96 1.104.2.2 yamt PK_EXEC, P_EXEC,
97 1.104.2.2 yamt PK_NOCLDWAIT, P_NOCLDWAIT,
98 1.104.2.2 yamt PK_32, P_32,
99 1.104.2.2 yamt PK_CLDSIGIGN, P_CLDSIGIGN,
100 1.104.2.2 yamt PK_PAXMPROTECT, P_PAXMPROTECT,
101 1.104.2.2 yamt PK_PAXNOMPROTECT, P_PAXNOMPROTECT,
102 1.104.2.2 yamt PK_SYSTRACE, P_SYSTRACE,
103 1.104.2.2 yamt PK_SUGID, P_SUGID,
104 1.104.2.2 yamt 0
105 1.104.2.2 yamt };
106 1.104.2.2 yamt
107 1.104.2.2 yamt static const u_int sysctl_sflagmap[] = {
108 1.104.2.2 yamt PS_NOCLDSTOP, P_NOCLDSTOP,
109 1.104.2.2 yamt PS_PPWAIT, P_PPWAIT,
110 1.104.2.2 yamt PS_WEXIT, P_WEXIT,
111 1.104.2.2 yamt PS_STOPFORK, P_STOPFORK,
112 1.104.2.2 yamt PS_STOPEXEC, P_STOPEXEC,
113 1.104.2.2 yamt PS_STOPEXIT, P_STOPEXIT,
114 1.104.2.2 yamt 0
115 1.104.2.2 yamt };
116 1.104.2.2 yamt
117 1.104.2.2 yamt static const u_int sysctl_slflagmap[] = {
118 1.104.2.2 yamt PSL_TRACED, P_TRACED,
119 1.104.2.2 yamt PSL_FSTRACE, P_FSTRACE,
120 1.104.2.2 yamt PSL_CHTRACED, P_CHTRACED,
121 1.104.2.2 yamt PSL_SYSCALL, P_SYSCALL,
122 1.104.2.2 yamt 0
123 1.104.2.2 yamt };
124 1.104.2.2 yamt
125 1.104.2.2 yamt static const u_int sysctl_lflagmap[] = {
126 1.104.2.2 yamt PL_CONTROLT, P_CONTROLT,
127 1.104.2.2 yamt 0
128 1.104.2.2 yamt };
129 1.104.2.2 yamt
130 1.104.2.2 yamt static const u_int sysctl_stflagmap[] = {
131 1.104.2.2 yamt PST_PROFIL, P_PROFIL,
132 1.104.2.2 yamt 0
133 1.104.2.2 yamt
134 1.104.2.2 yamt };
135 1.104.2.2 yamt
136 1.104.2.2 yamt static const u_int sysctl_lwpflagmap[] = {
137 1.104.2.2 yamt LW_INMEM, P_INMEM,
138 1.104.2.2 yamt LW_SINTR, P_SINTR,
139 1.104.2.2 yamt LW_SYSTEM, P_SYSTEM,
140 1.104.2.2 yamt 0
141 1.104.2.2 yamt };
142 1.104.2.2 yamt
143 1.104.2.2 yamt static const u_int sysctl_lwpprflagmap[] = {
144 1.104.2.2 yamt LPR_DETACHED, L_DETACHED,
145 1.104.2.2 yamt 0
146 1.104.2.2 yamt };
147 1.104.2.2 yamt
148 1.104.2.2 yamt
149 1.104.2.2 yamt /*
150 1.104.2.2 yamt * try over estimating by 5 procs/lwps
151 1.104.2.2 yamt */
152 1.104.2.2 yamt #define KERN_PROCSLOP (5 * sizeof(struct kinfo_proc))
153 1.104.2.2 yamt #define KERN_LWPSLOP (5 * sizeof(struct kinfo_lwp))
154 1.104.2.2 yamt
155 1.104.2.2 yamt #ifdef KTRACE
156 1.104.2.2 yamt int dcopyout(struct lwp *, const void *, void *, size_t);
157 1.104.2.2 yamt
158 1.104.2.2 yamt int
159 1.104.2.2 yamt dcopyout(l, kaddr, uaddr, len)
160 1.104.2.2 yamt struct lwp *l;
161 1.104.2.2 yamt const void *kaddr;
162 1.104.2.2 yamt void *uaddr;
163 1.104.2.2 yamt size_t len;
164 1.104.2.2 yamt {
165 1.104.2.2 yamt int error;
166 1.104.2.2 yamt
167 1.104.2.2 yamt error = copyout(kaddr, uaddr, len);
168 1.104.2.2 yamt if (!error && KTRPOINT(l->l_proc, KTR_MIB)) {
169 1.104.2.2 yamt struct iovec iov;
170 1.104.2.2 yamt
171 1.104.2.2 yamt iov.iov_base = uaddr;
172 1.104.2.2 yamt iov.iov_len = len;
173 1.104.2.2 yamt ktrgenio(l, -1, UIO_READ, &iov, len, 0);
174 1.104.2.2 yamt }
175 1.104.2.2 yamt return error;
176 1.104.2.2 yamt }
177 1.104.2.2 yamt #else /* !KTRACE */
178 1.104.2.2 yamt #define dcopyout(l, kaddr, uaddr, len) copyout(kaddr, uaddr, len)
179 1.104.2.2 yamt #endif /* KTRACE */
180 1.104.2.2 yamt
181 1.104.2.2 yamt #ifdef DIAGNOSTIC
182 1.104.2.2 yamt static int sysctl_kern_trigger_panic(SYSCTLFN_PROTO);
183 1.104.2.2 yamt #endif
184 1.104.2.2 yamt static int sysctl_kern_maxvnodes(SYSCTLFN_PROTO);
185 1.104.2.2 yamt static int sysctl_kern_rtc_offset(SYSCTLFN_PROTO);
186 1.104.2.2 yamt static int sysctl_kern_maxproc(SYSCTLFN_PROTO);
187 1.104.2.2 yamt static int sysctl_kern_hostid(SYSCTLFN_PROTO);
188 1.104.2.2 yamt static int sysctl_setlen(SYSCTLFN_PROTO);
189 1.104.2.2 yamt static int sysctl_kern_clockrate(SYSCTLFN_PROTO);
190 1.104.2.2 yamt static int sysctl_kern_file(SYSCTLFN_PROTO);
191 1.104.2.2 yamt static int sysctl_msgbuf(SYSCTLFN_PROTO);
192 1.104.2.2 yamt static int sysctl_kern_defcorename(SYSCTLFN_PROTO);
193 1.104.2.2 yamt static int sysctl_kern_cptime(SYSCTLFN_PROTO);
194 1.104.2.2 yamt #if NPTY > 0
195 1.104.2.2 yamt static int sysctl_kern_maxptys(SYSCTLFN_PROTO);
196 1.104.2.2 yamt #endif /* NPTY > 0 */
197 1.104.2.2 yamt static int sysctl_kern_sbmax(SYSCTLFN_PROTO);
198 1.104.2.2 yamt static int sysctl_kern_urnd(SYSCTLFN_PROTO);
199 1.104.2.2 yamt static int sysctl_kern_arnd(SYSCTLFN_PROTO);
200 1.104.2.2 yamt static int sysctl_kern_lwp(SYSCTLFN_PROTO);
201 1.104.2.2 yamt static int sysctl_kern_forkfsleep(SYSCTLFN_PROTO);
202 1.104.2.2 yamt static int sysctl_kern_root_partition(SYSCTLFN_PROTO);
203 1.104.2.2 yamt static int sysctl_kern_drivers(SYSCTLFN_PROTO);
204 1.104.2.2 yamt static int sysctl_kern_file2(SYSCTLFN_PROTO);
205 1.104.2.2 yamt static int sysctl_security_setidcore(SYSCTLFN_PROTO);
206 1.104.2.2 yamt static int sysctl_security_setidcorename(SYSCTLFN_PROTO);
207 1.104.2.2 yamt static int sysctl_kern_cpid(SYSCTLFN_PROTO);
208 1.104.2.2 yamt static int sysctl_doeproc(SYSCTLFN_PROTO);
209 1.104.2.2 yamt static int sysctl_kern_proc_args(SYSCTLFN_PROTO);
210 1.104.2.2 yamt static int sysctl_hw_usermem(SYSCTLFN_PROTO);
211 1.104.2.2 yamt static int sysctl_hw_cnmagic(SYSCTLFN_PROTO);
212 1.104.2.2 yamt static int sysctl_hw_ncpu(SYSCTLFN_PROTO);
213 1.104.2.2 yamt
214 1.104.2.2 yamt static u_int sysctl_map_flags(const u_int *, u_int);
215 1.104.2.2 yamt static void fill_kproc2(struct proc *, struct kinfo_proc2 *);
216 1.104.2.2 yamt static void fill_lwp(struct lwp *l, struct kinfo_lwp *kl);
217 1.104.2.2 yamt static void fill_file(struct kinfo_file *, const struct file *, struct proc *,
218 1.104.2.2 yamt int);
219 1.104.2.2 yamt
220 1.104.2.2 yamt /*
221 1.104.2.2 yamt * ********************************************************************
222 1.104.2.2 yamt * section 1: setup routines
223 1.104.2.2 yamt * ********************************************************************
224 1.104.2.2 yamt * these functions are stuffed into a link set for sysctl setup
225 1.104.2.2 yamt * functions. they're never called or referenced from anywhere else.
226 1.104.2.2 yamt * ********************************************************************
227 1.104.2.2 yamt */
228 1.104.2.2 yamt
229 1.104.2.2 yamt /*
230 1.104.2.2 yamt * sets up the base nodes...
231 1.104.2.2 yamt */
232 1.104.2.2 yamt SYSCTL_SETUP(sysctl_root_setup, "sysctl base setup")
233 1.104.2.2 yamt {
234 1.104.2.2 yamt
235 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
236 1.104.2.2 yamt CTLFLAG_PERMANENT,
237 1.104.2.2 yamt CTLTYPE_NODE, "kern",
238 1.104.2.2 yamt SYSCTL_DESCR("High kernel"),
239 1.104.2.2 yamt NULL, 0, NULL, 0,
240 1.104.2.2 yamt CTL_KERN, CTL_EOL);
241 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
242 1.104.2.2 yamt CTLFLAG_PERMANENT,
243 1.104.2.2 yamt CTLTYPE_NODE, "vm",
244 1.104.2.2 yamt SYSCTL_DESCR("Virtual memory"),
245 1.104.2.2 yamt NULL, 0, NULL, 0,
246 1.104.2.2 yamt CTL_VM, CTL_EOL);
247 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
248 1.104.2.2 yamt CTLFLAG_PERMANENT,
249 1.104.2.2 yamt CTLTYPE_NODE, "vfs",
250 1.104.2.2 yamt SYSCTL_DESCR("Filesystem"),
251 1.104.2.2 yamt NULL, 0, NULL, 0,
252 1.104.2.2 yamt CTL_VFS, CTL_EOL);
253 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
254 1.104.2.2 yamt CTLFLAG_PERMANENT,
255 1.104.2.2 yamt CTLTYPE_NODE, "net",
256 1.104.2.2 yamt SYSCTL_DESCR("Networking"),
257 1.104.2.2 yamt NULL, 0, NULL, 0,
258 1.104.2.2 yamt CTL_NET, CTL_EOL);
259 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
260 1.104.2.2 yamt CTLFLAG_PERMANENT,
261 1.104.2.2 yamt CTLTYPE_NODE, "debug",
262 1.104.2.2 yamt SYSCTL_DESCR("Debugging"),
263 1.104.2.2 yamt NULL, 0, NULL, 0,
264 1.104.2.2 yamt CTL_DEBUG, CTL_EOL);
265 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
266 1.104.2.2 yamt CTLFLAG_PERMANENT,
267 1.104.2.2 yamt CTLTYPE_NODE, "hw",
268 1.104.2.2 yamt SYSCTL_DESCR("Generic CPU, I/O"),
269 1.104.2.2 yamt NULL, 0, NULL, 0,
270 1.104.2.2 yamt CTL_HW, CTL_EOL);
271 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
272 1.104.2.2 yamt CTLFLAG_PERMANENT,
273 1.104.2.2 yamt CTLTYPE_NODE, "machdep",
274 1.104.2.2 yamt SYSCTL_DESCR("Machine dependent"),
275 1.104.2.2 yamt NULL, 0, NULL, 0,
276 1.104.2.2 yamt CTL_MACHDEP, CTL_EOL);
277 1.104.2.2 yamt /*
278 1.104.2.2 yamt * this node is inserted so that the sysctl nodes in libc can
279 1.104.2.2 yamt * operate.
280 1.104.2.2 yamt */
281 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
282 1.104.2.2 yamt CTLFLAG_PERMANENT,
283 1.104.2.2 yamt CTLTYPE_NODE, "user",
284 1.104.2.2 yamt SYSCTL_DESCR("User-level"),
285 1.104.2.2 yamt NULL, 0, NULL, 0,
286 1.104.2.2 yamt CTL_USER, CTL_EOL);
287 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
288 1.104.2.2 yamt CTLFLAG_PERMANENT,
289 1.104.2.2 yamt CTLTYPE_NODE, "ddb",
290 1.104.2.2 yamt SYSCTL_DESCR("In-kernel debugger"),
291 1.104.2.2 yamt NULL, 0, NULL, 0,
292 1.104.2.2 yamt CTL_DDB, CTL_EOL);
293 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
294 1.104.2.2 yamt CTLFLAG_PERMANENT,
295 1.104.2.2 yamt CTLTYPE_NODE, "proc",
296 1.104.2.2 yamt SYSCTL_DESCR("Per-process"),
297 1.104.2.2 yamt NULL, 0, NULL, 0,
298 1.104.2.2 yamt CTL_PROC, CTL_EOL);
299 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
300 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
301 1.104.2.2 yamt CTLTYPE_NODE, "vendor",
302 1.104.2.2 yamt SYSCTL_DESCR("Vendor specific"),
303 1.104.2.2 yamt NULL, 0, NULL, 0,
304 1.104.2.2 yamt CTL_VENDOR, CTL_EOL);
305 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
306 1.104.2.2 yamt CTLFLAG_PERMANENT,
307 1.104.2.2 yamt CTLTYPE_NODE, "emul",
308 1.104.2.2 yamt SYSCTL_DESCR("Emulation settings"),
309 1.104.2.2 yamt NULL, 0, NULL, 0,
310 1.104.2.2 yamt CTL_EMUL, CTL_EOL);
311 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
312 1.104.2.2 yamt CTLFLAG_PERMANENT,
313 1.104.2.2 yamt CTLTYPE_NODE, "security",
314 1.104.2.2 yamt SYSCTL_DESCR("Security"),
315 1.104.2.2 yamt NULL, 0, NULL, 0,
316 1.104.2.2 yamt CTL_SECURITY, CTL_EOL);
317 1.104.2.2 yamt }
318 1.104.2.2 yamt
319 1.104.2.2 yamt /*
320 1.104.2.2 yamt * this setup routine is a replacement for kern_sysctl()
321 1.104.2.2 yamt */
322 1.104.2.2 yamt SYSCTL_SETUP(sysctl_kern_setup, "sysctl kern subtree setup")
323 1.104.2.2 yamt {
324 1.104.2.2 yamt extern int kern_logsigexit; /* defined in kern/kern_sig.c */
325 1.104.2.2 yamt extern fixpt_t ccpu; /* defined in kern/kern_synch.c */
326 1.104.2.2 yamt extern int dumponpanic; /* defined in kern/subr_prf.c */
327 1.104.2.2 yamt const struct sysctlnode *rnode;
328 1.104.2.2 yamt
329 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
330 1.104.2.2 yamt CTLFLAG_PERMANENT,
331 1.104.2.2 yamt CTLTYPE_NODE, "kern", NULL,
332 1.104.2.2 yamt NULL, 0, NULL, 0,
333 1.104.2.2 yamt CTL_KERN, CTL_EOL);
334 1.104.2.2 yamt
335 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
336 1.104.2.2 yamt CTLFLAG_PERMANENT,
337 1.104.2.2 yamt CTLTYPE_STRING, "ostype",
338 1.104.2.2 yamt SYSCTL_DESCR("Operating system type"),
339 1.104.2.2 yamt NULL, 0, &ostype, 0,
340 1.104.2.2 yamt CTL_KERN, KERN_OSTYPE, CTL_EOL);
341 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
342 1.104.2.2 yamt CTLFLAG_PERMANENT,
343 1.104.2.2 yamt CTLTYPE_STRING, "osrelease",
344 1.104.2.2 yamt SYSCTL_DESCR("Operating system release"),
345 1.104.2.2 yamt NULL, 0, &osrelease, 0,
346 1.104.2.2 yamt CTL_KERN, KERN_OSRELEASE, CTL_EOL);
347 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
348 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
349 1.104.2.2 yamt CTLTYPE_INT, "osrevision",
350 1.104.2.2 yamt SYSCTL_DESCR("Operating system revision"),
351 1.104.2.2 yamt NULL, __NetBSD_Version__, NULL, 0,
352 1.104.2.2 yamt CTL_KERN, KERN_OSREV, CTL_EOL);
353 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
354 1.104.2.2 yamt CTLFLAG_PERMANENT,
355 1.104.2.2 yamt CTLTYPE_STRING, "version",
356 1.104.2.2 yamt SYSCTL_DESCR("Kernel version"),
357 1.104.2.2 yamt NULL, 0, &version, 0,
358 1.104.2.2 yamt CTL_KERN, KERN_VERSION, CTL_EOL);
359 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
360 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
361 1.104.2.2 yamt CTLTYPE_INT, "maxvnodes",
362 1.104.2.2 yamt SYSCTL_DESCR("Maximum number of vnodes"),
363 1.104.2.2 yamt sysctl_kern_maxvnodes, 0, NULL, 0,
364 1.104.2.2 yamt CTL_KERN, KERN_MAXVNODES, CTL_EOL);
365 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
366 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
367 1.104.2.2 yamt CTLTYPE_INT, "maxproc",
368 1.104.2.2 yamt SYSCTL_DESCR("Maximum number of simultaneous processes"),
369 1.104.2.2 yamt sysctl_kern_maxproc, 0, NULL, 0,
370 1.104.2.2 yamt CTL_KERN, KERN_MAXPROC, CTL_EOL);
371 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
372 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
373 1.104.2.2 yamt CTLTYPE_INT, "maxfiles",
374 1.104.2.2 yamt SYSCTL_DESCR("Maximum number of open files"),
375 1.104.2.2 yamt NULL, 0, &maxfiles, 0,
376 1.104.2.2 yamt CTL_KERN, KERN_MAXFILES, CTL_EOL);
377 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
378 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
379 1.104.2.2 yamt CTLTYPE_INT, "argmax",
380 1.104.2.2 yamt SYSCTL_DESCR("Maximum number of bytes of arguments to "
381 1.104.2.2 yamt "execve(2)"),
382 1.104.2.2 yamt NULL, ARG_MAX, NULL, 0,
383 1.104.2.2 yamt CTL_KERN, KERN_ARGMAX, CTL_EOL);
384 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
385 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
386 1.104.2.2 yamt CTLTYPE_STRING, "hostname",
387 1.104.2.2 yamt SYSCTL_DESCR("System hostname"),
388 1.104.2.2 yamt sysctl_setlen, 0, &hostname, MAXHOSTNAMELEN,
389 1.104.2.2 yamt CTL_KERN, KERN_HOSTNAME, CTL_EOL);
390 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
391 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE|CTLFLAG_HEX,
392 1.104.2.2 yamt CTLTYPE_INT, "hostid",
393 1.104.2.2 yamt SYSCTL_DESCR("System host ID number"),
394 1.104.2.2 yamt sysctl_kern_hostid, 0, NULL, 0,
395 1.104.2.2 yamt CTL_KERN, KERN_HOSTID, CTL_EOL);
396 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
397 1.104.2.2 yamt CTLFLAG_PERMANENT,
398 1.104.2.2 yamt CTLTYPE_STRUCT, "clockrate",
399 1.104.2.2 yamt SYSCTL_DESCR("Kernel clock rates"),
400 1.104.2.2 yamt sysctl_kern_clockrate, 0, NULL,
401 1.104.2.2 yamt sizeof(struct clockinfo),
402 1.104.2.2 yamt CTL_KERN, KERN_CLOCKRATE, CTL_EOL);
403 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
404 1.104.2.2 yamt CTLFLAG_PERMANENT,
405 1.104.2.2 yamt CTLTYPE_INT, "hardclock_ticks",
406 1.104.2.2 yamt SYSCTL_DESCR("Number of hardclock ticks"),
407 1.104.2.2 yamt NULL, 0, &hardclock_ticks, sizeof(hardclock_ticks),
408 1.104.2.2 yamt CTL_KERN, KERN_HARDCLOCK_TICKS, CTL_EOL);
409 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
410 1.104.2.2 yamt CTLFLAG_PERMANENT,
411 1.104.2.2 yamt CTLTYPE_STRUCT, "vnode",
412 1.104.2.2 yamt SYSCTL_DESCR("System vnode table"),
413 1.104.2.2 yamt sysctl_kern_vnode, 0, NULL, 0,
414 1.104.2.2 yamt CTL_KERN, KERN_VNODE, CTL_EOL);
415 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
416 1.104.2.2 yamt CTLFLAG_PERMANENT,
417 1.104.2.2 yamt CTLTYPE_STRUCT, "file",
418 1.104.2.2 yamt SYSCTL_DESCR("System open file table"),
419 1.104.2.2 yamt sysctl_kern_file, 0, NULL, 0,
420 1.104.2.2 yamt CTL_KERN, KERN_FILE, CTL_EOL);
421 1.104.2.2 yamt #ifndef GPROF
422 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
423 1.104.2.2 yamt CTLFLAG_PERMANENT,
424 1.104.2.2 yamt CTLTYPE_NODE, "profiling",
425 1.104.2.2 yamt SYSCTL_DESCR("Profiling information (not available)"),
426 1.104.2.2 yamt sysctl_notavail, 0, NULL, 0,
427 1.104.2.2 yamt CTL_KERN, KERN_PROF, CTL_EOL);
428 1.104.2.2 yamt #endif
429 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
430 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
431 1.104.2.2 yamt CTLTYPE_INT, "posix1version",
432 1.104.2.2 yamt SYSCTL_DESCR("Version of ISO/IEC 9945 (POSIX 1003.1) "
433 1.104.2.2 yamt "with which the operating system attempts "
434 1.104.2.2 yamt "to comply"),
435 1.104.2.2 yamt NULL, _POSIX_VERSION, NULL, 0,
436 1.104.2.2 yamt CTL_KERN, KERN_POSIX1, CTL_EOL);
437 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
438 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
439 1.104.2.2 yamt CTLTYPE_INT, "ngroups",
440 1.104.2.2 yamt SYSCTL_DESCR("Maximum number of supplemental groups"),
441 1.104.2.2 yamt NULL, NGROUPS_MAX, NULL, 0,
442 1.104.2.2 yamt CTL_KERN, KERN_NGROUPS, CTL_EOL);
443 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
444 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
445 1.104.2.2 yamt CTLTYPE_INT, "job_control",
446 1.104.2.2 yamt SYSCTL_DESCR("Whether job control is available"),
447 1.104.2.2 yamt NULL, 1, NULL, 0,
448 1.104.2.2 yamt CTL_KERN, KERN_JOB_CONTROL, CTL_EOL);
449 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
450 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
451 1.104.2.2 yamt CTLTYPE_INT, "saved_ids",
452 1.104.2.2 yamt SYSCTL_DESCR("Whether POSIX saved set-group/user ID is "
453 1.104.2.2 yamt "available"), NULL,
454 1.104.2.2 yamt #ifdef _POSIX_SAVED_IDS
455 1.104.2.2 yamt 1,
456 1.104.2.2 yamt #else /* _POSIX_SAVED_IDS */
457 1.104.2.2 yamt 0,
458 1.104.2.2 yamt #endif /* _POSIX_SAVED_IDS */
459 1.104.2.2 yamt NULL, 0, CTL_KERN, KERN_SAVED_IDS, CTL_EOL);
460 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
461 1.104.2.2 yamt CTLFLAG_PERMANENT,
462 1.104.2.2 yamt CTLTYPE_STRUCT, "boottime",
463 1.104.2.2 yamt SYSCTL_DESCR("System boot time"),
464 1.104.2.2 yamt NULL, 0, &boottime, sizeof(boottime),
465 1.104.2.2 yamt CTL_KERN, KERN_BOOTTIME, CTL_EOL);
466 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
467 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
468 1.104.2.2 yamt CTLTYPE_STRING, "domainname",
469 1.104.2.2 yamt SYSCTL_DESCR("YP domain name"),
470 1.104.2.2 yamt sysctl_setlen, 0, &domainname, MAXHOSTNAMELEN,
471 1.104.2.2 yamt CTL_KERN, KERN_DOMAINNAME, CTL_EOL);
472 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
473 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
474 1.104.2.2 yamt CTLTYPE_INT, "maxpartitions",
475 1.104.2.2 yamt SYSCTL_DESCR("Maximum number of partitions allowed per "
476 1.104.2.2 yamt "disk"),
477 1.104.2.2 yamt NULL, MAXPARTITIONS, NULL, 0,
478 1.104.2.2 yamt CTL_KERN, KERN_MAXPARTITIONS, CTL_EOL);
479 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
480 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
481 1.104.2.2 yamt CTLTYPE_INT, "rawpartition",
482 1.104.2.2 yamt SYSCTL_DESCR("Raw partition of a disk"),
483 1.104.2.2 yamt NULL, RAW_PART, NULL, 0,
484 1.104.2.2 yamt CTL_KERN, KERN_RAWPARTITION, CTL_EOL);
485 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
486 1.104.2.2 yamt CTLFLAG_PERMANENT,
487 1.104.2.2 yamt CTLTYPE_STRUCT, "timex", NULL,
488 1.104.2.2 yamt sysctl_notavail, 0, NULL, 0,
489 1.104.2.2 yamt CTL_KERN, KERN_TIMEX, CTL_EOL);
490 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
491 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
492 1.104.2.2 yamt CTLTYPE_INT, "rtc_offset",
493 1.104.2.2 yamt SYSCTL_DESCR("Offset of real time clock from UTC in "
494 1.104.2.2 yamt "minutes"),
495 1.104.2.2 yamt sysctl_kern_rtc_offset, 0, &rtc_offset, 0,
496 1.104.2.2 yamt CTL_KERN, KERN_RTC_OFFSET, CTL_EOL);
497 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
498 1.104.2.2 yamt CTLFLAG_PERMANENT,
499 1.104.2.2 yamt CTLTYPE_STRING, "root_device",
500 1.104.2.2 yamt SYSCTL_DESCR("Name of the root device"),
501 1.104.2.2 yamt sysctl_root_device, 0, NULL, 0,
502 1.104.2.2 yamt CTL_KERN, KERN_ROOT_DEVICE, CTL_EOL);
503 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
504 1.104.2.2 yamt CTLFLAG_PERMANENT,
505 1.104.2.2 yamt CTLTYPE_INT, "msgbufsize",
506 1.104.2.2 yamt SYSCTL_DESCR("Size of the kernel message buffer"),
507 1.104.2.2 yamt sysctl_msgbuf, 0, NULL, 0,
508 1.104.2.2 yamt CTL_KERN, KERN_MSGBUFSIZE, CTL_EOL);
509 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
510 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
511 1.104.2.2 yamt CTLTYPE_INT, "fsync",
512 1.104.2.2 yamt SYSCTL_DESCR("Whether the POSIX 1003.1b File "
513 1.104.2.2 yamt "Synchronization Option is available on "
514 1.104.2.2 yamt "this system"),
515 1.104.2.2 yamt NULL, 1, NULL, 0,
516 1.104.2.2 yamt CTL_KERN, KERN_FSYNC, CTL_EOL);
517 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
518 1.104.2.2 yamt CTLFLAG_PERMANENT,
519 1.104.2.2 yamt CTLTYPE_NODE, "ipc",
520 1.104.2.2 yamt SYSCTL_DESCR("SysV IPC options"),
521 1.104.2.2 yamt NULL, 0, NULL, 0,
522 1.104.2.2 yamt CTL_KERN, KERN_SYSVIPC, CTL_EOL);
523 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
524 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
525 1.104.2.2 yamt CTLTYPE_INT, "sysvmsg",
526 1.104.2.2 yamt SYSCTL_DESCR("System V style message support available"),
527 1.104.2.2 yamt NULL,
528 1.104.2.2 yamt #ifdef SYSVMSG
529 1.104.2.2 yamt 1,
530 1.104.2.2 yamt #else /* SYSVMSG */
531 1.104.2.2 yamt 0,
532 1.104.2.2 yamt #endif /* SYSVMSG */
533 1.104.2.2 yamt NULL, 0, CTL_KERN, KERN_SYSVIPC, KERN_SYSVIPC_MSG, CTL_EOL);
534 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
535 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
536 1.104.2.2 yamt CTLTYPE_INT, "sysvsem",
537 1.104.2.2 yamt SYSCTL_DESCR("System V style semaphore support "
538 1.104.2.2 yamt "available"), NULL,
539 1.104.2.2 yamt #ifdef SYSVSEM
540 1.104.2.2 yamt 1,
541 1.104.2.2 yamt #else /* SYSVSEM */
542 1.104.2.2 yamt 0,
543 1.104.2.2 yamt #endif /* SYSVSEM */
544 1.104.2.2 yamt NULL, 0, CTL_KERN, KERN_SYSVIPC, KERN_SYSVIPC_SEM, CTL_EOL);
545 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
546 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
547 1.104.2.2 yamt CTLTYPE_INT, "sysvshm",
548 1.104.2.2 yamt SYSCTL_DESCR("System V style shared memory support "
549 1.104.2.2 yamt "available"), NULL,
550 1.104.2.2 yamt #ifdef SYSVSHM
551 1.104.2.2 yamt 1,
552 1.104.2.2 yamt #else /* SYSVSHM */
553 1.104.2.2 yamt 0,
554 1.104.2.2 yamt #endif /* SYSVSHM */
555 1.104.2.2 yamt NULL, 0, CTL_KERN, KERN_SYSVIPC, KERN_SYSVIPC_SHM, CTL_EOL);
556 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
557 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
558 1.104.2.2 yamt CTLTYPE_INT, "synchronized_io",
559 1.104.2.2 yamt SYSCTL_DESCR("Whether the POSIX 1003.1b Synchronized "
560 1.104.2.2 yamt "I/O Option is available on this system"),
561 1.104.2.2 yamt NULL, 1, NULL, 0,
562 1.104.2.2 yamt CTL_KERN, KERN_SYNCHRONIZED_IO, CTL_EOL);
563 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
564 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
565 1.104.2.2 yamt CTLTYPE_INT, "iov_max",
566 1.104.2.2 yamt SYSCTL_DESCR("Maximum number of iovec structures per "
567 1.104.2.2 yamt "process"),
568 1.104.2.2 yamt NULL, IOV_MAX, NULL, 0,
569 1.104.2.2 yamt CTL_KERN, KERN_IOV_MAX, CTL_EOL);
570 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
571 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
572 1.104.2.2 yamt CTLTYPE_INT, "mapped_files",
573 1.104.2.2 yamt SYSCTL_DESCR("Whether the POSIX 1003.1b Memory Mapped "
574 1.104.2.2 yamt "Files Option is available on this system"),
575 1.104.2.2 yamt NULL, 1, NULL, 0,
576 1.104.2.2 yamt CTL_KERN, KERN_MAPPED_FILES, CTL_EOL);
577 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
578 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
579 1.104.2.2 yamt CTLTYPE_INT, "memlock",
580 1.104.2.2 yamt SYSCTL_DESCR("Whether the POSIX 1003.1b Process Memory "
581 1.104.2.2 yamt "Locking Option is available on this "
582 1.104.2.2 yamt "system"),
583 1.104.2.2 yamt NULL, 1, NULL, 0,
584 1.104.2.2 yamt CTL_KERN, KERN_MEMLOCK, CTL_EOL);
585 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
586 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
587 1.104.2.2 yamt CTLTYPE_INT, "memlock_range",
588 1.104.2.2 yamt SYSCTL_DESCR("Whether the POSIX 1003.1b Range Memory "
589 1.104.2.2 yamt "Locking Option is available on this "
590 1.104.2.2 yamt "system"),
591 1.104.2.2 yamt NULL, 1, NULL, 0,
592 1.104.2.2 yamt CTL_KERN, KERN_MEMLOCK_RANGE, CTL_EOL);
593 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
594 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
595 1.104.2.2 yamt CTLTYPE_INT, "memory_protection",
596 1.104.2.2 yamt SYSCTL_DESCR("Whether the POSIX 1003.1b Memory "
597 1.104.2.2 yamt "Protection Option is available on this "
598 1.104.2.2 yamt "system"),
599 1.104.2.2 yamt NULL, 1, NULL, 0,
600 1.104.2.2 yamt CTL_KERN, KERN_MEMORY_PROTECTION, CTL_EOL);
601 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
602 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
603 1.104.2.2 yamt CTLTYPE_INT, "login_name_max",
604 1.104.2.2 yamt SYSCTL_DESCR("Maximum login name length"),
605 1.104.2.2 yamt NULL, LOGIN_NAME_MAX, NULL, 0,
606 1.104.2.2 yamt CTL_KERN, KERN_LOGIN_NAME_MAX, CTL_EOL);
607 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
608 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
609 1.104.2.2 yamt CTLTYPE_STRING, "defcorename",
610 1.104.2.2 yamt SYSCTL_DESCR("Default core file name"),
611 1.104.2.2 yamt sysctl_kern_defcorename, 0, defcorename, MAXPATHLEN,
612 1.104.2.2 yamt CTL_KERN, KERN_DEFCORENAME, CTL_EOL);
613 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
614 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
615 1.104.2.2 yamt CTLTYPE_INT, "logsigexit",
616 1.104.2.2 yamt SYSCTL_DESCR("Log process exit when caused by signals"),
617 1.104.2.2 yamt NULL, 0, &kern_logsigexit, 0,
618 1.104.2.2 yamt CTL_KERN, KERN_LOGSIGEXIT, CTL_EOL);
619 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
620 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
621 1.104.2.2 yamt CTLTYPE_INT, "fscale",
622 1.104.2.2 yamt SYSCTL_DESCR("Kernel fixed-point scale factor"),
623 1.104.2.2 yamt NULL, FSCALE, NULL, 0,
624 1.104.2.2 yamt CTL_KERN, KERN_FSCALE, CTL_EOL);
625 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
626 1.104.2.2 yamt CTLFLAG_PERMANENT,
627 1.104.2.2 yamt CTLTYPE_INT, "ccpu",
628 1.104.2.2 yamt SYSCTL_DESCR("Scheduler exponential decay value"),
629 1.104.2.2 yamt NULL, 0, &ccpu, 0,
630 1.104.2.2 yamt CTL_KERN, KERN_CCPU, CTL_EOL);
631 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
632 1.104.2.2 yamt CTLFLAG_PERMANENT,
633 1.104.2.2 yamt CTLTYPE_STRUCT, "cp_time",
634 1.104.2.2 yamt SYSCTL_DESCR("Clock ticks spent in different CPU states"),
635 1.104.2.2 yamt sysctl_kern_cptime, 0, NULL, 0,
636 1.104.2.2 yamt CTL_KERN, KERN_CP_TIME, CTL_EOL);
637 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
638 1.104.2.2 yamt CTLFLAG_PERMANENT,
639 1.104.2.2 yamt CTLTYPE_INT, "msgbuf",
640 1.104.2.2 yamt SYSCTL_DESCR("Kernel message buffer"),
641 1.104.2.2 yamt sysctl_msgbuf, 0, NULL, 0,
642 1.104.2.2 yamt CTL_KERN, KERN_MSGBUF, CTL_EOL);
643 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
644 1.104.2.2 yamt CTLFLAG_PERMANENT,
645 1.104.2.2 yamt CTLTYPE_STRUCT, "consdev",
646 1.104.2.2 yamt SYSCTL_DESCR("Console device"),
647 1.104.2.2 yamt sysctl_consdev, 0, NULL, sizeof(dev_t),
648 1.104.2.2 yamt CTL_KERN, KERN_CONSDEV, CTL_EOL);
649 1.104.2.2 yamt #if NPTY > 0
650 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
651 1.104.2.2 yamt CTLFLAG_PERMANENT,
652 1.104.2.2 yamt CTLTYPE_INT, "maxptys",
653 1.104.2.2 yamt SYSCTL_DESCR("Maximum number of pseudo-ttys"),
654 1.104.2.2 yamt sysctl_kern_maxptys, 0, NULL, 0,
655 1.104.2.2 yamt CTL_KERN, KERN_MAXPTYS, CTL_EOL);
656 1.104.2.2 yamt #endif /* NPTY > 0 */
657 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
658 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
659 1.104.2.2 yamt CTLTYPE_INT, "maxphys",
660 1.104.2.2 yamt SYSCTL_DESCR("Maximum raw I/O transfer size"),
661 1.104.2.2 yamt NULL, MAXPHYS, NULL, 0,
662 1.104.2.2 yamt CTL_KERN, KERN_MAXPHYS, CTL_EOL);
663 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
664 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
665 1.104.2.2 yamt CTLTYPE_INT, "sbmax",
666 1.104.2.2 yamt SYSCTL_DESCR("Maximum socket buffer size"),
667 1.104.2.2 yamt sysctl_kern_sbmax, 0, NULL, 0,
668 1.104.2.2 yamt CTL_KERN, KERN_SBMAX, CTL_EOL);
669 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
670 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
671 1.104.2.2 yamt CTLTYPE_INT, "monotonic_clock",
672 1.104.2.2 yamt SYSCTL_DESCR("Implementation version of the POSIX "
673 1.104.2.2 yamt "1003.1b Monotonic Clock Option"),
674 1.104.2.2 yamt /* XXX _POSIX_VERSION */
675 1.104.2.2 yamt NULL, _POSIX_MONOTONIC_CLOCK, NULL, 0,
676 1.104.2.2 yamt CTL_KERN, KERN_MONOTONIC_CLOCK, CTL_EOL);
677 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
678 1.104.2.2 yamt CTLFLAG_PERMANENT,
679 1.104.2.2 yamt CTLTYPE_INT, "urandom",
680 1.104.2.2 yamt SYSCTL_DESCR("Random integer value"),
681 1.104.2.2 yamt sysctl_kern_urnd, 0, NULL, 0,
682 1.104.2.2 yamt CTL_KERN, KERN_URND, CTL_EOL);
683 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
684 1.104.2.2 yamt CTLFLAG_PERMANENT,
685 1.104.2.2 yamt CTLTYPE_INT, "arandom",
686 1.104.2.2 yamt SYSCTL_DESCR("n bytes of random data"),
687 1.104.2.2 yamt sysctl_kern_arnd, 0, NULL, 0,
688 1.104.2.2 yamt CTL_KERN, KERN_ARND, CTL_EOL);
689 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
690 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
691 1.104.2.2 yamt CTLTYPE_INT, "labelsector",
692 1.104.2.2 yamt SYSCTL_DESCR("Sector number containing the disklabel"),
693 1.104.2.2 yamt NULL, LABELSECTOR, NULL, 0,
694 1.104.2.2 yamt CTL_KERN, KERN_LABELSECTOR, CTL_EOL);
695 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
696 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
697 1.104.2.2 yamt CTLTYPE_INT, "labeloffset",
698 1.104.2.2 yamt SYSCTL_DESCR("Offset of the disklabel within the "
699 1.104.2.2 yamt "sector"),
700 1.104.2.2 yamt NULL, LABELOFFSET, NULL, 0,
701 1.104.2.2 yamt CTL_KERN, KERN_LABELOFFSET, CTL_EOL);
702 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
703 1.104.2.2 yamt CTLFLAG_PERMANENT,
704 1.104.2.2 yamt CTLTYPE_NODE, "lwp",
705 1.104.2.2 yamt SYSCTL_DESCR("System-wide LWP information"),
706 1.104.2.2 yamt sysctl_kern_lwp, 0, NULL, 0,
707 1.104.2.2 yamt CTL_KERN, KERN_LWP, CTL_EOL);
708 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
709 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
710 1.104.2.2 yamt CTLTYPE_INT, "forkfsleep",
711 1.104.2.2 yamt SYSCTL_DESCR("Milliseconds to sleep on fork failure due "
712 1.104.2.2 yamt "to process limits"),
713 1.104.2.2 yamt sysctl_kern_forkfsleep, 0, NULL, 0,
714 1.104.2.2 yamt CTL_KERN, KERN_FORKFSLEEP, CTL_EOL);
715 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
716 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
717 1.104.2.2 yamt CTLTYPE_INT, "posix_threads",
718 1.104.2.2 yamt SYSCTL_DESCR("Version of IEEE Std 1003.1 and its "
719 1.104.2.2 yamt "Threads option to which the system "
720 1.104.2.2 yamt "attempts to conform"),
721 1.104.2.2 yamt /* XXX _POSIX_VERSION */
722 1.104.2.2 yamt NULL, _POSIX_THREADS, NULL, 0,
723 1.104.2.2 yamt CTL_KERN, KERN_POSIX_THREADS, CTL_EOL);
724 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
725 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
726 1.104.2.2 yamt CTLTYPE_INT, "posix_semaphores",
727 1.104.2.2 yamt SYSCTL_DESCR("Version of IEEE Std 1003.1 and its "
728 1.104.2.2 yamt "Semaphores option to which the system "
729 1.104.2.2 yamt "attempts to conform"), NULL,
730 1.104.2.2 yamt #ifdef P1003_1B_SEMAPHORE
731 1.104.2.2 yamt 200112,
732 1.104.2.2 yamt #else /* P1003_1B_SEMAPHORE */
733 1.104.2.2 yamt 0,
734 1.104.2.2 yamt #endif /* P1003_1B_SEMAPHORE */
735 1.104.2.2 yamt NULL, 0, CTL_KERN, KERN_POSIX_SEMAPHORES, CTL_EOL);
736 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
737 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
738 1.104.2.2 yamt CTLTYPE_INT, "posix_barriers",
739 1.104.2.2 yamt SYSCTL_DESCR("Version of IEEE Std 1003.1 and its "
740 1.104.2.2 yamt "Barriers option to which the system "
741 1.104.2.2 yamt "attempts to conform"),
742 1.104.2.2 yamt /* XXX _POSIX_VERSION */
743 1.104.2.2 yamt NULL, _POSIX_BARRIERS, NULL, 0,
744 1.104.2.2 yamt CTL_KERN, KERN_POSIX_BARRIERS, CTL_EOL);
745 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
746 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
747 1.104.2.2 yamt CTLTYPE_INT, "posix_timers",
748 1.104.2.2 yamt SYSCTL_DESCR("Version of IEEE Std 1003.1 and its "
749 1.104.2.2 yamt "Timers option to which the system "
750 1.104.2.2 yamt "attempts to conform"),
751 1.104.2.2 yamt /* XXX _POSIX_VERSION */
752 1.104.2.2 yamt NULL, _POSIX_TIMERS, NULL, 0,
753 1.104.2.2 yamt CTL_KERN, KERN_POSIX_TIMERS, CTL_EOL);
754 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
755 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
756 1.104.2.2 yamt CTLTYPE_INT, "posix_spin_locks",
757 1.104.2.2 yamt SYSCTL_DESCR("Version of IEEE Std 1003.1 and its Spin "
758 1.104.2.2 yamt "Locks option to which the system attempts "
759 1.104.2.2 yamt "to conform"),
760 1.104.2.2 yamt /* XXX _POSIX_VERSION */
761 1.104.2.2 yamt NULL, _POSIX_SPIN_LOCKS, NULL, 0,
762 1.104.2.2 yamt CTL_KERN, KERN_POSIX_SPIN_LOCKS, CTL_EOL);
763 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
764 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
765 1.104.2.2 yamt CTLTYPE_INT, "posix_reader_writer_locks",
766 1.104.2.2 yamt SYSCTL_DESCR("Version of IEEE Std 1003.1 and its "
767 1.104.2.2 yamt "Read-Write Locks option to which the "
768 1.104.2.2 yamt "system attempts to conform"),
769 1.104.2.2 yamt /* XXX _POSIX_VERSION */
770 1.104.2.2 yamt NULL, _POSIX_READER_WRITER_LOCKS, NULL, 0,
771 1.104.2.2 yamt CTL_KERN, KERN_POSIX_READER_WRITER_LOCKS, CTL_EOL);
772 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
773 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
774 1.104.2.2 yamt CTLTYPE_INT, "dump_on_panic",
775 1.104.2.2 yamt SYSCTL_DESCR("Perform a crash dump on system panic"),
776 1.104.2.2 yamt NULL, 0, &dumponpanic, 0,
777 1.104.2.2 yamt CTL_KERN, KERN_DUMP_ON_PANIC, CTL_EOL);
778 1.104.2.2 yamt #ifdef DIAGNOSTIC
779 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
780 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
781 1.104.2.2 yamt CTLTYPE_INT, "panic_now",
782 1.104.2.2 yamt SYSCTL_DESCR("Trigger a panic"),
783 1.104.2.2 yamt sysctl_kern_trigger_panic, 0, NULL, 0,
784 1.104.2.2 yamt CTL_KERN, CTL_CREATE, CTL_EOL);
785 1.104.2.2 yamt #endif
786 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
787 1.104.2.2 yamt CTLFLAG_PERMANENT,
788 1.104.2.2 yamt CTLTYPE_INT, "root_partition",
789 1.104.2.2 yamt SYSCTL_DESCR("Root partition on the root device"),
790 1.104.2.2 yamt sysctl_kern_root_partition, 0, NULL, 0,
791 1.104.2.2 yamt CTL_KERN, KERN_ROOT_PARTITION, CTL_EOL);
792 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
793 1.104.2.2 yamt CTLFLAG_PERMANENT,
794 1.104.2.2 yamt CTLTYPE_STRUCT, "drivers",
795 1.104.2.2 yamt SYSCTL_DESCR("List of all drivers with block and "
796 1.104.2.2 yamt "character device numbers"),
797 1.104.2.2 yamt sysctl_kern_drivers, 0, NULL, 0,
798 1.104.2.2 yamt CTL_KERN, KERN_DRIVERS, CTL_EOL);
799 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
800 1.104.2.2 yamt CTLFLAG_PERMANENT,
801 1.104.2.2 yamt CTLTYPE_STRUCT, "file2",
802 1.104.2.2 yamt SYSCTL_DESCR("System open file table"),
803 1.104.2.2 yamt sysctl_kern_file2, 0, NULL, 0,
804 1.104.2.2 yamt CTL_KERN, KERN_FILE2, CTL_EOL);
805 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
806 1.104.2.2 yamt CTLFLAG_PERMANENT,
807 1.104.2.2 yamt CTLTYPE_STRUCT, "cp_id",
808 1.104.2.2 yamt SYSCTL_DESCR("Mapping of CPU number to CPU id"),
809 1.104.2.2 yamt sysctl_kern_cpid, 0, NULL, 0,
810 1.104.2.2 yamt CTL_KERN, KERN_CP_ID, CTL_EOL);
811 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, &rnode,
812 1.104.2.2 yamt CTLFLAG_PERMANENT,
813 1.104.2.2 yamt CTLTYPE_NODE, "coredump",
814 1.104.2.2 yamt SYSCTL_DESCR("Coredump settings."),
815 1.104.2.2 yamt NULL, 0, NULL, 0,
816 1.104.2.2 yamt CTL_KERN, CTL_CREATE, CTL_EOL);
817 1.104.2.2 yamt sysctl_createv(clog, 0, &rnode, &rnode,
818 1.104.2.2 yamt CTLFLAG_PERMANENT,
819 1.104.2.2 yamt CTLTYPE_NODE, "setid",
820 1.104.2.2 yamt SYSCTL_DESCR("Set-id processes' coredump settings."),
821 1.104.2.2 yamt NULL, 0, NULL, 0,
822 1.104.2.2 yamt CTL_CREATE, CTL_EOL);
823 1.104.2.2 yamt sysctl_createv(clog, 0, &rnode, NULL,
824 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
825 1.104.2.2 yamt CTLTYPE_INT, "dump",
826 1.104.2.2 yamt SYSCTL_DESCR("Allow set-id processes to dump core."),
827 1.104.2.2 yamt sysctl_security_setidcore, 0, &security_setidcore_dump,
828 1.104.2.2 yamt sizeof(security_setidcore_dump),
829 1.104.2.2 yamt CTL_CREATE, CTL_EOL);
830 1.104.2.2 yamt sysctl_createv(clog, 0, &rnode, NULL,
831 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
832 1.104.2.2 yamt CTLTYPE_STRING, "path",
833 1.104.2.2 yamt SYSCTL_DESCR("Path pattern for set-id coredumps."),
834 1.104.2.2 yamt sysctl_security_setidcorename, 0,
835 1.104.2.2 yamt &security_setidcore_path,
836 1.104.2.2 yamt sizeof(security_setidcore_path),
837 1.104.2.2 yamt CTL_CREATE, CTL_EOL);
838 1.104.2.2 yamt sysctl_createv(clog, 0, &rnode, NULL,
839 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
840 1.104.2.2 yamt CTLTYPE_INT, "owner",
841 1.104.2.2 yamt SYSCTL_DESCR("Owner id for set-id processes' cores."),
842 1.104.2.2 yamt sysctl_security_setidcore, 0, &security_setidcore_owner,
843 1.104.2.2 yamt 0,
844 1.104.2.2 yamt CTL_CREATE, CTL_EOL);
845 1.104.2.2 yamt sysctl_createv(clog, 0, &rnode, NULL,
846 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
847 1.104.2.2 yamt CTLTYPE_INT, "group",
848 1.104.2.2 yamt SYSCTL_DESCR("Group id for set-id processes' cores."),
849 1.104.2.2 yamt sysctl_security_setidcore, 0, &security_setidcore_group,
850 1.104.2.2 yamt 0,
851 1.104.2.2 yamt CTL_CREATE, CTL_EOL);
852 1.104.2.2 yamt sysctl_createv(clog, 0, &rnode, NULL,
853 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
854 1.104.2.2 yamt CTLTYPE_INT, "mode",
855 1.104.2.2 yamt SYSCTL_DESCR("Mode for set-id processes' cores."),
856 1.104.2.2 yamt sysctl_security_setidcore, 0, &security_setidcore_mode,
857 1.104.2.2 yamt 0,
858 1.104.2.2 yamt CTL_CREATE, CTL_EOL);
859 1.104.2.2 yamt }
860 1.104.2.2 yamt
861 1.104.2.2 yamt SYSCTL_SETUP(sysctl_kern_proc_setup,
862 1.104.2.2 yamt "sysctl kern.proc/proc2/proc_args subtree setup")
863 1.104.2.2 yamt {
864 1.104.2.2 yamt
865 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
866 1.104.2.2 yamt CTLFLAG_PERMANENT,
867 1.104.2.2 yamt CTLTYPE_NODE, "kern", NULL,
868 1.104.2.2 yamt NULL, 0, NULL, 0,
869 1.104.2.2 yamt CTL_KERN, CTL_EOL);
870 1.104.2.2 yamt
871 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
872 1.104.2.2 yamt CTLFLAG_PERMANENT,
873 1.104.2.2 yamt CTLTYPE_NODE, "proc",
874 1.104.2.2 yamt SYSCTL_DESCR("System-wide process information"),
875 1.104.2.2 yamt sysctl_doeproc, 0, NULL, 0,
876 1.104.2.2 yamt CTL_KERN, KERN_PROC, CTL_EOL);
877 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
878 1.104.2.2 yamt CTLFLAG_PERMANENT,
879 1.104.2.2 yamt CTLTYPE_NODE, "proc2",
880 1.104.2.2 yamt SYSCTL_DESCR("Machine-independent process information"),
881 1.104.2.2 yamt sysctl_doeproc, 0, NULL, 0,
882 1.104.2.2 yamt CTL_KERN, KERN_PROC2, CTL_EOL);
883 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
884 1.104.2.2 yamt CTLFLAG_PERMANENT,
885 1.104.2.2 yamt CTLTYPE_NODE, "proc_args",
886 1.104.2.2 yamt SYSCTL_DESCR("Process argument information"),
887 1.104.2.2 yamt sysctl_kern_proc_args, 0, NULL, 0,
888 1.104.2.2 yamt CTL_KERN, KERN_PROC_ARGS, CTL_EOL);
889 1.104.2.2 yamt
890 1.104.2.2 yamt /*
891 1.104.2.2 yamt "nodes" under these:
892 1.104.2.2 yamt
893 1.104.2.2 yamt KERN_PROC_ALL
894 1.104.2.2 yamt KERN_PROC_PID pid
895 1.104.2.2 yamt KERN_PROC_PGRP pgrp
896 1.104.2.2 yamt KERN_PROC_SESSION sess
897 1.104.2.2 yamt KERN_PROC_TTY tty
898 1.104.2.2 yamt KERN_PROC_UID uid
899 1.104.2.2 yamt KERN_PROC_RUID uid
900 1.104.2.2 yamt KERN_PROC_GID gid
901 1.104.2.2 yamt KERN_PROC_RGID gid
902 1.104.2.2 yamt
903 1.104.2.2 yamt all in all, probably not worth the effort...
904 1.104.2.2 yamt */
905 1.104.2.2 yamt }
906 1.104.2.2 yamt
907 1.104.2.2 yamt SYSCTL_SETUP(sysctl_hw_setup, "sysctl hw subtree setup")
908 1.104.2.2 yamt {
909 1.104.2.2 yamt u_int u;
910 1.104.2.2 yamt u_quad_t q;
911 1.104.2.2 yamt
912 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
913 1.104.2.2 yamt CTLFLAG_PERMANENT,
914 1.104.2.2 yamt CTLTYPE_NODE, "hw", NULL,
915 1.104.2.2 yamt NULL, 0, NULL, 0,
916 1.104.2.2 yamt CTL_HW, CTL_EOL);
917 1.104.2.2 yamt
918 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
919 1.104.2.2 yamt CTLFLAG_PERMANENT,
920 1.104.2.2 yamt CTLTYPE_STRING, "machine",
921 1.104.2.2 yamt SYSCTL_DESCR("Machine class"),
922 1.104.2.2 yamt NULL, 0, machine, 0,
923 1.104.2.2 yamt CTL_HW, HW_MACHINE, CTL_EOL);
924 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
925 1.104.2.2 yamt CTLFLAG_PERMANENT,
926 1.104.2.2 yamt CTLTYPE_STRING, "model",
927 1.104.2.2 yamt SYSCTL_DESCR("Machine model"),
928 1.104.2.2 yamt NULL, 0, cpu_model, 0,
929 1.104.2.2 yamt CTL_HW, HW_MODEL, CTL_EOL);
930 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
931 1.104.2.2 yamt CTLFLAG_PERMANENT,
932 1.104.2.2 yamt CTLTYPE_INT, "ncpu",
933 1.104.2.2 yamt SYSCTL_DESCR("Number of active CPUs"),
934 1.104.2.2 yamt sysctl_hw_ncpu, 0, NULL, 0,
935 1.104.2.2 yamt CTL_HW, HW_NCPU, CTL_EOL);
936 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
937 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
938 1.104.2.2 yamt CTLTYPE_INT, "byteorder",
939 1.104.2.2 yamt SYSCTL_DESCR("System byte order"),
940 1.104.2.2 yamt NULL, BYTE_ORDER, NULL, 0,
941 1.104.2.2 yamt CTL_HW, HW_BYTEORDER, CTL_EOL);
942 1.104.2.2 yamt u = ((u_int)physmem > (UINT_MAX / PAGE_SIZE)) ?
943 1.104.2.2 yamt UINT_MAX : physmem * PAGE_SIZE;
944 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
945 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
946 1.104.2.2 yamt CTLTYPE_INT, "physmem",
947 1.104.2.2 yamt SYSCTL_DESCR("Bytes of physical memory"),
948 1.104.2.2 yamt NULL, u, NULL, 0,
949 1.104.2.2 yamt CTL_HW, HW_PHYSMEM, CTL_EOL);
950 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
951 1.104.2.2 yamt CTLFLAG_PERMANENT,
952 1.104.2.2 yamt CTLTYPE_INT, "usermem",
953 1.104.2.2 yamt SYSCTL_DESCR("Bytes of non-kernel memory"),
954 1.104.2.2 yamt sysctl_hw_usermem, 0, NULL, 0,
955 1.104.2.2 yamt CTL_HW, HW_USERMEM, CTL_EOL);
956 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
957 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
958 1.104.2.2 yamt CTLTYPE_INT, "pagesize",
959 1.104.2.2 yamt SYSCTL_DESCR("Software page size"),
960 1.104.2.2 yamt NULL, PAGE_SIZE, NULL, 0,
961 1.104.2.2 yamt CTL_HW, HW_PAGESIZE, CTL_EOL);
962 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
963 1.104.2.2 yamt CTLFLAG_PERMANENT,
964 1.104.2.2 yamt CTLTYPE_STRING, "machine_arch",
965 1.104.2.2 yamt SYSCTL_DESCR("Machine CPU class"),
966 1.104.2.2 yamt NULL, 0, machine_arch, 0,
967 1.104.2.2 yamt CTL_HW, HW_MACHINE_ARCH, CTL_EOL);
968 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
969 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
970 1.104.2.2 yamt CTLTYPE_INT, "alignbytes",
971 1.104.2.2 yamt SYSCTL_DESCR("Alignment constraint for all possible "
972 1.104.2.2 yamt "data types"),
973 1.104.2.2 yamt NULL, ALIGNBYTES, NULL, 0,
974 1.104.2.2 yamt CTL_HW, HW_ALIGNBYTES, CTL_EOL);
975 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
976 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_READWRITE|CTLFLAG_HEX,
977 1.104.2.2 yamt CTLTYPE_STRING, "cnmagic",
978 1.104.2.2 yamt SYSCTL_DESCR("Console magic key sequence"),
979 1.104.2.2 yamt sysctl_hw_cnmagic, 0, NULL, CNS_LEN,
980 1.104.2.2 yamt CTL_HW, HW_CNMAGIC, CTL_EOL);
981 1.104.2.2 yamt q = (u_quad_t)physmem * PAGE_SIZE;
982 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
983 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
984 1.104.2.2 yamt CTLTYPE_QUAD, "physmem64",
985 1.104.2.2 yamt SYSCTL_DESCR("Bytes of physical memory"),
986 1.104.2.2 yamt NULL, q, NULL, 0,
987 1.104.2.2 yamt CTL_HW, HW_PHYSMEM64, CTL_EOL);
988 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
989 1.104.2.2 yamt CTLFLAG_PERMANENT,
990 1.104.2.2 yamt CTLTYPE_QUAD, "usermem64",
991 1.104.2.2 yamt SYSCTL_DESCR("Bytes of non-kernel memory"),
992 1.104.2.2 yamt sysctl_hw_usermem, 0, NULL, 0,
993 1.104.2.2 yamt CTL_HW, HW_USERMEM64, CTL_EOL);
994 1.104.2.2 yamt }
995 1.104.2.2 yamt
996 1.104.2.2 yamt #ifdef DEBUG
997 1.104.2.2 yamt /*
998 1.104.2.2 yamt * Debugging related system variables.
999 1.104.2.2 yamt */
1000 1.104.2.2 yamt struct ctldebug /* debug0, */ /* debug1, */ debug2, debug3, debug4;
1001 1.104.2.2 yamt struct ctldebug debug5, debug6, debug7, debug8, debug9;
1002 1.104.2.2 yamt struct ctldebug debug10, debug11, debug12, debug13, debug14;
1003 1.104.2.2 yamt struct ctldebug debug15, debug16, debug17, debug18, debug19;
1004 1.104.2.2 yamt static struct ctldebug *debugvars[CTL_DEBUG_MAXID] = {
1005 1.104.2.2 yamt &debug0, &debug1, &debug2, &debug3, &debug4,
1006 1.104.2.2 yamt &debug5, &debug6, &debug7, &debug8, &debug9,
1007 1.104.2.2 yamt &debug10, &debug11, &debug12, &debug13, &debug14,
1008 1.104.2.2 yamt &debug15, &debug16, &debug17, &debug18, &debug19,
1009 1.104.2.2 yamt };
1010 1.104.2.2 yamt
1011 1.104.2.2 yamt /*
1012 1.104.2.2 yamt * this setup routine is a replacement for debug_sysctl()
1013 1.104.2.2 yamt *
1014 1.104.2.2 yamt * note that it creates several nodes per defined debug variable
1015 1.104.2.2 yamt */
1016 1.104.2.2 yamt SYSCTL_SETUP(sysctl_debug_setup, "sysctl debug subtree setup")
1017 1.104.2.2 yamt {
1018 1.104.2.2 yamt struct ctldebug *cdp;
1019 1.104.2.2 yamt char nodename[20];
1020 1.104.2.2 yamt int i;
1021 1.104.2.2 yamt
1022 1.104.2.2 yamt /*
1023 1.104.2.2 yamt * two ways here:
1024 1.104.2.2 yamt *
1025 1.104.2.2 yamt * the "old" way (debug.name -> value) which was emulated by
1026 1.104.2.2 yamt * the sysctl(8) binary
1027 1.104.2.2 yamt *
1028 1.104.2.2 yamt * the new way, which the sysctl(8) binary was actually using
1029 1.104.2.2 yamt
1030 1.104.2.2 yamt node debug
1031 1.104.2.2 yamt node debug.0
1032 1.104.2.2 yamt string debug.0.name
1033 1.104.2.2 yamt int debug.0.value
1034 1.104.2.2 yamt int debug.name
1035 1.104.2.2 yamt
1036 1.104.2.2 yamt */
1037 1.104.2.2 yamt
1038 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
1039 1.104.2.2 yamt CTLFLAG_PERMANENT,
1040 1.104.2.2 yamt CTLTYPE_NODE, "debug", NULL,
1041 1.104.2.2 yamt NULL, 0, NULL, 0,
1042 1.104.2.2 yamt CTL_DEBUG, CTL_EOL);
1043 1.104.2.2 yamt
1044 1.104.2.2 yamt for (i = 0; i < CTL_DEBUG_MAXID; i++) {
1045 1.104.2.2 yamt cdp = debugvars[i];
1046 1.104.2.2 yamt if (cdp->debugname == NULL || cdp->debugvar == NULL)
1047 1.104.2.2 yamt continue;
1048 1.104.2.2 yamt
1049 1.104.2.2 yamt snprintf(nodename, sizeof(nodename), "debug%d", i);
1050 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
1051 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_HIDDEN,
1052 1.104.2.2 yamt CTLTYPE_NODE, nodename, NULL,
1053 1.104.2.2 yamt NULL, 0, NULL, 0,
1054 1.104.2.2 yamt CTL_DEBUG, i, CTL_EOL);
1055 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
1056 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_HIDDEN,
1057 1.104.2.2 yamt CTLTYPE_STRING, "name", NULL,
1058 1.104.2.2 yamt /*XXXUNCONST*/
1059 1.104.2.2 yamt NULL, 0, __UNCONST(cdp->debugname), 0,
1060 1.104.2.2 yamt CTL_DEBUG, i, CTL_DEBUG_NAME, CTL_EOL);
1061 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
1062 1.104.2.2 yamt CTLFLAG_PERMANENT|CTLFLAG_HIDDEN,
1063 1.104.2.2 yamt CTLTYPE_INT, "value", NULL,
1064 1.104.2.2 yamt NULL, 0, cdp->debugvar, 0,
1065 1.104.2.2 yamt CTL_DEBUG, i, CTL_DEBUG_VALUE, CTL_EOL);
1066 1.104.2.2 yamt sysctl_createv(clog, 0, NULL, NULL,
1067 1.104.2.2 yamt CTLFLAG_PERMANENT,
1068 1.104.2.2 yamt CTLTYPE_INT, cdp->debugname, NULL,
1069 1.104.2.2 yamt NULL, 0, cdp->debugvar, 0,
1070 1.104.2.2 yamt CTL_DEBUG, CTL_CREATE, CTL_EOL);
1071 1.104.2.2 yamt }
1072 1.104.2.2 yamt }
1073 1.104.2.2 yamt #endif /* DEBUG */
1074 1.104.2.2 yamt
1075 1.104.2.2 yamt /*
1076 1.104.2.2 yamt * ********************************************************************
1077 1.104.2.2 yamt * section 2: private node-specific helper routines.
1078 1.104.2.2 yamt * ********************************************************************
1079 1.104.2.2 yamt */
1080 1.104.2.2 yamt
1081 1.104.2.2 yamt #ifdef DIAGNOSTIC
1082 1.104.2.2 yamt static int
1083 1.104.2.2 yamt sysctl_kern_trigger_panic(SYSCTLFN_ARGS)
1084 1.104.2.2 yamt {
1085 1.104.2.2 yamt int newtrig, error;
1086 1.104.2.2 yamt struct sysctlnode node;
1087 1.104.2.2 yamt
1088 1.104.2.2 yamt newtrig = 0;
1089 1.104.2.2 yamt node = *rnode;
1090 1.104.2.2 yamt node.sysctl_data = &newtrig;
1091 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
1092 1.104.2.2 yamt if (error || newp == NULL)
1093 1.104.2.2 yamt return (error);
1094 1.104.2.2 yamt
1095 1.104.2.2 yamt if (newtrig != 0)
1096 1.104.2.2 yamt panic("Panic triggered");
1097 1.104.2.2 yamt
1098 1.104.2.2 yamt return (error);
1099 1.104.2.2 yamt }
1100 1.104.2.2 yamt #endif
1101 1.104.2.2 yamt
1102 1.104.2.2 yamt /*
1103 1.104.2.2 yamt * sysctl helper routine for kern.maxvnodes. drain vnodes if
1104 1.104.2.2 yamt * new value is lower than desiredvnodes and then calls reinit
1105 1.104.2.2 yamt * routines that needs to adjust to the new value.
1106 1.104.2.2 yamt */
1107 1.104.2.2 yamt static int
1108 1.104.2.2 yamt sysctl_kern_maxvnodes(SYSCTLFN_ARGS)
1109 1.104.2.2 yamt {
1110 1.104.2.2 yamt int error, new_vnodes, old_vnodes;
1111 1.104.2.2 yamt struct sysctlnode node;
1112 1.104.2.2 yamt
1113 1.104.2.2 yamt new_vnodes = desiredvnodes;
1114 1.104.2.2 yamt node = *rnode;
1115 1.104.2.2 yamt node.sysctl_data = &new_vnodes;
1116 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
1117 1.104.2.2 yamt if (error || newp == NULL)
1118 1.104.2.2 yamt return (error);
1119 1.104.2.2 yamt
1120 1.104.2.2 yamt old_vnodes = desiredvnodes;
1121 1.104.2.2 yamt desiredvnodes = new_vnodes;
1122 1.104.2.2 yamt if (new_vnodes < old_vnodes) {
1123 1.104.2.2 yamt error = vfs_drainvnodes(new_vnodes, l);
1124 1.104.2.2 yamt if (error) {
1125 1.104.2.2 yamt desiredvnodes = old_vnodes;
1126 1.104.2.2 yamt return (error);
1127 1.104.2.2 yamt }
1128 1.104.2.2 yamt }
1129 1.104.2.2 yamt vfs_reinit();
1130 1.104.2.2 yamt nchreinit();
1131 1.104.2.2 yamt
1132 1.104.2.2 yamt return (0);
1133 1.104.2.2 yamt }
1134 1.104.2.2 yamt
1135 1.104.2.2 yamt /*
1136 1.104.2.2 yamt * sysctl helper routine for rtc_offset - set time after changes
1137 1.104.2.2 yamt */
1138 1.104.2.2 yamt static int
1139 1.104.2.2 yamt sysctl_kern_rtc_offset(SYSCTLFN_ARGS)
1140 1.104.2.2 yamt {
1141 1.104.2.2 yamt struct timespec ts, delta;
1142 1.104.2.2 yamt int error, new_rtc_offset;
1143 1.104.2.2 yamt struct sysctlnode node;
1144 1.104.2.2 yamt
1145 1.104.2.2 yamt new_rtc_offset = rtc_offset;
1146 1.104.2.2 yamt node = *rnode;
1147 1.104.2.2 yamt node.sysctl_data = &new_rtc_offset;
1148 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
1149 1.104.2.2 yamt if (error || newp == NULL)
1150 1.104.2.2 yamt return (error);
1151 1.104.2.2 yamt
1152 1.104.2.2 yamt if (kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_TIME,
1153 1.104.2.2 yamt KAUTH_REQ_SYSTEM_TIME_RTCOFFSET,
1154 1.104.2.2 yamt (void *)(u_long)new_rtc_offset, NULL, NULL))
1155 1.104.2.2 yamt return (EPERM);
1156 1.104.2.2 yamt if (rtc_offset == new_rtc_offset)
1157 1.104.2.2 yamt return (0);
1158 1.104.2.2 yamt
1159 1.104.2.2 yamt /* if we change the offset, adjust the time */
1160 1.104.2.2 yamt nanotime(&ts);
1161 1.104.2.2 yamt delta.tv_sec = 60 * (new_rtc_offset - rtc_offset);
1162 1.104.2.2 yamt delta.tv_nsec = 0;
1163 1.104.2.2 yamt timespecadd(&ts, &delta, &ts);
1164 1.104.2.2 yamt rtc_offset = new_rtc_offset;
1165 1.104.2.2 yamt settime(l->l_proc, &ts);
1166 1.104.2.2 yamt
1167 1.104.2.2 yamt return (0);
1168 1.104.2.2 yamt }
1169 1.104.2.2 yamt
1170 1.104.2.2 yamt /*
1171 1.104.2.2 yamt * sysctl helper routine for kern.maxproc. ensures that the new
1172 1.104.2.2 yamt * values are not too low or too high.
1173 1.104.2.2 yamt */
1174 1.104.2.2 yamt static int
1175 1.104.2.2 yamt sysctl_kern_maxproc(SYSCTLFN_ARGS)
1176 1.104.2.2 yamt {
1177 1.104.2.2 yamt int error, nmaxproc;
1178 1.104.2.2 yamt struct sysctlnode node;
1179 1.104.2.2 yamt
1180 1.104.2.2 yamt nmaxproc = maxproc;
1181 1.104.2.2 yamt node = *rnode;
1182 1.104.2.2 yamt node.sysctl_data = &nmaxproc;
1183 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
1184 1.104.2.2 yamt if (error || newp == NULL)
1185 1.104.2.2 yamt return (error);
1186 1.104.2.2 yamt
1187 1.104.2.2 yamt if (nmaxproc < 0 || nmaxproc >= PID_MAX)
1188 1.104.2.2 yamt return (EINVAL);
1189 1.104.2.2 yamt #ifdef __HAVE_CPU_MAXPROC
1190 1.104.2.2 yamt if (nmaxproc > cpu_maxproc())
1191 1.104.2.2 yamt return (EINVAL);
1192 1.104.2.2 yamt #endif
1193 1.104.2.2 yamt maxproc = nmaxproc;
1194 1.104.2.2 yamt
1195 1.104.2.2 yamt return (0);
1196 1.104.2.2 yamt }
1197 1.104.2.2 yamt
1198 1.104.2.2 yamt /*
1199 1.104.2.2 yamt * sysctl helper function for kern.hostid. the hostid is a long, but
1200 1.104.2.2 yamt * we export it as an int, so we need to give it a little help.
1201 1.104.2.2 yamt */
1202 1.104.2.2 yamt static int
1203 1.104.2.2 yamt sysctl_kern_hostid(SYSCTLFN_ARGS)
1204 1.104.2.2 yamt {
1205 1.104.2.2 yamt int error, inthostid;
1206 1.104.2.2 yamt struct sysctlnode node;
1207 1.104.2.2 yamt
1208 1.104.2.2 yamt inthostid = hostid; /* XXX assumes sizeof int <= sizeof long */
1209 1.104.2.2 yamt node = *rnode;
1210 1.104.2.2 yamt node.sysctl_data = &inthostid;
1211 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
1212 1.104.2.2 yamt if (error || newp == NULL)
1213 1.104.2.2 yamt return (error);
1214 1.104.2.2 yamt
1215 1.104.2.2 yamt hostid = (unsigned)inthostid;
1216 1.104.2.2 yamt
1217 1.104.2.2 yamt return (0);
1218 1.104.2.2 yamt }
1219 1.104.2.2 yamt
1220 1.104.2.2 yamt /*
1221 1.104.2.2 yamt * sysctl helper function for kern.hostname and kern.domainnname.
1222 1.104.2.2 yamt * resets the relevant recorded length when the underlying name is
1223 1.104.2.2 yamt * changed.
1224 1.104.2.2 yamt */
1225 1.104.2.2 yamt static int
1226 1.104.2.2 yamt sysctl_setlen(SYSCTLFN_ARGS)
1227 1.104.2.2 yamt {
1228 1.104.2.2 yamt int error;
1229 1.104.2.2 yamt
1230 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(rnode));
1231 1.104.2.2 yamt if (error || newp == NULL)
1232 1.104.2.2 yamt return (error);
1233 1.104.2.2 yamt
1234 1.104.2.2 yamt switch (rnode->sysctl_num) {
1235 1.104.2.2 yamt case KERN_HOSTNAME:
1236 1.104.2.2 yamt hostnamelen = strlen((const char*)rnode->sysctl_data);
1237 1.104.2.2 yamt break;
1238 1.104.2.2 yamt case KERN_DOMAINNAME:
1239 1.104.2.2 yamt domainnamelen = strlen((const char*)rnode->sysctl_data);
1240 1.104.2.2 yamt break;
1241 1.104.2.2 yamt }
1242 1.104.2.2 yamt
1243 1.104.2.2 yamt return (0);
1244 1.104.2.2 yamt }
1245 1.104.2.2 yamt
1246 1.104.2.2 yamt /*
1247 1.104.2.2 yamt * sysctl helper routine for kern.clockrate. assembles a struct on
1248 1.104.2.2 yamt * the fly to be returned to the caller.
1249 1.104.2.2 yamt */
1250 1.104.2.2 yamt static int
1251 1.104.2.2 yamt sysctl_kern_clockrate(SYSCTLFN_ARGS)
1252 1.104.2.2 yamt {
1253 1.104.2.2 yamt struct clockinfo clkinfo;
1254 1.104.2.2 yamt struct sysctlnode node;
1255 1.104.2.2 yamt
1256 1.104.2.2 yamt clkinfo.tick = tick;
1257 1.104.2.2 yamt clkinfo.tickadj = tickadj;
1258 1.104.2.2 yamt clkinfo.hz = hz;
1259 1.104.2.2 yamt clkinfo.profhz = profhz;
1260 1.104.2.2 yamt clkinfo.stathz = stathz ? stathz : hz;
1261 1.104.2.2 yamt
1262 1.104.2.2 yamt node = *rnode;
1263 1.104.2.2 yamt node.sysctl_data = &clkinfo;
1264 1.104.2.2 yamt return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1265 1.104.2.2 yamt }
1266 1.104.2.2 yamt
1267 1.104.2.2 yamt
1268 1.104.2.2 yamt /*
1269 1.104.2.2 yamt * sysctl helper routine for kern.file pseudo-subtree.
1270 1.104.2.2 yamt */
1271 1.104.2.2 yamt static int
1272 1.104.2.2 yamt sysctl_kern_file(SYSCTLFN_ARGS)
1273 1.104.2.2 yamt {
1274 1.104.2.2 yamt int error;
1275 1.104.2.2 yamt size_t buflen;
1276 1.104.2.2 yamt struct file *fp;
1277 1.104.2.2 yamt char *start, *where;
1278 1.104.2.2 yamt
1279 1.104.2.2 yamt start = where = oldp;
1280 1.104.2.2 yamt buflen = *oldlenp;
1281 1.104.2.2 yamt if (where == NULL) {
1282 1.104.2.2 yamt /*
1283 1.104.2.2 yamt * overestimate by 10 files
1284 1.104.2.2 yamt */
1285 1.104.2.2 yamt *oldlenp = sizeof(filehead) + (nfiles + 10) * sizeof(struct file);
1286 1.104.2.2 yamt return (0);
1287 1.104.2.2 yamt }
1288 1.104.2.2 yamt
1289 1.104.2.2 yamt /*
1290 1.104.2.2 yamt * first dcopyout filehead
1291 1.104.2.2 yamt */
1292 1.104.2.2 yamt if (buflen < sizeof(filehead)) {
1293 1.104.2.2 yamt *oldlenp = 0;
1294 1.104.2.2 yamt return (0);
1295 1.104.2.2 yamt }
1296 1.104.2.2 yamt error = dcopyout(l, &filehead, where, sizeof(filehead));
1297 1.104.2.2 yamt if (error)
1298 1.104.2.2 yamt return (error);
1299 1.104.2.2 yamt buflen -= sizeof(filehead);
1300 1.104.2.2 yamt where += sizeof(filehead);
1301 1.104.2.2 yamt
1302 1.104.2.2 yamt /*
1303 1.104.2.2 yamt * followed by an array of file structures
1304 1.104.2.2 yamt */
1305 1.104.2.2 yamt LIST_FOREACH(fp, &filehead, f_list) {
1306 1.104.2.2 yamt if (kauth_authorize_generic(l->l_cred,
1307 1.104.2.2 yamt KAUTH_GENERIC_CANSEE, fp->f_cred) != 0)
1308 1.104.2.2 yamt continue;
1309 1.104.2.2 yamt if (buflen < sizeof(struct file)) {
1310 1.104.2.2 yamt *oldlenp = where - start;
1311 1.104.2.2 yamt return (ENOMEM);
1312 1.104.2.2 yamt }
1313 1.104.2.2 yamt error = dcopyout(l, fp, where, sizeof(struct file));
1314 1.104.2.2 yamt if (error)
1315 1.104.2.2 yamt return (error);
1316 1.104.2.2 yamt buflen -= sizeof(struct file);
1317 1.104.2.2 yamt where += sizeof(struct file);
1318 1.104.2.2 yamt }
1319 1.104.2.2 yamt *oldlenp = where - start;
1320 1.104.2.2 yamt return (0);
1321 1.104.2.2 yamt }
1322 1.104.2.2 yamt
1323 1.104.2.2 yamt /*
1324 1.104.2.2 yamt * sysctl helper routine for kern.msgbufsize and kern.msgbuf. for the
1325 1.104.2.2 yamt * former it merely checks the message buffer is set up. for the latter,
1326 1.104.2.2 yamt * it also copies out the data if necessary.
1327 1.104.2.2 yamt */
1328 1.104.2.2 yamt static int
1329 1.104.2.2 yamt sysctl_msgbuf(SYSCTLFN_ARGS)
1330 1.104.2.2 yamt {
1331 1.104.2.2 yamt char *where = oldp;
1332 1.104.2.2 yamt size_t len, maxlen;
1333 1.104.2.2 yamt long beg, end;
1334 1.104.2.2 yamt int error;
1335 1.104.2.2 yamt
1336 1.104.2.2 yamt if (!msgbufenabled || msgbufp->msg_magic != MSG_MAGIC) {
1337 1.104.2.2 yamt msgbufenabled = 0;
1338 1.104.2.2 yamt return (ENXIO);
1339 1.104.2.2 yamt }
1340 1.104.2.2 yamt
1341 1.104.2.2 yamt switch (rnode->sysctl_num) {
1342 1.104.2.2 yamt case KERN_MSGBUFSIZE: {
1343 1.104.2.2 yamt struct sysctlnode node = *rnode;
1344 1.104.2.2 yamt int msg_bufs = (int)msgbufp->msg_bufs;
1345 1.104.2.2 yamt node.sysctl_data = &msg_bufs;
1346 1.104.2.2 yamt return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1347 1.104.2.2 yamt }
1348 1.104.2.2 yamt case KERN_MSGBUF:
1349 1.104.2.2 yamt break;
1350 1.104.2.2 yamt default:
1351 1.104.2.2 yamt return (EOPNOTSUPP);
1352 1.104.2.2 yamt }
1353 1.104.2.2 yamt
1354 1.104.2.2 yamt if (newp != NULL)
1355 1.104.2.2 yamt return (EPERM);
1356 1.104.2.2 yamt
1357 1.104.2.2 yamt if (oldp == NULL) {
1358 1.104.2.2 yamt /* always return full buffer size */
1359 1.104.2.2 yamt *oldlenp = msgbufp->msg_bufs;
1360 1.104.2.2 yamt return (0);
1361 1.104.2.2 yamt }
1362 1.104.2.2 yamt
1363 1.104.2.2 yamt error = 0;
1364 1.104.2.2 yamt maxlen = MIN(msgbufp->msg_bufs, *oldlenp);
1365 1.104.2.2 yamt
1366 1.104.2.2 yamt /*
1367 1.104.2.2 yamt * First, copy from the write pointer to the end of
1368 1.104.2.2 yamt * message buffer.
1369 1.104.2.2 yamt */
1370 1.104.2.2 yamt beg = msgbufp->msg_bufx;
1371 1.104.2.2 yamt end = msgbufp->msg_bufs;
1372 1.104.2.2 yamt while (maxlen > 0) {
1373 1.104.2.2 yamt len = MIN(end - beg, maxlen);
1374 1.104.2.2 yamt if (len == 0)
1375 1.104.2.2 yamt break;
1376 1.104.2.2 yamt error = dcopyout(l, &msgbufp->msg_bufc[beg], where, len);
1377 1.104.2.2 yamt if (error)
1378 1.104.2.2 yamt break;
1379 1.104.2.2 yamt where += len;
1380 1.104.2.2 yamt maxlen -= len;
1381 1.104.2.2 yamt
1382 1.104.2.2 yamt /*
1383 1.104.2.2 yamt * ... then, copy from the beginning of message buffer to
1384 1.104.2.2 yamt * the write pointer.
1385 1.104.2.2 yamt */
1386 1.104.2.2 yamt beg = 0;
1387 1.104.2.2 yamt end = msgbufp->msg_bufx;
1388 1.104.2.2 yamt }
1389 1.104.2.2 yamt
1390 1.104.2.2 yamt return (error);
1391 1.104.2.2 yamt }
1392 1.104.2.2 yamt
1393 1.104.2.2 yamt /*
1394 1.104.2.2 yamt * sysctl helper routine for kern.defcorename. in the case of a new
1395 1.104.2.2 yamt * string being assigned, check that it's not a zero-length string.
1396 1.104.2.2 yamt * (XXX the check in -current doesn't work, but do we really care?)
1397 1.104.2.2 yamt */
1398 1.104.2.2 yamt static int
1399 1.104.2.2 yamt sysctl_kern_defcorename(SYSCTLFN_ARGS)
1400 1.104.2.2 yamt {
1401 1.104.2.2 yamt int error;
1402 1.104.2.2 yamt char *newcorename;
1403 1.104.2.2 yamt struct sysctlnode node;
1404 1.104.2.2 yamt
1405 1.104.2.2 yamt newcorename = PNBUF_GET();
1406 1.104.2.2 yamt node = *rnode;
1407 1.104.2.2 yamt node.sysctl_data = &newcorename[0];
1408 1.104.2.2 yamt memcpy(node.sysctl_data, rnode->sysctl_data, MAXPATHLEN);
1409 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
1410 1.104.2.2 yamt if (error || newp == NULL) {
1411 1.104.2.2 yamt goto done;
1412 1.104.2.2 yamt }
1413 1.104.2.2 yamt
1414 1.104.2.2 yamt /*
1415 1.104.2.2 yamt * when sysctl_lookup() deals with a string, it's guaranteed
1416 1.104.2.2 yamt * to come back nul terminated. so there. :)
1417 1.104.2.2 yamt */
1418 1.104.2.2 yamt if (strlen(newcorename) == 0) {
1419 1.104.2.2 yamt error = EINVAL;
1420 1.104.2.2 yamt } else {
1421 1.104.2.2 yamt memcpy(rnode->sysctl_data, node.sysctl_data, MAXPATHLEN);
1422 1.104.2.2 yamt error = 0;
1423 1.104.2.2 yamt }
1424 1.104.2.2 yamt done:
1425 1.104.2.2 yamt PNBUF_PUT(newcorename);
1426 1.104.2.2 yamt return error;
1427 1.104.2.2 yamt }
1428 1.104.2.2 yamt
1429 1.104.2.2 yamt /*
1430 1.104.2.2 yamt * sysctl helper routine for kern.cp_time node. adds up cpu time
1431 1.104.2.2 yamt * across all cpus.
1432 1.104.2.2 yamt */
1433 1.104.2.2 yamt static int
1434 1.104.2.2 yamt sysctl_kern_cptime(SYSCTLFN_ARGS)
1435 1.104.2.2 yamt {
1436 1.104.2.2 yamt struct sysctlnode node = *rnode;
1437 1.104.2.2 yamt
1438 1.104.2.2 yamt #ifndef MULTIPROCESSOR
1439 1.104.2.2 yamt
1440 1.104.2.2 yamt if (namelen == 1) {
1441 1.104.2.2 yamt if (name[0] != 0)
1442 1.104.2.2 yamt return (ENOENT);
1443 1.104.2.2 yamt /*
1444 1.104.2.2 yamt * you're allowed to ask for the zero'th processor
1445 1.104.2.2 yamt */
1446 1.104.2.2 yamt name++;
1447 1.104.2.2 yamt namelen--;
1448 1.104.2.2 yamt }
1449 1.104.2.2 yamt node.sysctl_data = curcpu()->ci_schedstate.spc_cp_time;
1450 1.104.2.2 yamt node.sysctl_size = sizeof(curcpu()->ci_schedstate.spc_cp_time);
1451 1.104.2.2 yamt return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1452 1.104.2.2 yamt
1453 1.104.2.2 yamt #else /* MULTIPROCESSOR */
1454 1.104.2.2 yamt
1455 1.104.2.2 yamt uint64_t *cp_time = NULL;
1456 1.104.2.2 yamt int error, n = ncpu, i;
1457 1.104.2.2 yamt struct cpu_info *ci;
1458 1.104.2.2 yamt CPU_INFO_ITERATOR cii;
1459 1.104.2.2 yamt
1460 1.104.2.2 yamt /*
1461 1.104.2.2 yamt * if you specifically pass a buffer that is the size of the
1462 1.104.2.2 yamt * sum, or if you are probing for the size, you get the "sum"
1463 1.104.2.2 yamt * of cp_time (and the size thereof) across all processors.
1464 1.104.2.2 yamt *
1465 1.104.2.2 yamt * alternately, you can pass an additional mib number and get
1466 1.104.2.2 yamt * cp_time for that particular processor.
1467 1.104.2.2 yamt */
1468 1.104.2.2 yamt switch (namelen) {
1469 1.104.2.2 yamt case 0:
1470 1.104.2.2 yamt if (*oldlenp == sizeof(uint64_t) * CPUSTATES || oldp == NULL) {
1471 1.104.2.2 yamt node.sysctl_size = sizeof(uint64_t) * CPUSTATES;
1472 1.104.2.2 yamt n = -1; /* SUM */
1473 1.104.2.2 yamt }
1474 1.104.2.2 yamt else {
1475 1.104.2.2 yamt node.sysctl_size = n * sizeof(uint64_t) * CPUSTATES;
1476 1.104.2.2 yamt n = -2; /* ALL */
1477 1.104.2.2 yamt }
1478 1.104.2.2 yamt break;
1479 1.104.2.2 yamt case 1:
1480 1.104.2.2 yamt if (name[0] < 0 || name[0] >= n)
1481 1.104.2.2 yamt return (ENOENT); /* ENOSUCHPROCESSOR */
1482 1.104.2.2 yamt node.sysctl_size = sizeof(uint64_t) * CPUSTATES;
1483 1.104.2.2 yamt n = name[0];
1484 1.104.2.2 yamt /*
1485 1.104.2.2 yamt * adjust these so that sysctl_lookup() will be happy
1486 1.104.2.2 yamt */
1487 1.104.2.2 yamt name++;
1488 1.104.2.2 yamt namelen--;
1489 1.104.2.2 yamt break;
1490 1.104.2.2 yamt default:
1491 1.104.2.2 yamt return (EINVAL);
1492 1.104.2.2 yamt }
1493 1.104.2.2 yamt
1494 1.104.2.2 yamt cp_time = malloc(node.sysctl_size, M_TEMP, M_WAITOK|M_CANFAIL);
1495 1.104.2.2 yamt if (cp_time == NULL)
1496 1.104.2.2 yamt return (ENOMEM);
1497 1.104.2.2 yamt node.sysctl_data = cp_time;
1498 1.104.2.2 yamt memset(cp_time, 0, node.sysctl_size);
1499 1.104.2.2 yamt
1500 1.104.2.2 yamt for (CPU_INFO_FOREACH(cii, ci)) {
1501 1.104.2.2 yamt if (n <= 0)
1502 1.104.2.2 yamt for (i = 0; i < CPUSTATES; i++)
1503 1.104.2.2 yamt cp_time[i] += ci->ci_schedstate.spc_cp_time[i];
1504 1.104.2.2 yamt /*
1505 1.104.2.2 yamt * if a specific processor was requested and we just
1506 1.104.2.2 yamt * did it, we're done here
1507 1.104.2.2 yamt */
1508 1.104.2.2 yamt if (n == 0)
1509 1.104.2.2 yamt break;
1510 1.104.2.2 yamt /*
1511 1.104.2.2 yamt * if doing "all", skip to next cp_time set for next processor
1512 1.104.2.2 yamt */
1513 1.104.2.2 yamt if (n == -2)
1514 1.104.2.2 yamt cp_time += CPUSTATES;
1515 1.104.2.2 yamt /*
1516 1.104.2.2 yamt * if we're doing a specific processor, we're one
1517 1.104.2.2 yamt * processor closer
1518 1.104.2.2 yamt */
1519 1.104.2.2 yamt if (n > 0)
1520 1.104.2.2 yamt n--;
1521 1.104.2.2 yamt }
1522 1.104.2.2 yamt
1523 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
1524 1.104.2.2 yamt free(node.sysctl_data, M_TEMP);
1525 1.104.2.2 yamt return (error);
1526 1.104.2.2 yamt
1527 1.104.2.2 yamt #endif /* MULTIPROCESSOR */
1528 1.104.2.2 yamt }
1529 1.104.2.2 yamt
1530 1.104.2.2 yamt #if NPTY > 0
1531 1.104.2.2 yamt /*
1532 1.104.2.2 yamt * sysctl helper routine for kern.maxptys. ensures that any new value
1533 1.104.2.2 yamt * is acceptable to the pty subsystem.
1534 1.104.2.2 yamt */
1535 1.104.2.2 yamt static int
1536 1.104.2.2 yamt sysctl_kern_maxptys(SYSCTLFN_ARGS)
1537 1.104.2.2 yamt {
1538 1.104.2.2 yamt int pty_maxptys(int, int); /* defined in kern/tty_pty.c */
1539 1.104.2.2 yamt int error, xmax;
1540 1.104.2.2 yamt struct sysctlnode node;
1541 1.104.2.2 yamt
1542 1.104.2.2 yamt /* get current value of maxptys */
1543 1.104.2.2 yamt xmax = pty_maxptys(0, 0);
1544 1.104.2.2 yamt
1545 1.104.2.2 yamt node = *rnode;
1546 1.104.2.2 yamt node.sysctl_data = &xmax;
1547 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
1548 1.104.2.2 yamt if (error || newp == NULL)
1549 1.104.2.2 yamt return (error);
1550 1.104.2.2 yamt
1551 1.104.2.2 yamt if (xmax != pty_maxptys(xmax, 1))
1552 1.104.2.2 yamt return (EINVAL);
1553 1.104.2.2 yamt
1554 1.104.2.2 yamt return (0);
1555 1.104.2.2 yamt }
1556 1.104.2.2 yamt #endif /* NPTY > 0 */
1557 1.104.2.2 yamt
1558 1.104.2.2 yamt /*
1559 1.104.2.2 yamt * sysctl helper routine for kern.sbmax. basically just ensures that
1560 1.104.2.2 yamt * any new value is not too small.
1561 1.104.2.2 yamt */
1562 1.104.2.2 yamt static int
1563 1.104.2.2 yamt sysctl_kern_sbmax(SYSCTLFN_ARGS)
1564 1.104.2.2 yamt {
1565 1.104.2.2 yamt int error, new_sbmax;
1566 1.104.2.2 yamt struct sysctlnode node;
1567 1.104.2.2 yamt
1568 1.104.2.2 yamt new_sbmax = sb_max;
1569 1.104.2.2 yamt node = *rnode;
1570 1.104.2.2 yamt node.sysctl_data = &new_sbmax;
1571 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
1572 1.104.2.2 yamt if (error || newp == NULL)
1573 1.104.2.2 yamt return (error);
1574 1.104.2.2 yamt
1575 1.104.2.2 yamt error = sb_max_set(new_sbmax);
1576 1.104.2.2 yamt
1577 1.104.2.2 yamt return (error);
1578 1.104.2.2 yamt }
1579 1.104.2.2 yamt
1580 1.104.2.2 yamt /*
1581 1.104.2.2 yamt * sysctl helper routine for kern.urandom node. picks a random number
1582 1.104.2.2 yamt * for you.
1583 1.104.2.2 yamt */
1584 1.104.2.2 yamt static int
1585 1.104.2.2 yamt sysctl_kern_urnd(SYSCTLFN_ARGS)
1586 1.104.2.2 yamt {
1587 1.104.2.2 yamt #if NRND > 0
1588 1.104.2.2 yamt int v;
1589 1.104.2.2 yamt
1590 1.104.2.2 yamt if (rnd_extract_data(&v, sizeof(v), RND_EXTRACT_ANY) == sizeof(v)) {
1591 1.104.2.2 yamt struct sysctlnode node = *rnode;
1592 1.104.2.2 yamt node.sysctl_data = &v;
1593 1.104.2.2 yamt return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1594 1.104.2.2 yamt }
1595 1.104.2.2 yamt else
1596 1.104.2.2 yamt return (EIO); /*XXX*/
1597 1.104.2.2 yamt #else
1598 1.104.2.2 yamt return (EOPNOTSUPP);
1599 1.104.2.2 yamt #endif
1600 1.104.2.2 yamt }
1601 1.104.2.2 yamt
1602 1.104.2.2 yamt /*
1603 1.104.2.2 yamt * sysctl helper routine for kern.arandom node. picks a random number
1604 1.104.2.2 yamt * for you.
1605 1.104.2.2 yamt */
1606 1.104.2.2 yamt static int
1607 1.104.2.2 yamt sysctl_kern_arnd(SYSCTLFN_ARGS)
1608 1.104.2.2 yamt {
1609 1.104.2.2 yamt #if NRND > 0
1610 1.104.2.2 yamt int error;
1611 1.104.2.2 yamt void *v;
1612 1.104.2.2 yamt struct sysctlnode node = *rnode;
1613 1.104.2.2 yamt
1614 1.104.2.2 yamt if (*oldlenp == 0)
1615 1.104.2.2 yamt return 0;
1616 1.104.2.2 yamt if (*oldlenp > 8192)
1617 1.104.2.2 yamt return E2BIG;
1618 1.104.2.2 yamt
1619 1.104.2.2 yamt v = malloc(*oldlenp, M_TEMP, M_WAITOK);
1620 1.104.2.2 yamt
1621 1.104.2.2 yamt arc4randbytes(v, *oldlenp);
1622 1.104.2.2 yamt node.sysctl_data = v;
1623 1.104.2.2 yamt node.sysctl_size = *oldlenp;
1624 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
1625 1.104.2.2 yamt free(v, M_TEMP);
1626 1.104.2.2 yamt return error;
1627 1.104.2.2 yamt #else
1628 1.104.2.2 yamt return (EOPNOTSUPP);
1629 1.104.2.2 yamt #endif
1630 1.104.2.2 yamt }
1631 1.104.2.2 yamt /*
1632 1.104.2.2 yamt * sysctl helper routine to do kern.lwp.* work.
1633 1.104.2.2 yamt */
1634 1.104.2.2 yamt static int
1635 1.104.2.2 yamt sysctl_kern_lwp(SYSCTLFN_ARGS)
1636 1.104.2.2 yamt {
1637 1.104.2.2 yamt struct kinfo_lwp klwp;
1638 1.104.2.2 yamt struct proc *p;
1639 1.104.2.2 yamt struct lwp *l2;
1640 1.104.2.2 yamt char *where, *dp;
1641 1.104.2.2 yamt int pid, elem_size, elem_count;
1642 1.104.2.2 yamt int buflen, needed, error;
1643 1.104.2.2 yamt
1644 1.104.2.2 yamt if (namelen == 1 && name[0] == CTL_QUERY)
1645 1.104.2.2 yamt return (sysctl_query(SYSCTLFN_CALL(rnode)));
1646 1.104.2.2 yamt
1647 1.104.2.2 yamt dp = where = oldp;
1648 1.104.2.2 yamt buflen = where != NULL ? *oldlenp : 0;
1649 1.104.2.2 yamt error = needed = 0;
1650 1.104.2.2 yamt
1651 1.104.2.2 yamt if (newp != NULL || namelen != 3)
1652 1.104.2.2 yamt return (EINVAL);
1653 1.104.2.2 yamt pid = name[0];
1654 1.104.2.2 yamt elem_size = name[1];
1655 1.104.2.2 yamt elem_count = name[2];
1656 1.104.2.2 yamt
1657 1.104.2.2 yamt mutex_enter(&proclist_lock);
1658 1.104.2.2 yamt if (pid == -1) {
1659 1.104.2.2 yamt LIST_FOREACH(l2, &alllwp, l_list) {
1660 1.104.2.2 yamt if (buflen >= elem_size && elem_count > 0) {
1661 1.104.2.2 yamt lwp_lock(l2);
1662 1.104.2.2 yamt fill_lwp(l2, &klwp);
1663 1.104.2.2 yamt lwp_unlock(l2);
1664 1.104.2.2 yamt
1665 1.104.2.2 yamt /*
1666 1.104.2.2 yamt * Copy out elem_size, but not larger than
1667 1.104.2.2 yamt * the size of a struct kinfo_proc2.
1668 1.104.2.2 yamt *
1669 1.104.2.2 yamt * XXX We should not be holding p_smutex, but
1670 1.104.2.2 yamt * for now, the buffer is wired. Fix later.
1671 1.104.2.2 yamt */
1672 1.104.2.2 yamt error = dcopyout(l, &klwp, dp,
1673 1.104.2.2 yamt min(sizeof(klwp), elem_size));
1674 1.104.2.2 yamt if (error)
1675 1.104.2.2 yamt goto cleanup;
1676 1.104.2.2 yamt dp += elem_size;
1677 1.104.2.2 yamt buflen -= elem_size;
1678 1.104.2.2 yamt elem_count--;
1679 1.104.2.2 yamt }
1680 1.104.2.2 yamt needed += elem_size;
1681 1.104.2.2 yamt }
1682 1.104.2.2 yamt } else {
1683 1.104.2.2 yamt p = p_find(pid, PFIND_LOCKED);
1684 1.104.2.2 yamt if (p == NULL) {
1685 1.104.2.2 yamt mutex_exit(&proclist_lock);
1686 1.104.2.2 yamt return (ESRCH);
1687 1.104.2.2 yamt }
1688 1.104.2.2 yamt mutex_enter(&p->p_smutex);
1689 1.104.2.2 yamt LIST_FOREACH(l2, &p->p_lwps, l_sibling) {
1690 1.104.2.2 yamt if (buflen >= elem_size && elem_count > 0) {
1691 1.104.2.2 yamt lwp_lock(l2);
1692 1.104.2.2 yamt fill_lwp(l2, &klwp);
1693 1.104.2.2 yamt lwp_unlock(l2);
1694 1.104.2.2 yamt
1695 1.104.2.2 yamt /*
1696 1.104.2.2 yamt * Copy out elem_size, but not larger than
1697 1.104.2.2 yamt * the size of a struct kinfo_proc2.
1698 1.104.2.2 yamt *
1699 1.104.2.2 yamt * XXX We should not be holding p_smutex, but
1700 1.104.2.2 yamt * for now, the buffer is wired. Fix later.
1701 1.104.2.2 yamt */
1702 1.104.2.2 yamt error = dcopyout(l, &klwp, dp,
1703 1.104.2.2 yamt min(sizeof(klwp), elem_size));
1704 1.104.2.2 yamt if (error)
1705 1.104.2.2 yamt goto cleanup;
1706 1.104.2.2 yamt dp += elem_size;
1707 1.104.2.2 yamt buflen -= elem_size;
1708 1.104.2.2 yamt elem_count--;
1709 1.104.2.2 yamt }
1710 1.104.2.2 yamt needed += elem_size;
1711 1.104.2.2 yamt }
1712 1.104.2.2 yamt mutex_exit(&p->p_smutex);
1713 1.104.2.2 yamt }
1714 1.104.2.2 yamt mutex_exit(&proclist_lock);
1715 1.104.2.2 yamt
1716 1.104.2.2 yamt if (where != NULL) {
1717 1.104.2.2 yamt *oldlenp = dp - where;
1718 1.104.2.2 yamt if (needed > *oldlenp)
1719 1.104.2.2 yamt return (ENOMEM);
1720 1.104.2.2 yamt } else {
1721 1.104.2.2 yamt needed += KERN_LWPSLOP;
1722 1.104.2.2 yamt *oldlenp = needed;
1723 1.104.2.2 yamt }
1724 1.104.2.2 yamt return (0);
1725 1.104.2.2 yamt cleanup:
1726 1.104.2.2 yamt return (error);
1727 1.104.2.2 yamt }
1728 1.104.2.2 yamt
1729 1.104.2.2 yamt /*
1730 1.104.2.2 yamt * sysctl helper routine for kern.forkfsleep node. ensures that the
1731 1.104.2.2 yamt * given value is not too large or two small, and is at least one
1732 1.104.2.2 yamt * timer tick if not zero.
1733 1.104.2.2 yamt */
1734 1.104.2.2 yamt static int
1735 1.104.2.2 yamt sysctl_kern_forkfsleep(SYSCTLFN_ARGS)
1736 1.104.2.2 yamt {
1737 1.104.2.2 yamt /* userland sees value in ms, internally is in ticks */
1738 1.104.2.2 yamt extern int forkfsleep; /* defined in kern/kern_fork.c */
1739 1.104.2.2 yamt int error, timo, lsleep;
1740 1.104.2.2 yamt struct sysctlnode node;
1741 1.104.2.2 yamt
1742 1.104.2.2 yamt lsleep = forkfsleep * 1000 / hz;
1743 1.104.2.2 yamt node = *rnode;
1744 1.104.2.2 yamt node.sysctl_data = &lsleep;
1745 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
1746 1.104.2.2 yamt if (error || newp == NULL)
1747 1.104.2.2 yamt return (error);
1748 1.104.2.2 yamt
1749 1.104.2.2 yamt /* refuse negative values, and overly 'long time' */
1750 1.104.2.2 yamt if (lsleep < 0 || lsleep > MAXSLP * 1000)
1751 1.104.2.2 yamt return (EINVAL);
1752 1.104.2.2 yamt
1753 1.104.2.2 yamt timo = mstohz(lsleep);
1754 1.104.2.2 yamt
1755 1.104.2.2 yamt /* if the interval is >0 ms && <1 tick, use 1 tick */
1756 1.104.2.2 yamt if (lsleep != 0 && timo == 0)
1757 1.104.2.2 yamt forkfsleep = 1;
1758 1.104.2.2 yamt else
1759 1.104.2.2 yamt forkfsleep = timo;
1760 1.104.2.2 yamt
1761 1.104.2.2 yamt return (0);
1762 1.104.2.2 yamt }
1763 1.104.2.2 yamt
1764 1.104.2.2 yamt /*
1765 1.104.2.2 yamt * sysctl helper routine for kern.root_partition
1766 1.104.2.2 yamt */
1767 1.104.2.2 yamt static int
1768 1.104.2.2 yamt sysctl_kern_root_partition(SYSCTLFN_ARGS)
1769 1.104.2.2 yamt {
1770 1.104.2.2 yamt int rootpart = DISKPART(rootdev);
1771 1.104.2.2 yamt struct sysctlnode node = *rnode;
1772 1.104.2.2 yamt
1773 1.104.2.2 yamt node.sysctl_data = &rootpart;
1774 1.104.2.2 yamt return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1775 1.104.2.2 yamt }
1776 1.104.2.2 yamt
1777 1.104.2.2 yamt /*
1778 1.104.2.2 yamt * sysctl helper function for kern.drivers
1779 1.104.2.2 yamt */
1780 1.104.2.2 yamt static int
1781 1.104.2.2 yamt sysctl_kern_drivers(SYSCTLFN_ARGS)
1782 1.104.2.2 yamt {
1783 1.104.2.2 yamt int error;
1784 1.104.2.2 yamt size_t buflen;
1785 1.104.2.2 yamt struct kinfo_drivers kd;
1786 1.104.2.2 yamt char *start, *where;
1787 1.104.2.2 yamt const char *dname;
1788 1.104.2.2 yamt int i;
1789 1.104.2.2 yamt extern struct devsw_conv *devsw_conv;
1790 1.104.2.2 yamt extern int max_devsw_convs;
1791 1.104.2.2 yamt
1792 1.104.2.2 yamt if (newp != NULL || namelen != 0)
1793 1.104.2.2 yamt return (EINVAL);
1794 1.104.2.2 yamt
1795 1.104.2.2 yamt start = where = oldp;
1796 1.104.2.2 yamt buflen = *oldlenp;
1797 1.104.2.2 yamt if (where == NULL) {
1798 1.104.2.2 yamt *oldlenp = max_devsw_convs * sizeof kd;
1799 1.104.2.2 yamt return 0;
1800 1.104.2.2 yamt }
1801 1.104.2.2 yamt
1802 1.104.2.2 yamt /*
1803 1.104.2.2 yamt * An array of kinfo_drivers structures
1804 1.104.2.2 yamt */
1805 1.104.2.2 yamt error = 0;
1806 1.104.2.2 yamt for (i = 0; i < max_devsw_convs; i++) {
1807 1.104.2.2 yamt dname = devsw_conv[i].d_name;
1808 1.104.2.2 yamt if (dname == NULL)
1809 1.104.2.2 yamt continue;
1810 1.104.2.2 yamt if (buflen < sizeof kd) {
1811 1.104.2.2 yamt error = ENOMEM;
1812 1.104.2.2 yamt break;
1813 1.104.2.2 yamt }
1814 1.104.2.2 yamt memset(&kd, 0, sizeof(kd));
1815 1.104.2.2 yamt kd.d_bmajor = devsw_conv[i].d_bmajor;
1816 1.104.2.2 yamt kd.d_cmajor = devsw_conv[i].d_cmajor;
1817 1.104.2.2 yamt strlcpy(kd.d_name, dname, sizeof kd.d_name);
1818 1.104.2.2 yamt error = dcopyout(l, &kd, where, sizeof kd);
1819 1.104.2.2 yamt if (error != 0)
1820 1.104.2.2 yamt break;
1821 1.104.2.2 yamt buflen -= sizeof kd;
1822 1.104.2.2 yamt where += sizeof kd;
1823 1.104.2.2 yamt }
1824 1.104.2.2 yamt *oldlenp = where - start;
1825 1.104.2.2 yamt return error;
1826 1.104.2.2 yamt }
1827 1.104.2.2 yamt
1828 1.104.2.2 yamt /*
1829 1.104.2.2 yamt * sysctl helper function for kern.file2
1830 1.104.2.2 yamt */
1831 1.104.2.2 yamt static int
1832 1.104.2.2 yamt sysctl_kern_file2(SYSCTLFN_ARGS)
1833 1.104.2.2 yamt {
1834 1.104.2.2 yamt struct proc *p;
1835 1.104.2.2 yamt struct file *fp;
1836 1.104.2.2 yamt struct filedesc *fd;
1837 1.104.2.2 yamt struct kinfo_file kf;
1838 1.104.2.2 yamt char *dp;
1839 1.104.2.2 yamt u_int i, op;
1840 1.104.2.2 yamt size_t len, needed, elem_size, out_size;
1841 1.104.2.2 yamt int error, arg, elem_count;
1842 1.104.2.2 yamt
1843 1.104.2.2 yamt if (namelen == 1 && name[0] == CTL_QUERY)
1844 1.104.2.2 yamt return (sysctl_query(SYSCTLFN_CALL(rnode)));
1845 1.104.2.2 yamt
1846 1.104.2.2 yamt if (namelen != 4)
1847 1.104.2.2 yamt return (EINVAL);
1848 1.104.2.2 yamt
1849 1.104.2.2 yamt error = 0;
1850 1.104.2.2 yamt dp = oldp;
1851 1.104.2.2 yamt len = (oldp != NULL) ? *oldlenp : 0;
1852 1.104.2.2 yamt op = name[0];
1853 1.104.2.2 yamt arg = name[1];
1854 1.104.2.2 yamt elem_size = name[2];
1855 1.104.2.2 yamt elem_count = name[3];
1856 1.104.2.2 yamt out_size = MIN(sizeof(kf), elem_size);
1857 1.104.2.2 yamt needed = 0;
1858 1.104.2.2 yamt
1859 1.104.2.2 yamt if (elem_size < 1 || elem_count < 0)
1860 1.104.2.2 yamt return (EINVAL);
1861 1.104.2.2 yamt
1862 1.104.2.2 yamt switch (op) {
1863 1.104.2.2 yamt case KERN_FILE_BYFILE:
1864 1.104.2.2 yamt /*
1865 1.104.2.2 yamt * doesn't use arg so it must be zero
1866 1.104.2.2 yamt */
1867 1.104.2.2 yamt if (arg != 0)
1868 1.104.2.2 yamt return (EINVAL);
1869 1.104.2.2 yamt LIST_FOREACH(fp, &filehead, f_list) {
1870 1.104.2.2 yamt if (kauth_authorize_generic(l->l_cred,
1871 1.104.2.2 yamt KAUTH_GENERIC_CANSEE, fp->f_cred) != 0)
1872 1.104.2.2 yamt continue;
1873 1.104.2.2 yamt if (len >= elem_size && elem_count > 0) {
1874 1.104.2.2 yamt fill_file(&kf, fp, NULL, 0);
1875 1.104.2.2 yamt error = dcopyout(l, &kf, dp, out_size);
1876 1.104.2.2 yamt if (error)
1877 1.104.2.2 yamt break;
1878 1.104.2.2 yamt dp += elem_size;
1879 1.104.2.2 yamt len -= elem_size;
1880 1.104.2.2 yamt }
1881 1.104.2.2 yamt if (elem_count > 0) {
1882 1.104.2.2 yamt needed += elem_size;
1883 1.104.2.2 yamt if (elem_count != INT_MAX)
1884 1.104.2.2 yamt elem_count--;
1885 1.104.2.2 yamt }
1886 1.104.2.2 yamt }
1887 1.104.2.2 yamt break;
1888 1.104.2.2 yamt case KERN_FILE_BYPID:
1889 1.104.2.2 yamt if (arg < -1)
1890 1.104.2.2 yamt /* -1 means all processes */
1891 1.104.2.2 yamt return (EINVAL);
1892 1.104.2.2 yamt mutex_enter(&proclist_lock);
1893 1.104.2.2 yamt PROCLIST_FOREACH(p, &allproc) {
1894 1.104.2.2 yamt if (p->p_stat == SIDL)
1895 1.104.2.2 yamt /* skip embryonic processes */
1896 1.104.2.2 yamt continue;
1897 1.104.2.2 yamt if (kauth_authorize_process(l->l_cred,
1898 1.104.2.2 yamt KAUTH_PROCESS_CANSEE, p, NULL, NULL, NULL) != 0)
1899 1.104.2.2 yamt continue;
1900 1.104.2.2 yamt if (arg > 0 && p->p_pid != arg)
1901 1.104.2.2 yamt /* pick only the one we want */
1902 1.104.2.2 yamt /* XXX want 0 to mean "kernel files" */
1903 1.104.2.2 yamt continue;
1904 1.104.2.2 yamt fd = p->p_fd;
1905 1.104.2.2 yamt for (i = 0; i < fd->fd_nfiles; i++) {
1906 1.104.2.2 yamt fp = fd->fd_ofiles[i];
1907 1.104.2.2 yamt if (fp == NULL || !FILE_IS_USABLE(fp))
1908 1.104.2.2 yamt continue;
1909 1.104.2.2 yamt if (len >= elem_size && elem_count > 0) {
1910 1.104.2.2 yamt fill_file(&kf, fd->fd_ofiles[i],
1911 1.104.2.2 yamt p, i);
1912 1.104.2.2 yamt error = dcopyout(l, &kf, dp, out_size);
1913 1.104.2.2 yamt if (error)
1914 1.104.2.2 yamt break;
1915 1.104.2.2 yamt dp += elem_size;
1916 1.104.2.2 yamt len -= elem_size;
1917 1.104.2.2 yamt }
1918 1.104.2.2 yamt if (elem_count > 0) {
1919 1.104.2.2 yamt needed += elem_size;
1920 1.104.2.2 yamt if (elem_count != INT_MAX)
1921 1.104.2.2 yamt elem_count--;
1922 1.104.2.2 yamt }
1923 1.104.2.2 yamt }
1924 1.104.2.2 yamt }
1925 1.104.2.2 yamt mutex_exit(&proclist_lock);
1926 1.104.2.2 yamt break;
1927 1.104.2.2 yamt default:
1928 1.104.2.2 yamt return (EINVAL);
1929 1.104.2.2 yamt }
1930 1.104.2.2 yamt
1931 1.104.2.2 yamt if (oldp == NULL)
1932 1.104.2.2 yamt needed += KERN_FILESLOP * elem_size;
1933 1.104.2.2 yamt *oldlenp = needed;
1934 1.104.2.2 yamt
1935 1.104.2.2 yamt return (error);
1936 1.104.2.2 yamt }
1937 1.104.2.2 yamt
1938 1.104.2.2 yamt static void
1939 1.104.2.2 yamt fill_file(struct kinfo_file *kp, const struct file *fp, struct proc *p, int i)
1940 1.104.2.2 yamt {
1941 1.104.2.2 yamt
1942 1.104.2.2 yamt memset(kp, 0, sizeof(*kp));
1943 1.104.2.2 yamt
1944 1.104.2.2 yamt kp->ki_fileaddr = PTRTOUINT64(fp);
1945 1.104.2.2 yamt kp->ki_flag = fp->f_flag;
1946 1.104.2.2 yamt kp->ki_iflags = fp->f_iflags;
1947 1.104.2.2 yamt kp->ki_ftype = fp->f_type;
1948 1.104.2.2 yamt kp->ki_count = fp->f_count;
1949 1.104.2.2 yamt kp->ki_msgcount = fp->f_msgcount;
1950 1.104.2.2 yamt kp->ki_usecount = fp->f_usecount;
1951 1.104.2.2 yamt kp->ki_fucred = PTRTOUINT64(fp->f_cred);
1952 1.104.2.2 yamt kp->ki_fuid = kauth_cred_geteuid(fp->f_cred);
1953 1.104.2.2 yamt kp->ki_fgid = kauth_cred_getegid(fp->f_cred);
1954 1.104.2.2 yamt kp->ki_fops = PTRTOUINT64(fp->f_ops);
1955 1.104.2.2 yamt kp->ki_foffset = fp->f_offset;
1956 1.104.2.2 yamt kp->ki_fdata = PTRTOUINT64(fp->f_data);
1957 1.104.2.2 yamt
1958 1.104.2.2 yamt /* vnode information to glue this file to something */
1959 1.104.2.2 yamt if (fp->f_type == DTYPE_VNODE) {
1960 1.104.2.2 yamt struct vnode *vp = (struct vnode *)fp->f_data;
1961 1.104.2.2 yamt
1962 1.104.2.2 yamt kp->ki_vun = PTRTOUINT64(vp->v_un.vu_socket);
1963 1.104.2.2 yamt kp->ki_vsize = vp->v_size;
1964 1.104.2.2 yamt kp->ki_vtype = vp->v_type;
1965 1.104.2.2 yamt kp->ki_vtag = vp->v_tag;
1966 1.104.2.2 yamt kp->ki_vdata = PTRTOUINT64(vp->v_data);
1967 1.104.2.2 yamt }
1968 1.104.2.2 yamt
1969 1.104.2.2 yamt /* process information when retrieved via KERN_FILE_BYPID */
1970 1.104.2.2 yamt if (p) {
1971 1.104.2.2 yamt kp->ki_pid = p->p_pid;
1972 1.104.2.2 yamt kp->ki_fd = i;
1973 1.104.2.2 yamt kp->ki_ofileflags = p->p_fd->fd_ofileflags[i];
1974 1.104.2.2 yamt }
1975 1.104.2.2 yamt }
1976 1.104.2.2 yamt
1977 1.104.2.2 yamt static int
1978 1.104.2.2 yamt sysctl_doeproc(SYSCTLFN_ARGS)
1979 1.104.2.2 yamt {
1980 1.104.2.2 yamt struct eproc *eproc;
1981 1.104.2.2 yamt struct kinfo_proc2 *kproc2;
1982 1.104.2.2 yamt struct kinfo_proc *dp;
1983 1.104.2.2 yamt struct proc *p;
1984 1.104.2.2 yamt const struct proclist_desc *pd;
1985 1.104.2.2 yamt char *where, *dp2;
1986 1.104.2.2 yamt int type, op, arg;
1987 1.104.2.2 yamt u_int elem_size, elem_count;
1988 1.104.2.2 yamt size_t buflen, needed;
1989 1.104.2.2 yamt int error;
1990 1.104.2.2 yamt
1991 1.104.2.2 yamt if (namelen == 1 && name[0] == CTL_QUERY)
1992 1.104.2.2 yamt return (sysctl_query(SYSCTLFN_CALL(rnode)));
1993 1.104.2.2 yamt
1994 1.104.2.2 yamt dp = oldp;
1995 1.104.2.2 yamt dp2 = where = oldp;
1996 1.104.2.2 yamt buflen = where != NULL ? *oldlenp : 0;
1997 1.104.2.2 yamt error = 0;
1998 1.104.2.2 yamt needed = 0;
1999 1.104.2.2 yamt type = rnode->sysctl_num;
2000 1.104.2.2 yamt
2001 1.104.2.2 yamt if (type == KERN_PROC) {
2002 1.104.2.2 yamt if (namelen != 2 && !(namelen == 1 && name[0] == KERN_PROC_ALL))
2003 1.104.2.2 yamt return (EINVAL);
2004 1.104.2.2 yamt op = name[0];
2005 1.104.2.2 yamt if (op != KERN_PROC_ALL)
2006 1.104.2.2 yamt arg = name[1];
2007 1.104.2.2 yamt else
2008 1.104.2.2 yamt arg = 0; /* Quell compiler warning */
2009 1.104.2.2 yamt elem_size = elem_count = 0; /* Ditto */
2010 1.104.2.2 yamt } else {
2011 1.104.2.2 yamt if (namelen != 4)
2012 1.104.2.2 yamt return (EINVAL);
2013 1.104.2.2 yamt op = name[0];
2014 1.104.2.2 yamt arg = name[1];
2015 1.104.2.2 yamt elem_size = name[2];
2016 1.104.2.2 yamt elem_count = name[3];
2017 1.104.2.2 yamt }
2018 1.104.2.2 yamt
2019 1.104.2.2 yamt if (type == KERN_PROC) {
2020 1.104.2.2 yamt eproc = malloc(sizeof(*eproc), M_TEMP, M_WAITOK);
2021 1.104.2.2 yamt kproc2 = NULL;
2022 1.104.2.2 yamt } else {
2023 1.104.2.2 yamt eproc = NULL;
2024 1.104.2.2 yamt kproc2 = malloc(sizeof(*kproc2), M_TEMP, M_WAITOK);
2025 1.104.2.2 yamt }
2026 1.104.2.2 yamt mutex_enter(&proclist_lock);
2027 1.104.2.2 yamt
2028 1.104.2.2 yamt pd = proclists;
2029 1.104.2.2 yamt again:
2030 1.104.2.2 yamt PROCLIST_FOREACH(p, pd->pd_list) {
2031 1.104.2.2 yamt /*
2032 1.104.2.2 yamt * Skip embryonic processes.
2033 1.104.2.2 yamt */
2034 1.104.2.2 yamt if (p->p_stat == SIDL)
2035 1.104.2.2 yamt continue;
2036 1.104.2.2 yamt
2037 1.104.2.2 yamt if (kauth_authorize_process(l->l_cred,
2038 1.104.2.2 yamt KAUTH_PROCESS_CANSEE, p, NULL, NULL, NULL) != 0)
2039 1.104.2.2 yamt continue;
2040 1.104.2.2 yamt
2041 1.104.2.2 yamt /*
2042 1.104.2.2 yamt * TODO - make more efficient (see notes below).
2043 1.104.2.2 yamt * do by session.
2044 1.104.2.2 yamt */
2045 1.104.2.2 yamt switch (op) {
2046 1.104.2.2 yamt
2047 1.104.2.2 yamt case KERN_PROC_PID:
2048 1.104.2.2 yamt /* could do this with just a lookup */
2049 1.104.2.2 yamt if (p->p_pid != (pid_t)arg)
2050 1.104.2.2 yamt continue;
2051 1.104.2.2 yamt break;
2052 1.104.2.2 yamt
2053 1.104.2.2 yamt case KERN_PROC_PGRP:
2054 1.104.2.2 yamt /* could do this by traversing pgrp */
2055 1.104.2.2 yamt if (p->p_pgrp->pg_id != (pid_t)arg)
2056 1.104.2.2 yamt continue;
2057 1.104.2.2 yamt break;
2058 1.104.2.2 yamt
2059 1.104.2.2 yamt case KERN_PROC_SESSION:
2060 1.104.2.2 yamt if (p->p_session->s_sid != (pid_t)arg)
2061 1.104.2.2 yamt continue;
2062 1.104.2.2 yamt break;
2063 1.104.2.2 yamt
2064 1.104.2.2 yamt case KERN_PROC_TTY:
2065 1.104.2.2 yamt if (arg == (int) KERN_PROC_TTY_REVOKE) {
2066 1.104.2.2 yamt if ((p->p_lflag & PL_CONTROLT) == 0 ||
2067 1.104.2.2 yamt p->p_session->s_ttyp == NULL ||
2068 1.104.2.2 yamt p->p_session->s_ttyvp != NULL)
2069 1.104.2.2 yamt continue;
2070 1.104.2.2 yamt } else if ((p->p_lflag & PL_CONTROLT) == 0 ||
2071 1.104.2.2 yamt p->p_session->s_ttyp == NULL) {
2072 1.104.2.2 yamt if ((dev_t)arg != KERN_PROC_TTY_NODEV)
2073 1.104.2.2 yamt continue;
2074 1.104.2.2 yamt } else if (p->p_session->s_ttyp->t_dev != (dev_t)arg)
2075 1.104.2.2 yamt continue;
2076 1.104.2.2 yamt break;
2077 1.104.2.2 yamt
2078 1.104.2.2 yamt case KERN_PROC_UID:
2079 1.104.2.2 yamt if (kauth_cred_geteuid(p->p_cred) != (uid_t)arg)
2080 1.104.2.2 yamt continue;
2081 1.104.2.2 yamt break;
2082 1.104.2.2 yamt
2083 1.104.2.2 yamt case KERN_PROC_RUID:
2084 1.104.2.2 yamt if (kauth_cred_getuid(p->p_cred) != (uid_t)arg)
2085 1.104.2.2 yamt continue;
2086 1.104.2.2 yamt break;
2087 1.104.2.2 yamt
2088 1.104.2.2 yamt case KERN_PROC_GID:
2089 1.104.2.2 yamt if (kauth_cred_getegid(p->p_cred) != (uid_t)arg)
2090 1.104.2.2 yamt continue;
2091 1.104.2.2 yamt break;
2092 1.104.2.2 yamt
2093 1.104.2.2 yamt case KERN_PROC_RGID:
2094 1.104.2.2 yamt if (kauth_cred_getgid(p->p_cred) != (uid_t)arg)
2095 1.104.2.2 yamt continue;
2096 1.104.2.2 yamt break;
2097 1.104.2.2 yamt
2098 1.104.2.2 yamt case KERN_PROC_ALL:
2099 1.104.2.2 yamt /* allow everything */
2100 1.104.2.2 yamt break;
2101 1.104.2.2 yamt
2102 1.104.2.2 yamt default:
2103 1.104.2.2 yamt error = EINVAL;
2104 1.104.2.2 yamt goto cleanup;
2105 1.104.2.2 yamt }
2106 1.104.2.2 yamt if (type == KERN_PROC) {
2107 1.104.2.2 yamt if (buflen >= sizeof(struct kinfo_proc)) {
2108 1.104.2.2 yamt fill_eproc(p, eproc);
2109 1.104.2.2 yamt error = dcopyout(l, p, &dp->kp_proc,
2110 1.104.2.2 yamt sizeof(struct proc));
2111 1.104.2.2 yamt if (error)
2112 1.104.2.2 yamt goto cleanup;
2113 1.104.2.2 yamt error = dcopyout(l, eproc, &dp->kp_eproc,
2114 1.104.2.2 yamt sizeof(*eproc));
2115 1.104.2.2 yamt if (error)
2116 1.104.2.2 yamt goto cleanup;
2117 1.104.2.2 yamt dp++;
2118 1.104.2.2 yamt buflen -= sizeof(struct kinfo_proc);
2119 1.104.2.2 yamt }
2120 1.104.2.2 yamt needed += sizeof(struct kinfo_proc);
2121 1.104.2.2 yamt } else { /* KERN_PROC2 */
2122 1.104.2.2 yamt if (buflen >= elem_size && elem_count > 0) {
2123 1.104.2.2 yamt fill_kproc2(p, kproc2);
2124 1.104.2.2 yamt /*
2125 1.104.2.2 yamt * Copy out elem_size, but not larger than
2126 1.104.2.2 yamt * the size of a struct kinfo_proc2.
2127 1.104.2.2 yamt */
2128 1.104.2.2 yamt error = dcopyout(l, kproc2, dp2,
2129 1.104.2.2 yamt min(sizeof(*kproc2), elem_size));
2130 1.104.2.2 yamt if (error)
2131 1.104.2.2 yamt goto cleanup;
2132 1.104.2.2 yamt dp2 += elem_size;
2133 1.104.2.2 yamt buflen -= elem_size;
2134 1.104.2.2 yamt elem_count--;
2135 1.104.2.2 yamt }
2136 1.104.2.2 yamt needed += elem_size;
2137 1.104.2.2 yamt }
2138 1.104.2.2 yamt }
2139 1.104.2.2 yamt pd++;
2140 1.104.2.2 yamt if (pd->pd_list != NULL)
2141 1.104.2.2 yamt goto again;
2142 1.104.2.2 yamt mutex_exit(&proclist_lock);
2143 1.104.2.2 yamt
2144 1.104.2.2 yamt if (where != NULL) {
2145 1.104.2.2 yamt if (type == KERN_PROC)
2146 1.104.2.2 yamt *oldlenp = (char *)dp - where;
2147 1.104.2.2 yamt else
2148 1.104.2.2 yamt *oldlenp = dp2 - where;
2149 1.104.2.2 yamt if (needed > *oldlenp) {
2150 1.104.2.2 yamt error = ENOMEM;
2151 1.104.2.2 yamt goto out;
2152 1.104.2.2 yamt }
2153 1.104.2.2 yamt } else {
2154 1.104.2.2 yamt needed += KERN_PROCSLOP;
2155 1.104.2.2 yamt *oldlenp = needed;
2156 1.104.2.2 yamt }
2157 1.104.2.2 yamt if (kproc2)
2158 1.104.2.2 yamt free(kproc2, M_TEMP);
2159 1.104.2.2 yamt if (eproc)
2160 1.104.2.2 yamt free(eproc, M_TEMP);
2161 1.104.2.2 yamt return 0;
2162 1.104.2.2 yamt cleanup:
2163 1.104.2.2 yamt mutex_exit(&proclist_lock);
2164 1.104.2.2 yamt out:
2165 1.104.2.2 yamt if (kproc2)
2166 1.104.2.2 yamt free(kproc2, M_TEMP);
2167 1.104.2.2 yamt if (eproc)
2168 1.104.2.2 yamt free(eproc, M_TEMP);
2169 1.104.2.2 yamt return error;
2170 1.104.2.2 yamt }
2171 1.104.2.2 yamt
2172 1.104.2.2 yamt /*
2173 1.104.2.2 yamt * sysctl helper routine for kern.proc_args pseudo-subtree.
2174 1.104.2.2 yamt */
2175 1.104.2.2 yamt static int
2176 1.104.2.2 yamt sysctl_kern_proc_args(SYSCTLFN_ARGS)
2177 1.104.2.2 yamt {
2178 1.104.2.2 yamt struct ps_strings pss;
2179 1.104.2.2 yamt struct proc *p;
2180 1.104.2.2 yamt size_t len, i;
2181 1.104.2.2 yamt struct uio auio;
2182 1.104.2.2 yamt struct iovec aiov;
2183 1.104.2.2 yamt pid_t pid;
2184 1.104.2.2 yamt int nargv, type, error;
2185 1.104.2.2 yamt char *arg;
2186 1.104.2.2 yamt char **argv = NULL;
2187 1.104.2.2 yamt char *tmp;
2188 1.104.2.2 yamt struct vmspace *vmspace;
2189 1.104.2.2 yamt vaddr_t psstr_addr;
2190 1.104.2.2 yamt vaddr_t offsetn;
2191 1.104.2.2 yamt vaddr_t offsetv;
2192 1.104.2.2 yamt
2193 1.104.2.2 yamt if (namelen == 1 && name[0] == CTL_QUERY)
2194 1.104.2.2 yamt return (sysctl_query(SYSCTLFN_CALL(rnode)));
2195 1.104.2.2 yamt
2196 1.104.2.2 yamt if (newp != NULL || namelen != 2)
2197 1.104.2.2 yamt return (EINVAL);
2198 1.104.2.2 yamt pid = name[0];
2199 1.104.2.2 yamt type = name[1];
2200 1.104.2.2 yamt
2201 1.104.2.2 yamt switch (type) {
2202 1.104.2.2 yamt case KERN_PROC_ARGV:
2203 1.104.2.2 yamt case KERN_PROC_NARGV:
2204 1.104.2.2 yamt case KERN_PROC_ENV:
2205 1.104.2.2 yamt case KERN_PROC_NENV:
2206 1.104.2.2 yamt /* ok */
2207 1.104.2.2 yamt break;
2208 1.104.2.2 yamt default:
2209 1.104.2.2 yamt return (EINVAL);
2210 1.104.2.2 yamt }
2211 1.104.2.2 yamt
2212 1.104.2.2 yamt mutex_enter(&proclist_lock);
2213 1.104.2.2 yamt
2214 1.104.2.2 yamt /* check pid */
2215 1.104.2.2 yamt if ((p = p_find(pid, PFIND_LOCKED)) == NULL) {
2216 1.104.2.2 yamt error = EINVAL;
2217 1.104.2.2 yamt goto out_locked;
2218 1.104.2.2 yamt }
2219 1.104.2.2 yamt
2220 1.104.2.2 yamt error = kauth_authorize_process(l->l_cred,
2221 1.104.2.2 yamt KAUTH_PROCESS_CANSEE, p, NULL, NULL, NULL);
2222 1.104.2.2 yamt if (error) {
2223 1.104.2.2 yamt goto out_locked;
2224 1.104.2.2 yamt }
2225 1.104.2.2 yamt
2226 1.104.2.2 yamt /* only root or same user change look at the environment */
2227 1.104.2.2 yamt if (type == KERN_PROC_ENV || type == KERN_PROC_NENV) {
2228 1.104.2.2 yamt if (kauth_authorize_generic(l->l_cred, KAUTH_GENERIC_ISSUSER,
2229 1.104.2.2 yamt NULL) != 0) {
2230 1.104.2.2 yamt if (kauth_cred_getuid(l->l_cred) !=
2231 1.104.2.2 yamt kauth_cred_getuid(p->p_cred) ||
2232 1.104.2.2 yamt kauth_cred_getuid(l->l_cred) !=
2233 1.104.2.2 yamt kauth_cred_getsvuid(p->p_cred)) {
2234 1.104.2.2 yamt error = EPERM;
2235 1.104.2.2 yamt goto out_locked;
2236 1.104.2.2 yamt }
2237 1.104.2.2 yamt }
2238 1.104.2.2 yamt }
2239 1.104.2.2 yamt
2240 1.104.2.2 yamt if (oldp == NULL) {
2241 1.104.2.2 yamt if (type == KERN_PROC_NARGV || type == KERN_PROC_NENV)
2242 1.104.2.2 yamt *oldlenp = sizeof (int);
2243 1.104.2.2 yamt else
2244 1.104.2.2 yamt *oldlenp = ARG_MAX; /* XXX XXX XXX */
2245 1.104.2.2 yamt error = 0;
2246 1.104.2.2 yamt goto out_locked;
2247 1.104.2.2 yamt }
2248 1.104.2.2 yamt
2249 1.104.2.2 yamt /*
2250 1.104.2.2 yamt * Zombies don't have a stack, so we can't read their psstrings.
2251 1.104.2.2 yamt * System processes also don't have a user stack.
2252 1.104.2.2 yamt */
2253 1.104.2.2 yamt if (P_ZOMBIE(p) || (p->p_flag & PK_SYSTEM) != 0) {
2254 1.104.2.2 yamt error = EINVAL;
2255 1.104.2.2 yamt goto out_locked;
2256 1.104.2.2 yamt }
2257 1.104.2.2 yamt
2258 1.104.2.2 yamt /*
2259 1.104.2.2 yamt * Lock the process down in memory.
2260 1.104.2.2 yamt */
2261 1.104.2.2 yamt /* XXXCDC: how should locking work here? */
2262 1.104.2.2 yamt if ((l->l_flag & LW_WEXIT) || (p->p_vmspace->vm_refcnt < 1)) {
2263 1.104.2.2 yamt error = EFAULT;
2264 1.104.2.2 yamt goto out_locked;
2265 1.104.2.2 yamt }
2266 1.104.2.2 yamt
2267 1.104.2.2 yamt psstr_addr = (vaddr_t)p->p_psstr;
2268 1.104.2.2 yamt if (type == KERN_PROC_ARGV || type == KERN_PROC_NARGV) {
2269 1.104.2.2 yamt offsetn = p->p_psnargv;
2270 1.104.2.2 yamt offsetv = p->p_psargv;
2271 1.104.2.2 yamt } else {
2272 1.104.2.2 yamt offsetn = p->p_psnenv;
2273 1.104.2.2 yamt offsetv = p->p_psenv;
2274 1.104.2.2 yamt }
2275 1.104.2.2 yamt vmspace = p->p_vmspace;
2276 1.104.2.2 yamt vmspace->vm_refcnt++; /* XXX */
2277 1.104.2.2 yamt
2278 1.104.2.2 yamt mutex_exit(&proclist_lock);
2279 1.104.2.2 yamt
2280 1.104.2.2 yamt /*
2281 1.104.2.2 yamt * Allocate a temporary buffer to hold the arguments.
2282 1.104.2.2 yamt */
2283 1.104.2.2 yamt arg = malloc(PAGE_SIZE, M_TEMP, M_WAITOK);
2284 1.104.2.2 yamt
2285 1.104.2.2 yamt /*
2286 1.104.2.2 yamt * Read in the ps_strings structure.
2287 1.104.2.2 yamt */
2288 1.104.2.2 yamt aiov.iov_base = &pss;
2289 1.104.2.2 yamt aiov.iov_len = sizeof(pss);
2290 1.104.2.2 yamt auio.uio_iov = &aiov;
2291 1.104.2.2 yamt auio.uio_iovcnt = 1;
2292 1.104.2.2 yamt auio.uio_offset = psstr_addr;
2293 1.104.2.2 yamt auio.uio_resid = sizeof(pss);
2294 1.104.2.2 yamt auio.uio_rw = UIO_READ;
2295 1.104.2.2 yamt UIO_SETUP_SYSSPACE(&auio);
2296 1.104.2.2 yamt error = uvm_io(&vmspace->vm_map, &auio);
2297 1.104.2.2 yamt if (error)
2298 1.104.2.2 yamt goto done;
2299 1.104.2.2 yamt
2300 1.104.2.2 yamt memcpy(&nargv, (char *)&pss + offsetn, sizeof(nargv));
2301 1.104.2.2 yamt if (type == KERN_PROC_NARGV || type == KERN_PROC_NENV) {
2302 1.104.2.2 yamt error = dcopyout(l, &nargv, oldp, sizeof(nargv));
2303 1.104.2.2 yamt *oldlenp = sizeof(nargv);
2304 1.104.2.2 yamt goto done;
2305 1.104.2.2 yamt }
2306 1.104.2.2 yamt /*
2307 1.104.2.2 yamt * Now read the address of the argument vector.
2308 1.104.2.2 yamt */
2309 1.104.2.2 yamt switch (type) {
2310 1.104.2.2 yamt case KERN_PROC_ARGV:
2311 1.104.2.2 yamt /* FALLTHROUGH */
2312 1.104.2.2 yamt case KERN_PROC_ENV:
2313 1.104.2.2 yamt memcpy(&tmp, (char *)&pss + offsetv, sizeof(tmp));
2314 1.104.2.2 yamt break;
2315 1.104.2.2 yamt default:
2316 1.104.2.2 yamt return (EINVAL);
2317 1.104.2.2 yamt }
2318 1.104.2.2 yamt
2319 1.104.2.2 yamt #ifdef COMPAT_NETBSD32
2320 1.104.2.2 yamt if (p->p_flag & PK_32)
2321 1.104.2.2 yamt len = sizeof(netbsd32_charp) * nargv;
2322 1.104.2.2 yamt else
2323 1.104.2.2 yamt #endif
2324 1.104.2.2 yamt len = sizeof(char *) * nargv;
2325 1.104.2.2 yamt
2326 1.104.2.2 yamt argv = malloc(len, M_TEMP, M_WAITOK);
2327 1.104.2.2 yamt
2328 1.104.2.2 yamt aiov.iov_base = argv;
2329 1.104.2.2 yamt aiov.iov_len = len;
2330 1.104.2.2 yamt auio.uio_iov = &aiov;
2331 1.104.2.2 yamt auio.uio_iovcnt = 1;
2332 1.104.2.2 yamt auio.uio_offset = (off_t)(unsigned long)tmp;
2333 1.104.2.2 yamt auio.uio_resid = len;
2334 1.104.2.2 yamt auio.uio_rw = UIO_READ;
2335 1.104.2.2 yamt UIO_SETUP_SYSSPACE(&auio);
2336 1.104.2.2 yamt error = uvm_io(&vmspace->vm_map, &auio);
2337 1.104.2.2 yamt if (error)
2338 1.104.2.2 yamt goto done;
2339 1.104.2.2 yamt
2340 1.104.2.2 yamt /*
2341 1.104.2.2 yamt * Now copy each string.
2342 1.104.2.2 yamt */
2343 1.104.2.2 yamt len = 0; /* bytes written to user buffer */
2344 1.104.2.2 yamt for (i = 0; i < nargv; i++) {
2345 1.104.2.2 yamt int finished = 0;
2346 1.104.2.2 yamt vaddr_t base;
2347 1.104.2.2 yamt size_t xlen;
2348 1.104.2.2 yamt int j;
2349 1.104.2.2 yamt
2350 1.104.2.2 yamt #ifdef COMPAT_NETBSD32
2351 1.104.2.2 yamt if (p->p_flag & PK_32) {
2352 1.104.2.2 yamt netbsd32_charp *argv32;
2353 1.104.2.2 yamt
2354 1.104.2.2 yamt argv32 = (netbsd32_charp *)argv;
2355 1.104.2.2 yamt
2356 1.104.2.2 yamt base = (vaddr_t)NETBSD32PTR64(argv32[i]);
2357 1.104.2.2 yamt } else
2358 1.104.2.2 yamt #endif
2359 1.104.2.2 yamt base = (vaddr_t)argv[i];
2360 1.104.2.2 yamt
2361 1.104.2.2 yamt while (!finished) {
2362 1.104.2.2 yamt xlen = PAGE_SIZE - (base & PAGE_MASK);
2363 1.104.2.2 yamt
2364 1.104.2.2 yamt aiov.iov_base = arg;
2365 1.104.2.2 yamt aiov.iov_len = PAGE_SIZE;
2366 1.104.2.2 yamt auio.uio_iov = &aiov;
2367 1.104.2.2 yamt auio.uio_iovcnt = 1;
2368 1.104.2.2 yamt auio.uio_offset = base;
2369 1.104.2.2 yamt auio.uio_resid = xlen;
2370 1.104.2.2 yamt auio.uio_rw = UIO_READ;
2371 1.104.2.2 yamt UIO_SETUP_SYSSPACE(&auio);
2372 1.104.2.2 yamt error = uvm_io(&vmspace->vm_map, &auio);
2373 1.104.2.2 yamt if (error)
2374 1.104.2.2 yamt goto done;
2375 1.104.2.2 yamt
2376 1.104.2.2 yamt /* Look for the end of the string */
2377 1.104.2.2 yamt for (j = 0; j < xlen; j++) {
2378 1.104.2.2 yamt if (arg[j] == '\0') {
2379 1.104.2.2 yamt xlen = j + 1;
2380 1.104.2.2 yamt finished = 1;
2381 1.104.2.2 yamt break;
2382 1.104.2.2 yamt }
2383 1.104.2.2 yamt }
2384 1.104.2.2 yamt
2385 1.104.2.2 yamt /* Check for user buffer overflow */
2386 1.104.2.2 yamt if (len + xlen > *oldlenp) {
2387 1.104.2.2 yamt finished = 1;
2388 1.104.2.2 yamt if (len > *oldlenp)
2389 1.104.2.2 yamt xlen = 0;
2390 1.104.2.2 yamt else
2391 1.104.2.2 yamt xlen = *oldlenp - len;
2392 1.104.2.2 yamt }
2393 1.104.2.2 yamt
2394 1.104.2.2 yamt /* Copyout the page */
2395 1.104.2.2 yamt error = dcopyout(l, arg, (char *)oldp + len, xlen);
2396 1.104.2.2 yamt if (error)
2397 1.104.2.2 yamt goto done;
2398 1.104.2.2 yamt
2399 1.104.2.2 yamt len += xlen;
2400 1.104.2.2 yamt base += xlen;
2401 1.104.2.2 yamt }
2402 1.104.2.2 yamt }
2403 1.104.2.2 yamt *oldlenp = len;
2404 1.104.2.2 yamt
2405 1.104.2.2 yamt done:
2406 1.104.2.2 yamt if (argv != NULL)
2407 1.104.2.2 yamt free(argv, M_TEMP);
2408 1.104.2.2 yamt
2409 1.104.2.2 yamt uvmspace_free(vmspace);
2410 1.104.2.2 yamt
2411 1.104.2.2 yamt free(arg, M_TEMP);
2412 1.104.2.2 yamt return error;
2413 1.104.2.2 yamt
2414 1.104.2.2 yamt out_locked:
2415 1.104.2.2 yamt mutex_exit(&proclist_lock);
2416 1.104.2.2 yamt return error;
2417 1.104.2.2 yamt }
2418 1.104.2.2 yamt
2419 1.104.2.2 yamt static int
2420 1.104.2.2 yamt sysctl_security_setidcore(SYSCTLFN_ARGS)
2421 1.104.2.2 yamt {
2422 1.104.2.2 yamt int newsize, error;
2423 1.104.2.2 yamt struct sysctlnode node;
2424 1.104.2.2 yamt
2425 1.104.2.2 yamt node = *rnode;
2426 1.104.2.2 yamt node.sysctl_data = &newsize;
2427 1.104.2.2 yamt newsize = *(int *)rnode->sysctl_data;
2428 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
2429 1.104.2.2 yamt if (error || newp == NULL)
2430 1.104.2.2 yamt return error;
2431 1.104.2.2 yamt
2432 1.104.2.2 yamt if (kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_SETIDCORE,
2433 1.104.2.2 yamt 0, NULL, NULL, NULL))
2434 1.104.2.2 yamt return (EPERM);
2435 1.104.2.2 yamt
2436 1.104.2.2 yamt *(int *)rnode->sysctl_data = newsize;
2437 1.104.2.2 yamt
2438 1.104.2.2 yamt return 0;
2439 1.104.2.2 yamt }
2440 1.104.2.2 yamt
2441 1.104.2.2 yamt static int
2442 1.104.2.2 yamt sysctl_security_setidcorename(SYSCTLFN_ARGS)
2443 1.104.2.2 yamt {
2444 1.104.2.2 yamt int error;
2445 1.104.2.2 yamt char *newsetidcorename;
2446 1.104.2.2 yamt struct sysctlnode node;
2447 1.104.2.2 yamt
2448 1.104.2.2 yamt newsetidcorename = PNBUF_GET();
2449 1.104.2.2 yamt node = *rnode;
2450 1.104.2.2 yamt node.sysctl_data = newsetidcorename;
2451 1.104.2.2 yamt memcpy(node.sysctl_data, rnode->sysctl_data, MAXPATHLEN);
2452 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
2453 1.104.2.2 yamt if (error || newp == NULL) {
2454 1.104.2.2 yamt goto out;
2455 1.104.2.2 yamt }
2456 1.104.2.2 yamt if (kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_SETIDCORE,
2457 1.104.2.2 yamt 0, NULL, NULL, NULL)) {
2458 1.104.2.2 yamt error = EPERM;
2459 1.104.2.2 yamt goto out;
2460 1.104.2.2 yamt }
2461 1.104.2.2 yamt if (strlen(newsetidcorename) == 0) {
2462 1.104.2.2 yamt error = EINVAL;
2463 1.104.2.2 yamt goto out;
2464 1.104.2.2 yamt }
2465 1.104.2.2 yamt memcpy(rnode->sysctl_data, node.sysctl_data, MAXPATHLEN);
2466 1.104.2.2 yamt out:
2467 1.104.2.2 yamt PNBUF_PUT(newsetidcorename);
2468 1.104.2.2 yamt return error;
2469 1.104.2.2 yamt }
2470 1.104.2.2 yamt
2471 1.104.2.2 yamt /*
2472 1.104.2.2 yamt * sysctl helper routine for kern.cp_id node. maps cpus to their
2473 1.104.2.2 yamt * cpuids.
2474 1.104.2.2 yamt */
2475 1.104.2.2 yamt static int
2476 1.104.2.2 yamt sysctl_kern_cpid(SYSCTLFN_ARGS)
2477 1.104.2.2 yamt {
2478 1.104.2.2 yamt struct sysctlnode node = *rnode;
2479 1.104.2.2 yamt
2480 1.104.2.2 yamt #ifndef MULTIPROCESSOR
2481 1.104.2.2 yamt uint64_t id;
2482 1.104.2.2 yamt
2483 1.104.2.2 yamt if (namelen == 1) {
2484 1.104.2.2 yamt if (name[0] != 0)
2485 1.104.2.2 yamt return (ENOENT);
2486 1.104.2.2 yamt /*
2487 1.104.2.2 yamt * you're allowed to ask for the zero'th processor
2488 1.104.2.2 yamt */
2489 1.104.2.2 yamt name++;
2490 1.104.2.2 yamt namelen--;
2491 1.104.2.2 yamt }
2492 1.104.2.2 yamt node.sysctl_data = &id;
2493 1.104.2.2 yamt node.sysctl_size = sizeof(id);
2494 1.104.2.2 yamt id = cpu_number();
2495 1.104.2.2 yamt return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2496 1.104.2.2 yamt
2497 1.104.2.2 yamt #else /* MULTIPROCESSOR */
2498 1.104.2.2 yamt uint64_t *cp_id = NULL;
2499 1.104.2.2 yamt int error, n = ncpu;
2500 1.104.2.2 yamt struct cpu_info *ci;
2501 1.104.2.2 yamt CPU_INFO_ITERATOR cii;
2502 1.104.2.2 yamt
2503 1.104.2.2 yamt /*
2504 1.104.2.2 yamt * here you may either retrieve a single cpu id or the whole
2505 1.104.2.2 yamt * set. the size you get back when probing depends on what
2506 1.104.2.2 yamt * you ask for.
2507 1.104.2.2 yamt */
2508 1.104.2.2 yamt switch (namelen) {
2509 1.104.2.2 yamt case 0:
2510 1.104.2.2 yamt node.sysctl_size = n * sizeof(uint64_t);
2511 1.104.2.2 yamt n = -2; /* ALL */
2512 1.104.2.2 yamt break;
2513 1.104.2.2 yamt case 1:
2514 1.104.2.2 yamt if (name[0] < 0 || name[0] >= n)
2515 1.104.2.2 yamt return (ENOENT); /* ENOSUCHPROCESSOR */
2516 1.104.2.2 yamt node.sysctl_size = sizeof(uint64_t);
2517 1.104.2.2 yamt n = name[0];
2518 1.104.2.2 yamt /*
2519 1.104.2.2 yamt * adjust these so that sysctl_lookup() will be happy
2520 1.104.2.2 yamt */
2521 1.104.2.2 yamt name++;
2522 1.104.2.2 yamt namelen--;
2523 1.104.2.2 yamt break;
2524 1.104.2.2 yamt default:
2525 1.104.2.2 yamt return (EINVAL);
2526 1.104.2.2 yamt }
2527 1.104.2.2 yamt
2528 1.104.2.2 yamt cp_id = malloc(node.sysctl_size, M_TEMP, M_WAITOK|M_CANFAIL);
2529 1.104.2.2 yamt if (cp_id == NULL)
2530 1.104.2.2 yamt return (ENOMEM);
2531 1.104.2.2 yamt node.sysctl_data = cp_id;
2532 1.104.2.2 yamt memset(cp_id, 0, node.sysctl_size);
2533 1.104.2.2 yamt
2534 1.104.2.2 yamt for (CPU_INFO_FOREACH(cii, ci)) {
2535 1.104.2.2 yamt if (n <= 0)
2536 1.104.2.2 yamt cp_id[0] = ci->ci_cpuid;
2537 1.104.2.2 yamt /*
2538 1.104.2.2 yamt * if a specific processor was requested and we just
2539 1.104.2.2 yamt * did it, we're done here
2540 1.104.2.2 yamt */
2541 1.104.2.2 yamt if (n == 0)
2542 1.104.2.2 yamt break;
2543 1.104.2.2 yamt /*
2544 1.104.2.2 yamt * if doing "all", skip to next cp_id slot for next processor
2545 1.104.2.2 yamt */
2546 1.104.2.2 yamt if (n == -2)
2547 1.104.2.2 yamt cp_id++;
2548 1.104.2.2 yamt /*
2549 1.104.2.2 yamt * if we're doing a specific processor, we're one
2550 1.104.2.2 yamt * processor closer
2551 1.104.2.2 yamt */
2552 1.104.2.2 yamt if (n > 0)
2553 1.104.2.2 yamt n--;
2554 1.104.2.2 yamt }
2555 1.104.2.2 yamt
2556 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
2557 1.104.2.2 yamt free(node.sysctl_data, M_TEMP);
2558 1.104.2.2 yamt return (error);
2559 1.104.2.2 yamt
2560 1.104.2.2 yamt #endif /* MULTIPROCESSOR */
2561 1.104.2.2 yamt }
2562 1.104.2.2 yamt
2563 1.104.2.2 yamt /*
2564 1.104.2.2 yamt * sysctl helper routine for hw.usermem and hw.usermem64. values are
2565 1.104.2.2 yamt * calculate on the fly taking into account integer overflow and the
2566 1.104.2.2 yamt * current wired count.
2567 1.104.2.2 yamt */
2568 1.104.2.2 yamt static int
2569 1.104.2.2 yamt sysctl_hw_usermem(SYSCTLFN_ARGS)
2570 1.104.2.2 yamt {
2571 1.104.2.2 yamt u_int ui;
2572 1.104.2.2 yamt u_quad_t uq;
2573 1.104.2.2 yamt struct sysctlnode node;
2574 1.104.2.2 yamt
2575 1.104.2.2 yamt node = *rnode;
2576 1.104.2.2 yamt switch (rnode->sysctl_num) {
2577 1.104.2.2 yamt case HW_USERMEM:
2578 1.104.2.2 yamt if ((ui = physmem - uvmexp.wired) > (UINT_MAX / PAGE_SIZE))
2579 1.104.2.2 yamt ui = UINT_MAX;
2580 1.104.2.2 yamt else
2581 1.104.2.2 yamt ui *= PAGE_SIZE;
2582 1.104.2.2 yamt node.sysctl_data = &ui;
2583 1.104.2.2 yamt break;
2584 1.104.2.2 yamt case HW_USERMEM64:
2585 1.104.2.2 yamt uq = (u_quad_t)(physmem - uvmexp.wired) * PAGE_SIZE;
2586 1.104.2.2 yamt node.sysctl_data = &uq;
2587 1.104.2.2 yamt break;
2588 1.104.2.2 yamt default:
2589 1.104.2.2 yamt return (EINVAL);
2590 1.104.2.2 yamt }
2591 1.104.2.2 yamt
2592 1.104.2.2 yamt return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2593 1.104.2.2 yamt }
2594 1.104.2.2 yamt
2595 1.104.2.2 yamt /*
2596 1.104.2.2 yamt * sysctl helper routine for kern.cnmagic node. pulls the old value
2597 1.104.2.2 yamt * out, encoded, and stuffs the new value in for decoding.
2598 1.104.2.2 yamt */
2599 1.104.2.2 yamt static int
2600 1.104.2.2 yamt sysctl_hw_cnmagic(SYSCTLFN_ARGS)
2601 1.104.2.2 yamt {
2602 1.104.2.2 yamt char magic[CNS_LEN];
2603 1.104.2.2 yamt int error;
2604 1.104.2.2 yamt struct sysctlnode node;
2605 1.104.2.2 yamt
2606 1.104.2.2 yamt if (oldp)
2607 1.104.2.2 yamt cn_get_magic(magic, CNS_LEN);
2608 1.104.2.2 yamt node = *rnode;
2609 1.104.2.2 yamt node.sysctl_data = &magic[0];
2610 1.104.2.2 yamt error = sysctl_lookup(SYSCTLFN_CALL(&node));
2611 1.104.2.2 yamt if (error || newp == NULL)
2612 1.104.2.2 yamt return (error);
2613 1.104.2.2 yamt
2614 1.104.2.2 yamt return (cn_set_magic(magic));
2615 1.104.2.2 yamt }
2616 1.104.2.2 yamt
2617 1.104.2.2 yamt static int
2618 1.104.2.2 yamt sysctl_hw_ncpu(SYSCTLFN_ARGS)
2619 1.104.2.2 yamt {
2620 1.104.2.2 yamt struct sysctlnode node;
2621 1.104.2.2 yamt
2622 1.104.2.2 yamt node = *rnode;
2623 1.104.2.2 yamt node.sysctl_data = &ncpu;
2624 1.104.2.2 yamt
2625 1.104.2.2 yamt return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2626 1.104.2.2 yamt }
2627 1.104.2.2 yamt
2628 1.104.2.2 yamt
2629 1.104.2.2 yamt /*
2630 1.104.2.2 yamt * ********************************************************************
2631 1.104.2.2 yamt * section 3: public helper routines that are used for more than one
2632 1.104.2.2 yamt * node
2633 1.104.2.2 yamt * ********************************************************************
2634 1.104.2.2 yamt */
2635 1.104.2.2 yamt
2636 1.104.2.2 yamt /*
2637 1.104.2.2 yamt * sysctl helper routine for the kern.root_device node and some ports'
2638 1.104.2.2 yamt * machdep.root_device nodes.
2639 1.104.2.2 yamt */
2640 1.104.2.2 yamt int
2641 1.104.2.2 yamt sysctl_root_device(SYSCTLFN_ARGS)
2642 1.104.2.2 yamt {
2643 1.104.2.2 yamt struct sysctlnode node;
2644 1.104.2.2 yamt
2645 1.104.2.2 yamt node = *rnode;
2646 1.104.2.2 yamt node.sysctl_data = root_device->dv_xname;
2647 1.104.2.2 yamt node.sysctl_size = strlen(root_device->dv_xname) + 1;
2648 1.104.2.2 yamt return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2649 1.104.2.2 yamt }
2650 1.104.2.2 yamt
2651 1.104.2.2 yamt /*
2652 1.104.2.2 yamt * sysctl helper routine for kern.consdev, dependent on the current
2653 1.104.2.2 yamt * state of the console. also used for machdep.console_device on some
2654 1.104.2.2 yamt * ports.
2655 1.104.2.2 yamt */
2656 1.104.2.2 yamt int
2657 1.104.2.2 yamt sysctl_consdev(SYSCTLFN_ARGS)
2658 1.104.2.2 yamt {
2659 1.104.2.2 yamt dev_t consdev;
2660 1.104.2.2 yamt struct sysctlnode node;
2661 1.104.2.2 yamt
2662 1.104.2.2 yamt if (cn_tab != NULL)
2663 1.104.2.2 yamt consdev = cn_tab->cn_dev;
2664 1.104.2.2 yamt else
2665 1.104.2.2 yamt consdev = NODEV;
2666 1.104.2.2 yamt node = *rnode;
2667 1.104.2.2 yamt node.sysctl_data = &consdev;
2668 1.104.2.2 yamt node.sysctl_size = sizeof(consdev);
2669 1.104.2.2 yamt return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2670 1.104.2.2 yamt }
2671 1.104.2.2 yamt
2672 1.104.2.2 yamt /*
2673 1.104.2.2 yamt * ********************************************************************
2674 1.104.2.2 yamt * section 4: support for some helpers
2675 1.104.2.2 yamt * ********************************************************************
2676 1.104.2.2 yamt */
2677 1.104.2.2 yamt
2678 1.104.2.2 yamt /*
2679 1.104.2.2 yamt * Fill in a kinfo_proc2 structure for the specified process.
2680 1.104.2.2 yamt */
2681 1.104.2.2 yamt static void
2682 1.104.2.2 yamt fill_kproc2(struct proc *p, struct kinfo_proc2 *ki)
2683 1.104.2.2 yamt {
2684 1.104.2.2 yamt struct tty *tp;
2685 1.104.2.2 yamt struct lwp *l, *l2;
2686 1.104.2.2 yamt struct timeval ut, st, rt;
2687 1.104.2.2 yamt sigset_t ss1, ss2;
2688 1.104.2.2 yamt
2689 1.104.2.2 yamt memset(ki, 0, sizeof(*ki));
2690 1.104.2.2 yamt
2691 1.104.2.2 yamt ki->p_paddr = PTRTOUINT64(p);
2692 1.104.2.2 yamt ki->p_fd = PTRTOUINT64(p->p_fd);
2693 1.104.2.2 yamt ki->p_cwdi = PTRTOUINT64(p->p_cwdi);
2694 1.104.2.2 yamt ki->p_stats = PTRTOUINT64(p->p_stats);
2695 1.104.2.2 yamt ki->p_limit = PTRTOUINT64(p->p_limit);
2696 1.104.2.2 yamt ki->p_vmspace = PTRTOUINT64(p->p_vmspace);
2697 1.104.2.2 yamt ki->p_sigacts = PTRTOUINT64(p->p_sigacts);
2698 1.104.2.2 yamt ki->p_sess = PTRTOUINT64(p->p_session);
2699 1.104.2.2 yamt ki->p_tsess = 0; /* may be changed if controlling tty below */
2700 1.104.2.2 yamt ki->p_ru = PTRTOUINT64(&p->p_stats->p_ru);
2701 1.104.2.2 yamt
2702 1.104.2.2 yamt ki->p_eflag = 0;
2703 1.104.2.2 yamt ki->p_exitsig = p->p_exitsig;
2704 1.104.2.2 yamt
2705 1.104.2.2 yamt ki->p_flag = sysctl_map_flags(sysctl_flagmap, p->p_flag);
2706 1.104.2.2 yamt ki->p_flag |= sysctl_map_flags(sysctl_sflagmap, p->p_sflag);
2707 1.104.2.2 yamt ki->p_flag |= sysctl_map_flags(sysctl_slflagmap, p->p_slflag);
2708 1.104.2.2 yamt ki->p_flag |= sysctl_map_flags(sysctl_lflagmap, p->p_lflag);
2709 1.104.2.2 yamt ki->p_flag |= sysctl_map_flags(sysctl_stflagmap, p->p_stflag);
2710 1.104.2.2 yamt
2711 1.104.2.2 yamt ki->p_pid = p->p_pid;
2712 1.104.2.2 yamt if (p->p_pptr)
2713 1.104.2.2 yamt ki->p_ppid = p->p_pptr->p_pid;
2714 1.104.2.2 yamt else
2715 1.104.2.2 yamt ki->p_ppid = 0;
2716 1.104.2.2 yamt ki->p_sid = p->p_session->s_sid;
2717 1.104.2.2 yamt ki->p__pgid = p->p_pgrp->pg_id;
2718 1.104.2.2 yamt
2719 1.104.2.2 yamt ki->p_tpgid = NO_PGID; /* may be changed if controlling tty below */
2720 1.104.2.2 yamt
2721 1.104.2.2 yamt ki->p_uid = kauth_cred_geteuid(p->p_cred);
2722 1.104.2.2 yamt ki->p_ruid = kauth_cred_getuid(p->p_cred);
2723 1.104.2.2 yamt ki->p_gid = kauth_cred_getegid(p->p_cred);
2724 1.104.2.2 yamt ki->p_rgid = kauth_cred_getgid(p->p_cred);
2725 1.104.2.2 yamt ki->p_svuid = kauth_cred_getsvuid(p->p_cred);
2726 1.104.2.2 yamt ki->p_svgid = kauth_cred_getsvgid(p->p_cred);
2727 1.104.2.2 yamt
2728 1.104.2.2 yamt ki->p_ngroups = kauth_cred_ngroups(p->p_cred);
2729 1.104.2.2 yamt kauth_cred_getgroups(p->p_cred, ki->p_groups,
2730 1.104.2.2 yamt min(ki->p_ngroups, sizeof(ki->p_groups) / sizeof(ki->p_groups[0])),
2731 1.104.2.2 yamt UIO_SYSSPACE);
2732 1.104.2.2 yamt
2733 1.104.2.2 yamt ki->p_jobc = p->p_pgrp->pg_jobc;
2734 1.104.2.2 yamt if ((p->p_lflag & PL_CONTROLT) && (tp = p->p_session->s_ttyp)) {
2735 1.104.2.2 yamt ki->p_tdev = tp->t_dev;
2736 1.104.2.2 yamt ki->p_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
2737 1.104.2.2 yamt ki->p_tsess = PTRTOUINT64(tp->t_session);
2738 1.104.2.2 yamt } else {
2739 1.104.2.2 yamt ki->p_tdev = NODEV;
2740 1.104.2.2 yamt }
2741 1.104.2.2 yamt
2742 1.104.2.2 yamt ki->p_estcpu = p->p_estcpu;
2743 1.104.2.2 yamt
2744 1.104.2.2 yamt mutex_enter(&p->p_smutex);
2745 1.104.2.2 yamt
2746 1.104.2.2 yamt ki->p_uticks = p->p_uticks;
2747 1.104.2.2 yamt ki->p_sticks = p->p_sticks;
2748 1.104.2.2 yamt ki->p_iticks = p->p_iticks;
2749 1.104.2.2 yamt
2750 1.104.2.2 yamt ki->p_tracep = PTRTOUINT64(p->p_tracep);
2751 1.104.2.2 yamt ki->p_traceflag = p->p_traceflag;
2752 1.104.2.2 yamt
2753 1.104.2.2 yamt memcpy(&ki->p_sigignore, &p->p_sigctx.ps_sigignore,sizeof(ki_sigset_t));
2754 1.104.2.2 yamt memcpy(&ki->p_sigcatch, &p->p_sigctx.ps_sigcatch, sizeof(ki_sigset_t));
2755 1.104.2.2 yamt
2756 1.104.2.2 yamt ki->p_cpticks = 0;
2757 1.104.2.2 yamt ki->p_pctcpu = p->p_pctcpu;
2758 1.104.2.2 yamt ss1 = p->p_sigpend.sp_set;
2759 1.104.2.2 yamt LIST_FOREACH(l, &p->p_lwps, l_sibling) {
2760 1.104.2.2 yamt /* This is hardly correct, but... */
2761 1.104.2.2 yamt sigplusset(&l->l_sigpend.sp_set, &ss1);
2762 1.104.2.2 yamt sigplusset(&l->l_sigmask, &ss2);
2763 1.104.2.2 yamt ki->p_cpticks += l->l_cpticks;
2764 1.104.2.2 yamt ki->p_pctcpu += l->l_pctcpu;
2765 1.104.2.2 yamt }
2766 1.104.2.2 yamt memcpy(&ki->p_siglist, &ss1, sizeof(ki_sigset_t));
2767 1.104.2.2 yamt memcpy(&ki->p_sigmask, &ss2, sizeof(ki_sigset_t));
2768 1.104.2.2 yamt
2769 1.104.2.2 yamt ki->p_stat = p->p_stat; /* Will likely be overridden by LWP status */
2770 1.104.2.2 yamt ki->p_realstat = p->p_stat;
2771 1.104.2.2 yamt ki->p_nice = p->p_nice;
2772 1.104.2.2 yamt
2773 1.104.2.2 yamt ki->p_xstat = p->p_xstat;
2774 1.104.2.2 yamt ki->p_acflag = p->p_acflag;
2775 1.104.2.2 yamt
2776 1.104.2.2 yamt strncpy(ki->p_comm, p->p_comm,
2777 1.104.2.2 yamt min(sizeof(ki->p_comm), sizeof(p->p_comm)));
2778 1.104.2.2 yamt
2779 1.104.2.2 yamt strncpy(ki->p_login, p->p_session->s_login,
2780 1.104.2.2 yamt min(sizeof ki->p_login - 1, sizeof p->p_session->s_login));
2781 1.104.2.2 yamt
2782 1.104.2.2 yamt ki->p_nlwps = p->p_nlwps;
2783 1.104.2.2 yamt ki->p_realflag = ki->p_flag;
2784 1.104.2.2 yamt
2785 1.104.2.2 yamt if (p->p_stat == SIDL || P_ZOMBIE(p)) {
2786 1.104.2.2 yamt ki->p_vm_rssize = 0;
2787 1.104.2.2 yamt ki->p_vm_tsize = 0;
2788 1.104.2.2 yamt ki->p_vm_dsize = 0;
2789 1.104.2.2 yamt ki->p_vm_ssize = 0;
2790 1.104.2.2 yamt ki->p_nrlwps = 0;
2791 1.104.2.2 yamt l = NULL;
2792 1.104.2.2 yamt } else {
2793 1.104.2.2 yamt struct vmspace *vm = p->p_vmspace;
2794 1.104.2.2 yamt int tmp;
2795 1.104.2.2 yamt
2796 1.104.2.2 yamt ki->p_vm_rssize = vm_resident_count(vm);
2797 1.104.2.2 yamt ki->p_vm_tsize = vm->vm_tsize;
2798 1.104.2.2 yamt ki->p_vm_dsize = vm->vm_dsize;
2799 1.104.2.2 yamt ki->p_vm_ssize = vm->vm_ssize;
2800 1.104.2.2 yamt
2801 1.104.2.2 yamt /* Pick a "representative" LWP */
2802 1.104.2.2 yamt l = proc_representative_lwp(p, &tmp, 1);
2803 1.104.2.2 yamt lwp_lock(l);
2804 1.104.2.2 yamt ki->p_nrlwps = tmp;
2805 1.104.2.2 yamt ki->p_forw = 0;
2806 1.104.2.2 yamt ki->p_back = 0;
2807 1.104.2.2 yamt ki->p_addr = PTRTOUINT64(l->l_addr);
2808 1.104.2.2 yamt ki->p_stat = l->l_stat;
2809 1.104.2.2 yamt ki->p_flag |= sysctl_map_flags(sysctl_lwpflagmap, l->l_flag);
2810 1.104.2.2 yamt ki->p_swtime = l->l_swtime;
2811 1.104.2.2 yamt ki->p_slptime = l->l_slptime;
2812 1.104.2.2 yamt if (l->l_stat == LSONPROC)
2813 1.104.2.2 yamt ki->p_schedflags = l->l_cpu->ci_schedstate.spc_flags;
2814 1.104.2.2 yamt else
2815 1.104.2.2 yamt ki->p_schedflags = 0;
2816 1.104.2.2 yamt ki->p_holdcnt = l->l_holdcnt;
2817 1.104.2.2 yamt ki->p_priority = l->l_priority;
2818 1.104.2.2 yamt ki->p_usrpri = l->l_usrpri;
2819 1.104.2.2 yamt if (l->l_wmesg)
2820 1.104.2.2 yamt strncpy(ki->p_wmesg, l->l_wmesg, sizeof(ki->p_wmesg));
2821 1.104.2.2 yamt ki->p_wchan = PTRTOUINT64(l->l_wchan);
2822 1.104.2.2 yamt lwp_unlock(l);
2823 1.104.2.2 yamt }
2824 1.104.2.2 yamt if (p->p_session->s_ttyvp)
2825 1.104.2.2 yamt ki->p_eflag |= EPROC_CTTY;
2826 1.104.2.2 yamt if (SESS_LEADER(p))
2827 1.104.2.2 yamt ki->p_eflag |= EPROC_SLEADER;
2828 1.104.2.2 yamt
2829 1.104.2.2 yamt /* XXX Is this double check necessary? */
2830 1.104.2.2 yamt if (P_ZOMBIE(p)) {
2831 1.104.2.2 yamt ki->p_uvalid = 0;
2832 1.104.2.2 yamt ki->p_rtime_sec = 0;
2833 1.104.2.2 yamt ki->p_rtime_usec = 0;
2834 1.104.2.2 yamt } else {
2835 1.104.2.2 yamt ki->p_uvalid = 1;
2836 1.104.2.2 yamt
2837 1.104.2.2 yamt ki->p_ustart_sec = p->p_stats->p_start.tv_sec;
2838 1.104.2.2 yamt ki->p_ustart_usec = p->p_stats->p_start.tv_usec;
2839 1.104.2.2 yamt
2840 1.104.2.2 yamt calcru(p, &ut, &st, NULL, &rt);
2841 1.104.2.2 yamt ki->p_rtime_sec = rt.tv_sec;
2842 1.104.2.2 yamt ki->p_rtime_usec = rt.tv_usec;
2843 1.104.2.2 yamt ki->p_uutime_sec = ut.tv_sec;
2844 1.104.2.2 yamt ki->p_uutime_usec = ut.tv_usec;
2845 1.104.2.2 yamt ki->p_ustime_sec = st.tv_sec;
2846 1.104.2.2 yamt ki->p_ustime_usec = st.tv_usec;
2847 1.104.2.2 yamt
2848 1.104.2.2 yamt ki->p_uru_maxrss = p->p_stats->p_ru.ru_maxrss;
2849 1.104.2.2 yamt ki->p_uru_ixrss = p->p_stats->p_ru.ru_ixrss;
2850 1.104.2.2 yamt ki->p_uru_idrss = p->p_stats->p_ru.ru_idrss;
2851 1.104.2.2 yamt ki->p_uru_isrss = p->p_stats->p_ru.ru_isrss;
2852 1.104.2.2 yamt ki->p_uru_minflt = p->p_stats->p_ru.ru_minflt;
2853 1.104.2.2 yamt ki->p_uru_majflt = p->p_stats->p_ru.ru_majflt;
2854 1.104.2.2 yamt ki->p_uru_nswap = p->p_stats->p_ru.ru_nswap;
2855 1.104.2.2 yamt ki->p_uru_inblock = p->p_stats->p_ru.ru_inblock;
2856 1.104.2.2 yamt ki->p_uru_oublock = p->p_stats->p_ru.ru_oublock;
2857 1.104.2.2 yamt ki->p_uru_msgsnd = p->p_stats->p_ru.ru_msgsnd;
2858 1.104.2.2 yamt ki->p_uru_msgrcv = p->p_stats->p_ru.ru_msgrcv;
2859 1.104.2.2 yamt ki->p_uru_nsignals = p->p_stats->p_ru.ru_nsignals;
2860 1.104.2.2 yamt
2861 1.104.2.2 yamt ki->p_uru_nvcsw = 0;
2862 1.104.2.2 yamt ki->p_uru_nivcsw = 0;
2863 1.104.2.2 yamt LIST_FOREACH(l2, &p->p_lwps, l_sibling) {
2864 1.104.2.2 yamt ki->p_uru_nvcsw += (l->l_ncsw - l->l_nivcsw);
2865 1.104.2.2 yamt ki->p_uru_nivcsw += l->l_nivcsw;
2866 1.104.2.2 yamt }
2867 1.104.2.2 yamt
2868 1.104.2.2 yamt timeradd(&p->p_stats->p_cru.ru_utime,
2869 1.104.2.2 yamt &p->p_stats->p_cru.ru_stime, &ut);
2870 1.104.2.2 yamt ki->p_uctime_sec = ut.tv_sec;
2871 1.104.2.2 yamt ki->p_uctime_usec = ut.tv_usec;
2872 1.104.2.2 yamt }
2873 1.104.2.2 yamt #ifdef MULTIPROCESSOR
2874 1.104.2.2 yamt if (l != NULL)
2875 1.104.2.2 yamt ki->p_cpuid = l->l_cpu->ci_cpuid;
2876 1.104.2.2 yamt else
2877 1.104.2.2 yamt #endif
2878 1.104.2.2 yamt ki->p_cpuid = KI_NOCPU;
2879 1.104.2.2 yamt
2880 1.104.2.2 yamt mutex_exit(&p->p_smutex);
2881 1.104.2.2 yamt }
2882 1.104.2.2 yamt
2883 1.104.2.2 yamt /*
2884 1.104.2.2 yamt * Fill in a kinfo_lwp structure for the specified lwp.
2885 1.104.2.2 yamt */
2886 1.104.2.2 yamt static void
2887 1.104.2.2 yamt fill_lwp(struct lwp *l, struct kinfo_lwp *kl)
2888 1.104.2.2 yamt {
2889 1.104.2.2 yamt struct proc *p = l->l_proc;
2890 1.104.2.2 yamt
2891 1.104.2.2 yamt kl->l_forw = 0;
2892 1.104.2.2 yamt kl->l_back = 0;
2893 1.104.2.2 yamt kl->l_laddr = PTRTOUINT64(l);
2894 1.104.2.2 yamt kl->l_addr = PTRTOUINT64(l->l_addr);
2895 1.104.2.2 yamt kl->l_stat = l->l_stat;
2896 1.104.2.2 yamt kl->l_lid = l->l_lid;
2897 1.104.2.2 yamt kl->l_flag = sysctl_map_flags(sysctl_lwpprflagmap, l->l_prflag);
2898 1.104.2.2 yamt
2899 1.104.2.2 yamt kl->l_swtime = l->l_swtime;
2900 1.104.2.2 yamt kl->l_slptime = l->l_slptime;
2901 1.104.2.2 yamt if (l->l_stat == LSONPROC)
2902 1.104.2.2 yamt kl->l_schedflags = l->l_cpu->ci_schedstate.spc_flags;
2903 1.104.2.2 yamt else
2904 1.104.2.2 yamt kl->l_schedflags = 0;
2905 1.104.2.2 yamt kl->l_holdcnt = l->l_holdcnt;
2906 1.104.2.2 yamt kl->l_priority = l->l_priority;
2907 1.104.2.2 yamt kl->l_usrpri = l->l_usrpri;
2908 1.104.2.2 yamt if (l->l_wmesg)
2909 1.104.2.2 yamt strncpy(kl->l_wmesg, l->l_wmesg, sizeof(kl->l_wmesg));
2910 1.104.2.2 yamt kl->l_wchan = PTRTOUINT64(l->l_wchan);
2911 1.104.2.2 yamt #ifdef MULTIPROCESSOR
2912 1.104.2.2 yamt kl->l_cpuid = l->l_cpu->ci_cpuid;
2913 1.104.2.2 yamt #else
2914 1.104.2.2 yamt kl->l_cpuid = KI_NOCPU;
2915 1.104.2.2 yamt #endif
2916 1.104.2.2 yamt kl->l_rtime_sec = l->l_rtime.tv_sec;
2917 1.104.2.2 yamt kl->l_rtime_usec = l->l_rtime.tv_usec;
2918 1.104.2.2 yamt kl->l_cpticks = l->l_cpticks;
2919 1.104.2.2 yamt kl->l_pctcpu = l->l_pctcpu;
2920 1.104.2.2 yamt kl->l_pid = p->p_pid;
2921 1.104.2.2 yamt if (l->l_name == NULL)
2922 1.104.2.2 yamt kl->l_name[0] = '\0';
2923 1.104.2.2 yamt else
2924 1.104.2.2 yamt strlcpy(kl->l_name, l->l_name, sizeof(kl->l_name));
2925 1.104.2.2 yamt }
2926 1.104.2.2 yamt
2927 1.104.2.2 yamt /*
2928 1.104.2.2 yamt * Fill in an eproc structure for the specified process.
2929 1.104.2.2 yamt */
2930 1.104.2.2 yamt void
2931 1.104.2.2 yamt fill_eproc(struct proc *p, struct eproc *ep)
2932 1.104.2.2 yamt {
2933 1.104.2.2 yamt struct tty *tp;
2934 1.104.2.2 yamt struct lwp *l;
2935 1.104.2.2 yamt
2936 1.104.2.2 yamt ep->e_paddr = p;
2937 1.104.2.2 yamt ep->e_sess = p->p_session;
2938 1.104.2.2 yamt kauth_cred_topcred(p->p_cred, &ep->e_pcred);
2939 1.104.2.2 yamt kauth_cred_toucred(p->p_cred, &ep->e_ucred);
2940 1.104.2.2 yamt if (p->p_stat == SIDL || P_ZOMBIE(p)) {
2941 1.104.2.2 yamt ep->e_vm.vm_rssize = 0;
2942 1.104.2.2 yamt ep->e_vm.vm_tsize = 0;
2943 1.104.2.2 yamt ep->e_vm.vm_dsize = 0;
2944 1.104.2.2 yamt ep->e_vm.vm_ssize = 0;
2945 1.104.2.2 yamt /* ep->e_vm.vm_pmap = XXX; */
2946 1.104.2.2 yamt } else {
2947 1.104.2.2 yamt struct vmspace *vm = p->p_vmspace;
2948 1.104.2.2 yamt
2949 1.104.2.2 yamt ep->e_vm.vm_rssize = vm_resident_count(vm);
2950 1.104.2.2 yamt ep->e_vm.vm_tsize = vm->vm_tsize;
2951 1.104.2.2 yamt ep->e_vm.vm_dsize = vm->vm_dsize;
2952 1.104.2.2 yamt ep->e_vm.vm_ssize = vm->vm_ssize;
2953 1.104.2.2 yamt
2954 1.104.2.2 yamt /* Pick a "representative" LWP */
2955 1.104.2.2 yamt mutex_enter(&p->p_smutex);
2956 1.104.2.2 yamt l = proc_representative_lwp(p, NULL, 1);
2957 1.104.2.2 yamt lwp_lock(l);
2958 1.104.2.2 yamt if (l->l_wmesg)
2959 1.104.2.2 yamt strncpy(ep->e_wmesg, l->l_wmesg, WMESGLEN);
2960 1.104.2.2 yamt lwp_unlock(l);
2961 1.104.2.2 yamt mutex_exit(&p->p_smutex);
2962 1.104.2.2 yamt }
2963 1.104.2.2 yamt if (p->p_pptr)
2964 1.104.2.2 yamt ep->e_ppid = p->p_pptr->p_pid;
2965 1.104.2.2 yamt else
2966 1.104.2.2 yamt ep->e_ppid = 0;
2967 1.104.2.2 yamt ep->e_pgid = p->p_pgrp->pg_id;
2968 1.104.2.2 yamt ep->e_sid = ep->e_sess->s_sid;
2969 1.104.2.2 yamt ep->e_jobc = p->p_pgrp->pg_jobc;
2970 1.104.2.2 yamt if ((p->p_lflag & PL_CONTROLT) &&
2971 1.104.2.2 yamt (tp = ep->e_sess->s_ttyp)) {
2972 1.104.2.2 yamt ep->e_tdev = tp->t_dev;
2973 1.104.2.2 yamt ep->e_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
2974 1.104.2.2 yamt ep->e_tsess = tp->t_session;
2975 1.104.2.2 yamt } else
2976 1.104.2.2 yamt ep->e_tdev = NODEV;
2977 1.104.2.2 yamt
2978 1.104.2.2 yamt ep->e_xsize = ep->e_xrssize = 0;
2979 1.104.2.2 yamt ep->e_xccount = ep->e_xswrss = 0;
2980 1.104.2.2 yamt ep->e_flag = ep->e_sess->s_ttyvp ? EPROC_CTTY : 0;
2981 1.104.2.2 yamt if (SESS_LEADER(p))
2982 1.104.2.2 yamt ep->e_flag |= EPROC_SLEADER;
2983 1.104.2.2 yamt strncpy(ep->e_login, ep->e_sess->s_login, MAXLOGNAME);
2984 1.104.2.2 yamt }
2985 1.104.2.2 yamt
2986 1.104.2.2 yamt u_int
2987 1.104.2.2 yamt sysctl_map_flags(const u_int *map, u_int word)
2988 1.104.2.2 yamt {
2989 1.104.2.2 yamt u_int rv;
2990 1.104.2.2 yamt
2991 1.104.2.2 yamt for (rv = 0; *map != 0; map += 2)
2992 1.104.2.2 yamt if ((word & map[0]) != 0)
2993 1.104.2.2 yamt rv |= map[1];
2994 1.104.2.2 yamt
2995 1.104.2.2 yamt return rv;
2996 1.104.2.2 yamt }
2997