source: rtems/cpukit/libnetworking/kern/kern_mib.c @ 51cb676

4.104.114.84.95
Last change on this file since 51cb676 was 51cb676, checked in by Ralf Corsepius <ralf.corsepius@…>, on 05/01/05 at 04:00:43

Update from FreeBSD

  • Property mode set to 100644
File size: 12.7 KB
Line 
1/*-
2 * Copyright (c) 1982, 1986, 1989, 1993
3 *      The Regents of the University of California.  All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Mike Karels at Berkeley Software Design, Inc.
7 *
8 * Quite extensively rewritten by Poul-Henning Kamp of the FreeBSD
9 * project, to make these variables more userfriendly.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 * 4. Neither the name of the University nor the names of its contributors
20 *    may be used to endorse or promote products derived from this software
21 *    without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 *      @(#)kern_sysctl.c       8.4 (Berkeley) 4/14/94
36 * $FreeBSD: src/sys/kern/kern_mib.c,v 1.74 2005/02/28 21:42:56 wes Exp $
37 */
38
39/*
40 * $Id$
41 */
42
43#ifndef __rtems__
44#include "opt_posix.h"
45#endif
46
47#include <sys/param.h>
48#include <sys/kernel.h>
49#include <sys/systm.h>
50#include <sys/sysctl.h>
51#include <sys/proc.h>
52#ifndef __rtems__
53#include <sys/lock.h>
54#include <sys/mutex.h>
55#include <sys/jail.h>
56#include <sys/smp.h>
57#endif
58#include <sys/unistd.h>
59
60#ifdef __rtems__
61char machine[] = "SET ME";
62char osrelease[] = RTEMS_VERSION;
63char ostype[] = "RTEMS";
64#endif
65
66SYSCTL_NODE(, 0,          sysctl, CTLFLAG_RW, 0,
67        "Sysctl internal magic");
68SYSCTL_NODE(, CTL_KERN,   kern,   CTLFLAG_RW, 0,
69        "High kernel, proc, limits &c");
70#ifndef __rtems__
71SYSCTL_NODE(, CTL_VM,     vm,     CTLFLAG_RW, 0,
72        "Virtual memory");
73SYSCTL_NODE(, CTL_VFS,    vfs,     CTLFLAG_RW, 0,
74        "File system");
75#endif
76SYSCTL_NODE(, CTL_NET,    net,    CTLFLAG_RW, 0,
77        "Network, (see socket.h)");
78#ifndef __rtems__
79SYSCTL_NODE(, CTL_DEBUG,  debug,  CTLFLAG_RW, 0,
80        "Debugging");
81SYSCTL_NODE(_debug, OID_AUTO,  sizeof,  CTLFLAG_RW, 0,
82        "Sizeof various things");
83SYSCTL_NODE(, CTL_HW,     hw,     CTLFLAG_RW, 0,
84        "hardware");
85SYSCTL_NODE(, CTL_MACHDEP, machdep, CTLFLAG_RW, 0,
86        "machine dependent");
87SYSCTL_NODE(, CTL_USER,   user,   CTLFLAG_RW, 0,
88        "user-level");
89SYSCTL_NODE(, CTL_P1003_1B,  p1003_1b,   CTLFLAG_RW, 0,
90        "p1003_1b, (see p1003_1b.h)");
91
92SYSCTL_NODE(, OID_AUTO,  compat, CTLFLAG_RW, 0,
93        "Compatibility code");
94SYSCTL_NODE(, OID_AUTO, security, CTLFLAG_RW, 0,
95        "Security");
96#ifdef REGRESSION
97SYSCTL_NODE(, OID_AUTO, regression, CTLFLAG_RW, 0,
98     "Regression test MIB");
99#endif
100
101SYSCTL_STRING(_kern, OID_AUTO, ident, CTLFLAG_RD,
102    kern_ident, 0, "Kernel identifier");
103#endif /* __rtems__ */
104
105SYSCTL_STRING(_kern, KERN_OSRELEASE, osrelease, CTLFLAG_RD,
106    osrelease, 0, "Operating system release");
107
108SYSCTL_INT(_kern, KERN_OSREV, osrevision, CTLFLAG_RD,
109    0, BSD, "Operating system revision");
110
111#ifndef __rtems__
112SYSCTL_STRING(_kern, KERN_VERSION, version, CTLFLAG_RD,
113    version, 0, "Kernel version");
114#endif
115
116SYSCTL_STRING(_kern, KERN_OSTYPE, ostype, CTLFLAG_RD,
117    ostype, 0, "Operating system type");
118
119#ifndef __rtems__
120extern int osreldate;
121SYSCTL_INT(_kern, KERN_OSRELDATE, osreldate, CTLFLAG_RD,
122    &osreldate, 0, "Operating system release date");
123
124SYSCTL_INT(_kern, KERN_MAXPROC, maxproc, CTLFLAG_RD,
125    &maxproc, 0, "Maximum number of processes");
126
127SYSCTL_INT(_kern, KERN_MAXPROCPERUID, maxprocperuid, CTLFLAG_RW,
128    &maxprocperuid, 0, "Maximum processes allowed per userid");
129
130SYSCTL_INT(_kern, OID_AUTO, maxusers, CTLFLAG_RD,
131    &maxusers, 0, "Hint for kernel tuning");
132
133SYSCTL_INT(_kern, KERN_ARGMAX, argmax, CTLFLAG_RD,
134    0, ARG_MAX, "Maximum bytes of argument to execve(2)");
135
136SYSCTL_INT(_kern, KERN_POSIX1, posix1version, CTLFLAG_RD,
137    0, _POSIX_VERSION, "Version of POSIX attempting to comply to");
138
139SYSCTL_INT(_kern, KERN_NGROUPS, ngroups, CTLFLAG_RD,
140    0, NGROUPS_MAX, "Maximum number of groups a user can belong to");
141
142SYSCTL_INT(_kern, KERN_JOB_CONTROL, job_control, CTLFLAG_RD,
143    0, 1, "Whether job control is available");
144
145#ifdef _POSIX_SAVED_IDS
146SYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD,
147    0, 1, "Whether saved set-group/user ID is available");
148#else
149SYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD,
150    0, 0, "Whether saved set-group/user ID is available");
151#endif
152
153char kernelname[MAXPATHLEN] = "/kernel";        /* XXX bloat */
154
155SYSCTL_STRING(_kern, KERN_BOOTFILE, bootfile, CTLFLAG_RW,
156    kernelname, sizeof kernelname, "Name of kernel file booted");
157
158#ifdef SMP
159SYSCTL_INT(_hw, HW_NCPU, ncpu, CTLFLAG_RD,
160    &mp_ncpus, 0, "Number of active CPUs");
161#else
162SYSCTL_INT(_hw, HW_NCPU, ncpu, CTLFLAG_RD,
163    0, 1, "Number of active CPUs");
164#endif
165
166SYSCTL_INT(_hw, HW_BYTEORDER, byteorder, CTLFLAG_RD,
167    0, BYTE_ORDER, "System byte order");
168
169SYSCTL_INT(_hw, HW_PAGESIZE, pagesize, CTLFLAG_RD,
170    0, PAGE_SIZE, "System memory page size");
171
172static int
173sysctl_hw_physmem(SYSCTL_HANDLER_ARGS)
174{
175        u_long val;
176
177        val = ctob(physmem);
178        return (sysctl_handle_long(oidp, &val, 0, req));
179}
180
181SYSCTL_PROC(_hw, HW_PHYSMEM, physmem, CTLTYPE_ULONG | CTLFLAG_RD,
182        0, 0, sysctl_hw_physmem, "LU", "");
183
184static int
185sysctl_hw_usermem(SYSCTL_HANDLER_ARGS)
186{
187        u_long val;
188
189        val = ctob(physmem - cnt.v_wire_count);
190        return (sysctl_handle_long(oidp, &val, 0, req));
191}
192
193SYSCTL_PROC(_hw, HW_USERMEM, usermem, CTLTYPE_ULONG | CTLFLAG_RD,
194        0, 0, sysctl_hw_usermem, "LU", "");
195
196SYSCTL_ULONG(_hw, OID_AUTO, availpages, CTLFLAG_RD, &physmem, 0, "");
197
198static char     machine_arch[] = MACHINE_ARCH;
199SYSCTL_STRING(_hw, HW_MACHINE_ARCH, machine_arch, CTLFLAG_RD,
200    machine_arch, 0, "System architecture");
201
202char hostname[MAXHOSTNAMELEN];
203
204static int
205sysctl_hostname(SYSCTL_HANDLER_ARGS)
206{
207        struct prison *pr;
208        char tmphostname[MAXHOSTNAMELEN];
209        int error;
210
211        pr = req->td->td_ucred->cr_prison;
212        if (pr != NULL) {
213                if (!jail_set_hostname_allowed && req->newptr)
214                        return (EPERM);
215                /*
216                 * Process is in jail, so make a local copy of jail
217                 * hostname to get/set so we don't have to hold the jail
218                 * mutex during the sysctl copyin/copyout activities.
219                 */
220                mtx_lock(&pr->pr_mtx);
221                bcopy(pr->pr_host, tmphostname, MAXHOSTNAMELEN);
222                mtx_unlock(&pr->pr_mtx);
223
224                error = sysctl_handle_string(oidp, tmphostname,
225                    sizeof pr->pr_host, req);
226
227                if (req->newptr != NULL && error == 0) {
228                        /*
229                         * Copy the locally set hostname to the jail, if
230                         * appropriate.
231                         */
232                        mtx_lock(&pr->pr_mtx);
233                        bcopy(tmphostname, pr->pr_host, MAXHOSTNAMELEN);
234                        mtx_unlock(&pr->pr_mtx);
235                }
236        } else
237                error = sysctl_handle_string(oidp,
238                    hostname, sizeof hostname, req);
239        return (error);
240}
241
242SYSCTL_PROC(_kern, KERN_HOSTNAME, hostname,
243       CTLTYPE_STRING|CTLFLAG_RW|CTLFLAG_PRISON,
244       0, 0, sysctl_hostname, "A", "Hostname");
245
246static int      regression_securelevel_nonmonotonic = 0;
247
248#ifdef REGRESSION
249SYSCTL_INT(_regression, OID_AUTO, securelevel_nonmonotonic, CTLFLAG_RW,
250    &regression_securelevel_nonmonotonic, 0, "securelevel may be lowered");
251#endif
252
253int securelevel = -1;
254struct mtx securelevel_mtx;
255
256MTX_SYSINIT(securelevel_lock, &securelevel_mtx, "securelevel mutex lock",
257    MTX_DEF);
258
259static int
260sysctl_kern_securelvl(SYSCTL_HANDLER_ARGS)
261{
262        struct prison *pr;
263        int error, level;
264
265        pr = req->td->td_ucred->cr_prison;
266
267        /*
268         * If the process is in jail, return the maximum of the global and
269         * local levels; otherwise, return the global level.
270         */
271        if (pr != NULL) {
272                mtx_lock(&pr->pr_mtx);
273                level = imax(securelevel, pr->pr_securelevel);
274                mtx_unlock(&pr->pr_mtx);
275        } else
276                level = securelevel;
277        error = sysctl_handle_int(oidp, &level, 0, req);
278        if (error || !req->newptr)
279                return (error);
280        /*
281         * Permit update only if the new securelevel exceeds the
282         * global level, and local level if any.
283         */
284        if (pr != NULL) {
285                mtx_lock(&pr->pr_mtx);
286                if (!regression_securelevel_nonmonotonic &&
287                    (level < imax(securelevel, pr->pr_securelevel))) {
288                        mtx_unlock(&pr->pr_mtx);
289                        return (EPERM);
290                }
291                pr->pr_securelevel = level;
292                mtx_unlock(&pr->pr_mtx);
293        } else {
294                mtx_lock(&securelevel_mtx);
295                if (!regression_securelevel_nonmonotonic &&
296                    (level < securelevel)) {
297                        mtx_unlock(&securelevel_mtx);
298                        return (EPERM);
299                }
300                securelevel = level;
301                mtx_unlock(&securelevel_mtx);
302        }
303        return (error);
304}
305
306SYSCTL_PROC(_kern, KERN_SECURELVL, securelevel,
307    CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_PRISON, 0, 0, sysctl_kern_securelvl,
308    "I", "Current secure level");
309
310char domainname[MAXHOSTNAMELEN];
311SYSCTL_STRING(_kern, KERN_NISDOMAINNAME, domainname, CTLFLAG_RW,
312    &domainname, sizeof(domainname), "Name of the current YP/NIS domain");
313
314u_long hostid;
315SYSCTL_ULONG(_kern, KERN_HOSTID, hostid, CTLFLAG_RW, &hostid, 0, "Host ID");
316
317/*
318 * This is really cheating.  These actually live in the libc, something
319 * which I'm not quite sure is a good idea anyway, but in order for
320 * getnext and friends to actually work, we define dummies here.
321 */
322SYSCTL_STRING(_user, USER_CS_PATH, cs_path, CTLFLAG_RD,
323    "", 0, "PATH that finds all the standard utilities");
324SYSCTL_INT(_user, USER_BC_BASE_MAX, bc_base_max, CTLFLAG_RD,
325    0, 0, "Max ibase/obase values in bc(1)");
326SYSCTL_INT(_user, USER_BC_DIM_MAX, bc_dim_max, CTLFLAG_RD,
327    0, 0, "Max array size in bc(1)");
328SYSCTL_INT(_user, USER_BC_SCALE_MAX, bc_scale_max, CTLFLAG_RD,
329    0, 0, "Max scale value in bc(1)");
330SYSCTL_INT(_user, USER_BC_STRING_MAX, bc_string_max, CTLFLAG_RD,
331    0, 0, "Max string length in bc(1)");
332SYSCTL_INT(_user, USER_COLL_WEIGHTS_MAX, coll_weights_max, CTLFLAG_RD,
333    0, 0, "Maximum number of weights assigned to an LC_COLLATE locale entry");
334SYSCTL_INT(_user, USER_EXPR_NEST_MAX, expr_nest_max, CTLFLAG_RD, 0, 0, "");
335SYSCTL_INT(_user, USER_LINE_MAX, line_max, CTLFLAG_RD,
336    0, 0, "Max length (bytes) of a text-processing utility's input line");
337SYSCTL_INT(_user, USER_RE_DUP_MAX, re_dup_max, CTLFLAG_RD,
338    0, 0, "Maximum number of repeats of a regexp permitted");
339SYSCTL_INT(_user, USER_POSIX2_VERSION, posix2_version, CTLFLAG_RD,
340    0, 0,
341    "The version of POSIX 1003.2 with which the system attempts to comply");
342SYSCTL_INT(_user, USER_POSIX2_C_BIND, posix2_c_bind, CTLFLAG_RD,
343    0, 0, "Whether C development supports the C bindings option");
344SYSCTL_INT(_user, USER_POSIX2_C_DEV, posix2_c_dev, CTLFLAG_RD,
345    0, 0, "Whether system supports the C development utilities option");
346SYSCTL_INT(_user, USER_POSIX2_CHAR_TERM, posix2_char_term, CTLFLAG_RD,
347    0, 0, "");
348SYSCTL_INT(_user, USER_POSIX2_FORT_DEV, posix2_fort_dev, CTLFLAG_RD,
349    0, 0, "Whether system supports FORTRAN development utilities");
350SYSCTL_INT(_user, USER_POSIX2_FORT_RUN, posix2_fort_run, CTLFLAG_RD,
351    0, 0, "Whether system supports FORTRAN runtime utilities");
352SYSCTL_INT(_user, USER_POSIX2_LOCALEDEF, posix2_localedef, CTLFLAG_RD,
353    0, 0, "Whether system supports creation of locales");
354SYSCTL_INT(_user, USER_POSIX2_SW_DEV, posix2_sw_dev, CTLFLAG_RD,
355    0, 0, "Whether system supports software development utilities");
356SYSCTL_INT(_user, USER_POSIX2_UPE, posix2_upe, CTLFLAG_RD,
357    0, 0, "Whether system supports the user portability utilities");
358SYSCTL_INT(_user, USER_STREAM_MAX, stream_max, CTLFLAG_RD,
359    0, 0, "Min Maximum number of streams a process may have open at one time");
360SYSCTL_INT(_user, USER_TZNAME_MAX, tzname_max, CTLFLAG_RD,
361    0, 0, "Min Maximum number of types supported for timezone names");
362
363#include <sys/vnode.h>
364SYSCTL_INT(_debug_sizeof, OID_AUTO, vnode, CTLFLAG_RD,
365    0, sizeof(struct vnode), "sizeof(struct vnode)");
366
367SYSCTL_INT(_debug_sizeof, OID_AUTO, proc, CTLFLAG_RD,
368    0, sizeof(struct proc), "sizeof(struct proc)");
369
370#include <sys/conf.h>
371SYSCTL_INT(_debug_sizeof, OID_AUTO, cdev, CTLFLAG_RD,
372    0, sizeof(struct cdev), "sizeof(struct cdev)");
373
374#include <sys/bio.h>
375#include <sys/buf.h>
376SYSCTL_INT(_debug_sizeof, OID_AUTO, bio, CTLFLAG_RD,
377    0, sizeof(struct bio), "sizeof(struct bio)");
378SYSCTL_INT(_debug_sizeof, OID_AUTO, buf, CTLFLAG_RD,
379    0, sizeof(struct buf), "sizeof(struct buf)");
380
381#include <sys/user.h>
382SYSCTL_INT(_debug_sizeof, OID_AUTO, kinfo_proc, CTLFLAG_RD,
383    0, sizeof(struct kinfo_proc), "sizeof(struct kinfo_proc)");
384
385#endif /* __rtems__ */
Note: See TracBrowser for help on using the repository browser.