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