sysctl.c revision 204170
1107120Sjulian/*-
2107120Sjulian * Copyright (c) 1993
3139823Simp *	The Regents of the University of California.  All rights reserved.
4139823Simp *
5139823Simp * Redistribution and use in source and binary forms, with or without
6107120Sjulian * modification, are permitted provided that the following conditions
7107120Sjulian * are met:
8107120Sjulian * 1. Redistributions of source code must retain the above copyright
9107120Sjulian *    notice, this list of conditions and the following disclaimer.
10107120Sjulian * 2. Redistributions in binary form must reproduce the above copyright
11107120Sjulian *    notice, this list of conditions and the following disclaimer in the
12107120Sjulian *    documentation and/or other materials provided with the distribution.
13107120Sjulian * 4. Neither the name of the University nor the names of its contributors
14107120Sjulian *    may be used to endorse or promote products derived from this software
15107120Sjulian *    without specific prior written permission.
16107120Sjulian *
17107120Sjulian * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18107120Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19107120Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20107120Sjulian * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21107120Sjulian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22107120Sjulian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23107120Sjulian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24107120Sjulian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25107120Sjulian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26107120Sjulian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27107120Sjulian * SUCH DAMAGE.
28107120Sjulian */
29107120Sjulian
30114878Sjulian#if defined(LIBC_SCCS) && !defined(lint)
31107120Sjulianstatic char sccsid[] = "@(#)sysctl.c	8.2 (Berkeley) 1/4/94";
32107120Sjulian#endif /* LIBC_SCCS and not lint */
33107120Sjulian#include <sys/cdefs.h>
34107120Sjulian__FBSDID("$FreeBSD: head/lib/libc/gen/sysctl.c 204170 2010-02-21 13:57:02Z ed $");
35122634Semax
36107120Sjulian#include <sys/param.h>
37107120Sjulian#include <sys/sysctl.h>
38129079Semax
39107120Sjulian#include <errno.h>
40107120Sjulian#include <limits.h>
41107120Sjulian#include <paths.h>
42107120Sjulian#include <stdio.h>
43114878Sjulian#include <unistd.h>
44180399Semax#include <string.h>
45107120Sjulian
46107120Sjulianextern int __sysctl(const int *name, u_int namelen, void *oldp,
47107120Sjulian    size_t *oldlenp, const void *newp, size_t newlen);
48107120Sjulian
49107120Sjulianint
50107120Sjuliansysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp,
51107120Sjulian    const void *newp, size_t newlen)
52107120Sjulian{
53134057Sjulian	if (name[0] != CTL_USER)
54107120Sjulian		return (__sysctl(name, namelen, oldp, oldlenp, newp, newlen));
55107120Sjulian
56107120Sjulian	if (newp != NULL) {
57107120Sjulian		errno = EPERM;
58107120Sjulian		return (-1);
59107120Sjulian	}
60107120Sjulian	if (namelen != 2) {
61107120Sjulian		errno = EINVAL;
62107120Sjulian		return (-1);
63107120Sjulian	}
64107120Sjulian
65107120Sjulian	switch (name[1]) {
66107120Sjulian	case USER_CS_PATH:
67107120Sjulian		if (oldp && *oldlenp < sizeof(_PATH_STDPATH)) {
68107120Sjulian			errno = ENOMEM;
69107120Sjulian			return -1;
70107120Sjulian		}
71107120Sjulian		*oldlenp = sizeof(_PATH_STDPATH);
72107120Sjulian		if (oldp != NULL)
73107120Sjulian			memmove(oldp, _PATH_STDPATH, sizeof(_PATH_STDPATH));
74107120Sjulian		return (0);
75107120Sjulian	}
76107120Sjulian
77107120Sjulian	if (oldp && *oldlenp < sizeof(int)) {
78107120Sjulian		errno = ENOMEM;
79107120Sjulian		return (-1);
80107120Sjulian	}
81107120Sjulian	*oldlenp = sizeof(int);
82107120Sjulian	if (oldp == NULL)
83107120Sjulian		return (0);
84107120Sjulian
85107120Sjulian	switch (name[1]) {
86107120Sjulian	case USER_BC_BASE_MAX:
87107120Sjulian		*(int *)oldp = BC_BASE_MAX;
88107120Sjulian		return (0);
89114878Sjulian	case USER_BC_DIM_MAX:
90107120Sjulian		*(int *)oldp = BC_DIM_MAX;
91107120Sjulian		return (0);
92107120Sjulian	case USER_BC_SCALE_MAX:
93107120Sjulian		*(int *)oldp = BC_SCALE_MAX;
94107120Sjulian		return (0);
95107120Sjulian	case USER_BC_STRING_MAX:
96107120Sjulian		*(int *)oldp = BC_STRING_MAX;
97107120Sjulian		return (0);
98107120Sjulian	case USER_COLL_WEIGHTS_MAX:
99107120Sjulian		*(int *)oldp = COLL_WEIGHTS_MAX;
100107120Sjulian		return (0);
101107120Sjulian	case USER_EXPR_NEST_MAX:
102107120Sjulian		*(int *)oldp = EXPR_NEST_MAX;
103107120Sjulian		return (0);
104107120Sjulian	case USER_LINE_MAX:
105107120Sjulian		*(int *)oldp = LINE_MAX;
106107120Sjulian		return (0);
107107120Sjulian	case USER_RE_DUP_MAX:
108107120Sjulian		*(int *)oldp = RE_DUP_MAX;
109107120Sjulian		return (0);
110107120Sjulian	case USER_POSIX2_VERSION:
111107120Sjulian		*(int *)oldp = _POSIX2_VERSION;
112107120Sjulian		return (0);
113107120Sjulian	case USER_POSIX2_C_BIND:
114107120Sjulian#ifdef POSIX2_C_BIND
115107120Sjulian		*(int *)oldp = 1;
116107120Sjulian#else
117107120Sjulian		*(int *)oldp = 0;
118107120Sjulian#endif
119107120Sjulian		return (0);
120107120Sjulian	case USER_POSIX2_C_DEV:
121107120Sjulian#ifdef	POSIX2_C_DEV
122107120Sjulian		*(int *)oldp = 1;
123107120Sjulian#else
124107120Sjulian		*(int *)oldp = 0;
125107120Sjulian#endif
126107120Sjulian		return (0);
127107120Sjulian	case USER_POSIX2_CHAR_TERM:
128107120Sjulian#ifdef	POSIX2_CHAR_TERM
129107120Sjulian		*(int *)oldp = 1;
130107120Sjulian#else
131107120Sjulian		*(int *)oldp = 0;
132107120Sjulian#endif
133107120Sjulian		return (0);
134107120Sjulian	case USER_POSIX2_FORT_DEV:
135107120Sjulian#ifdef	POSIX2_FORT_DEV
136114878Sjulian		*(int *)oldp = 1;
137107120Sjulian#else
138107120Sjulian		*(int *)oldp = 0;
139107120Sjulian#endif
140114878Sjulian		return (0);
141107120Sjulian	case USER_POSIX2_FORT_RUN:
142107120Sjulian#ifdef	POSIX2_FORT_RUN
143107120Sjulian		*(int *)oldp = 1;
144107120Sjulian#else
145107120Sjulian		*(int *)oldp = 0;
146107120Sjulian#endif
147107120Sjulian		return (0);
148107120Sjulian	case USER_POSIX2_LOCALEDEF:
149107120Sjulian#ifdef	POSIX2_LOCALEDEF
150107120Sjulian		*(int *)oldp = 1;
151107120Sjulian#else
152107120Sjulian		*(int *)oldp = 0;
153107120Sjulian#endif
154107120Sjulian		return (0);
155107120Sjulian	case USER_POSIX2_SW_DEV:
156107120Sjulian#ifdef	POSIX2_SW_DEV
157107120Sjulian		*(int *)oldp = 1;
158107120Sjulian#else
159107120Sjulian		*(int *)oldp = 0;
160107120Sjulian#endif
161107120Sjulian		return (0);
162107120Sjulian	case USER_POSIX2_UPE:
163107120Sjulian#ifdef	POSIX2_UPE
164107120Sjulian		*(int *)oldp = 1;
165107120Sjulian#else
166107120Sjulian		*(int *)oldp = 0;
167107120Sjulian#endif
168107120Sjulian		return (0);
169107120Sjulian	case USER_STREAM_MAX:
170107120Sjulian		*(int *)oldp = FOPEN_MAX;
171107120Sjulian		return (0);
172107120Sjulian	case USER_TZNAME_MAX:
173107120Sjulian		*(int *)oldp = NAME_MAX;
174107120Sjulian		return (0);
175107120Sjulian	default:
176107120Sjulian		errno = EINVAL;
177107120Sjulian		return (-1);
178107120Sjulian	}
179107120Sjulian	/* NOTREACHED */
180107120Sjulian}
181107120Sjulian