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