sysconf.c revision 87161
11573Srgrimes/*- 21573Srgrimes * Copyright (c) 1993 31573Srgrimes * The Regents of the University of California. All rights reserved. 41573Srgrimes * 51573Srgrimes * This code is derived from software contributed to Berkeley by 61573Srgrimes * Sean Eric Fagan of Cygnus Support. 71573Srgrimes * 81573Srgrimes * Redistribution and use in source and binary forms, with or without 91573Srgrimes * modification, are permitted provided that the following conditions 101573Srgrimes * are met: 111573Srgrimes * 1. Redistributions of source code must retain the above copyright 121573Srgrimes * notice, this list of conditions and the following disclaimer. 131573Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 141573Srgrimes * notice, this list of conditions and the following disclaimer in the 151573Srgrimes * documentation and/or other materials provided with the distribution. 161573Srgrimes * 3. All advertising materials mentioning features or use of this software 171573Srgrimes * must display the following acknowledgement: 181573Srgrimes * This product includes software developed by the University of 191573Srgrimes * California, Berkeley and its contributors. 201573Srgrimes * 4. Neither the name of the University nor the names of its contributors 211573Srgrimes * may be used to endorse or promote products derived from this software 221573Srgrimes * without specific prior written permission. 231573Srgrimes * 241573Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 251573Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 261573Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 271573Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 281573Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 291573Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 301573Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 311573Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 321573Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 331573Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 341573Srgrimes * SUCH DAMAGE. 351573Srgrimes */ 361573Srgrimes 371573Srgrimes#if defined(LIBC_SCCS) && !defined(lint) 381573Srgrimesstatic char sccsid[] = "@(#)sysconf.c 8.2 (Berkeley) 3/20/94"; 391573Srgrimes#endif /* LIBC_SCCS and not lint */ 401573Srgrimes 4178431Swollman#if defined(LIBC_RCS) && !defined(lint) 4278431Swollmanstatic const char rcsid[] = 4378431Swollman "$FreeBSD: head/lib/libc/gen/sysconf.c 87161 2001-12-01 12:07:42Z jkoshy $"; 4478431Swollman#endif /* LIBC_RCS and not lint */ 4578431Swollman 4634925Sdufault#include <sys/_posix.h> 471573Srgrimes#include <sys/param.h> 4812674Sdg#include <sys/time.h> 491573Srgrimes#include <sys/sysctl.h> 501573Srgrimes#include <sys/resource.h> 511573Srgrimes 521573Srgrimes#include <errno.h> 536171Sbde#include <time.h> 541573Srgrimes#include <unistd.h> 551573Srgrimes 561573Srgrimes/* 571573Srgrimes * sysconf -- 581573Srgrimes * get configurable system variables. 591573Srgrimes * 601573Srgrimes * XXX 611573Srgrimes * POSIX 1003.1 (ISO/IEC 9945-1, 4.8.1.3) states that the variable values 621573Srgrimes * not change during the lifetime of the calling process. This would seem 631573Srgrimes * to require that any change to system limits kill all running processes. 641573Srgrimes * A workaround might be to cache the values when they are first retrieved 651573Srgrimes * and then simply return the cached value on subsequent calls. This is 661573Srgrimes * less useful than returning up-to-date values, however. 671573Srgrimes */ 681573Srgrimeslong 691573Srgrimessysconf(name) 701573Srgrimes int name; 711573Srgrimes{ 721573Srgrimes struct rlimit rl; 731573Srgrimes size_t len; 741573Srgrimes int mib[2], value; 7536577Smsmith long defaultresult; 761573Srgrimes 771573Srgrimes len = sizeof(value); 7836577Smsmith defaultresult = -1; 791573Srgrimes 801573Srgrimes switch (name) { 811573Srgrimes/* 1003.1 */ 821573Srgrimes case _SC_ARG_MAX: 831573Srgrimes mib[0] = CTL_KERN; 841573Srgrimes mib[1] = KERN_ARGMAX; 851573Srgrimes break; 861573Srgrimes case _SC_CHILD_MAX: 871573Srgrimes return (getrlimit(RLIMIT_NPROC, &rl) ? -1 : rl.rlim_cur); 881573Srgrimes case _SC_CLK_TCK: 891573Srgrimes return (CLK_TCK); 901573Srgrimes case _SC_JOB_CONTROL: 911573Srgrimes mib[0] = CTL_KERN; 921573Srgrimes mib[1] = KERN_JOB_CONTROL; 931573Srgrimes goto yesno; 941573Srgrimes case _SC_NGROUPS_MAX: 951573Srgrimes mib[0] = CTL_KERN; 961573Srgrimes mib[1] = KERN_NGROUPS; 971573Srgrimes break; 981573Srgrimes case _SC_OPEN_MAX: 991573Srgrimes return (getrlimit(RLIMIT_NOFILE, &rl) ? -1 : rl.rlim_cur); 1001573Srgrimes case _SC_STREAM_MAX: 1011573Srgrimes mib[0] = CTL_USER; 1021573Srgrimes mib[1] = USER_STREAM_MAX; 1031573Srgrimes break; 1041573Srgrimes case _SC_TZNAME_MAX: 1051573Srgrimes mib[0] = CTL_USER; 1061573Srgrimes mib[1] = USER_TZNAME_MAX; 1071573Srgrimes break; 1081573Srgrimes case _SC_SAVED_IDS: 1091573Srgrimes mib[0] = CTL_KERN; 1101573Srgrimes mib[1] = KERN_SAVED_IDS; 1111573Srgrimes goto yesno; 1121573Srgrimes case _SC_VERSION: 1131573Srgrimes mib[0] = CTL_KERN; 1141573Srgrimes mib[1] = KERN_POSIX1; 1151573Srgrimes break; 1161573Srgrimes 1171573Srgrimes/* 1003.2 */ 1181573Srgrimes case _SC_BC_BASE_MAX: 1191573Srgrimes mib[0] = CTL_USER; 1201573Srgrimes mib[1] = USER_BC_BASE_MAX; 1211573Srgrimes break; 1221573Srgrimes case _SC_BC_DIM_MAX: 1231573Srgrimes mib[0] = CTL_USER; 1241573Srgrimes mib[1] = USER_BC_DIM_MAX; 1251573Srgrimes break; 1261573Srgrimes case _SC_BC_SCALE_MAX: 1271573Srgrimes mib[0] = CTL_USER; 1281573Srgrimes mib[1] = USER_BC_SCALE_MAX; 1291573Srgrimes break; 1301573Srgrimes case _SC_BC_STRING_MAX: 1311573Srgrimes mib[0] = CTL_USER; 1321573Srgrimes mib[1] = USER_BC_STRING_MAX; 1331573Srgrimes break; 1341573Srgrimes case _SC_COLL_WEIGHTS_MAX: 1351573Srgrimes mib[0] = CTL_USER; 1361573Srgrimes mib[1] = USER_COLL_WEIGHTS_MAX; 1371573Srgrimes break; 1381573Srgrimes case _SC_EXPR_NEST_MAX: 1391573Srgrimes mib[0] = CTL_USER; 1401573Srgrimes mib[1] = USER_EXPR_NEST_MAX; 1411573Srgrimes break; 1421573Srgrimes case _SC_LINE_MAX: 1431573Srgrimes mib[0] = CTL_USER; 1441573Srgrimes mib[1] = USER_LINE_MAX; 1451573Srgrimes break; 1461573Srgrimes case _SC_RE_DUP_MAX: 1471573Srgrimes mib[0] = CTL_USER; 1481573Srgrimes mib[1] = USER_RE_DUP_MAX; 1491573Srgrimes break; 1501573Srgrimes case _SC_2_VERSION: 1511573Srgrimes mib[0] = CTL_USER; 1521573Srgrimes mib[1] = USER_POSIX2_VERSION; 1531573Srgrimes break; 1541573Srgrimes case _SC_2_C_BIND: 1551573Srgrimes mib[0] = CTL_USER; 1561573Srgrimes mib[1] = USER_POSIX2_C_BIND; 1571573Srgrimes goto yesno; 1581573Srgrimes case _SC_2_C_DEV: 1591573Srgrimes mib[0] = CTL_USER; 1601573Srgrimes mib[1] = USER_POSIX2_C_DEV; 1611573Srgrimes goto yesno; 1621573Srgrimes case _SC_2_CHAR_TERM: 1631573Srgrimes mib[0] = CTL_USER; 1641573Srgrimes mib[1] = USER_POSIX2_CHAR_TERM; 1651573Srgrimes goto yesno; 1661573Srgrimes case _SC_2_FORT_DEV: 1671573Srgrimes mib[0] = CTL_USER; 1681573Srgrimes mib[1] = USER_POSIX2_FORT_DEV; 1691573Srgrimes goto yesno; 1701573Srgrimes case _SC_2_FORT_RUN: 1711573Srgrimes mib[0] = CTL_USER; 1721573Srgrimes mib[1] = USER_POSIX2_FORT_RUN; 1731573Srgrimes goto yesno; 1741573Srgrimes case _SC_2_LOCALEDEF: 1751573Srgrimes mib[0] = CTL_USER; 1761573Srgrimes mib[1] = USER_POSIX2_LOCALEDEF; 1771573Srgrimes goto yesno; 1781573Srgrimes case _SC_2_SW_DEV: 1791573Srgrimes mib[0] = CTL_USER; 1801573Srgrimes mib[1] = USER_POSIX2_SW_DEV; 1811573Srgrimes goto yesno; 1821573Srgrimes case _SC_2_UPE: 1831573Srgrimes mib[0] = CTL_USER; 1841573Srgrimes mib[1] = USER_POSIX2_UPE; 18534030Sdufault goto yesno; 18634030Sdufault 18734925Sdufault#ifdef _P1003_1B_VISIBLE 18834925Sdufault /* POSIX.1B */ 18934030Sdufault 19034030Sdufault case _SC_ASYNCHRONOUS_IO: 19134925Sdufault mib[0] = CTL_P1003_1B; 19234925Sdufault mib[1] = CTL_P1003_1B_ASYNCHRONOUS_IO; 19334030Sdufault goto yesno; 19434030Sdufault case _SC_MAPPED_FILES: 19534925Sdufault mib[0] = CTL_P1003_1B; 19634925Sdufault mib[1] = CTL_P1003_1B_MAPPED_FILES; 19734030Sdufault goto yesno; 19834030Sdufault case _SC_MEMLOCK: 19934925Sdufault mib[0] = CTL_P1003_1B; 20034925Sdufault mib[1] = CTL_P1003_1B_MEMLOCK; 20134030Sdufault goto yesno; 20234030Sdufault case _SC_MEMLOCK_RANGE: 20334925Sdufault mib[0] = CTL_P1003_1B; 20434925Sdufault mib[1] = CTL_P1003_1B_MEMLOCK_RANGE; 20534030Sdufault goto yesno; 20634030Sdufault case _SC_MEMORY_PROTECTION: 20734925Sdufault mib[0] = CTL_P1003_1B; 20834925Sdufault mib[1] = CTL_P1003_1B_MEMORY_PROTECTION; 20934030Sdufault goto yesno; 21034030Sdufault case _SC_MESSAGE_PASSING: 21134925Sdufault mib[0] = CTL_P1003_1B; 21234925Sdufault mib[1] = CTL_P1003_1B_MESSAGE_PASSING; 21334030Sdufault goto yesno; 21434030Sdufault case _SC_PRIORITIZED_IO: 21534925Sdufault mib[0] = CTL_P1003_1B; 21634925Sdufault mib[1] = CTL_P1003_1B_PRIORITIZED_IO; 21734030Sdufault goto yesno; 21834030Sdufault case _SC_PRIORITY_SCHEDULING: 21934925Sdufault mib[0] = CTL_P1003_1B; 22034925Sdufault mib[1] = CTL_P1003_1B_PRIORITY_SCHEDULING; 22134030Sdufault goto yesno; 22234030Sdufault case _SC_REALTIME_SIGNALS: 22334925Sdufault mib[0] = CTL_P1003_1B; 22434925Sdufault mib[1] = CTL_P1003_1B_REALTIME_SIGNALS; 22534030Sdufault goto yesno; 22634030Sdufault case _SC_SEMAPHORES: 22734925Sdufault mib[0] = CTL_P1003_1B; 22834925Sdufault mib[1] = CTL_P1003_1B_SEMAPHORES; 22934030Sdufault goto yesno; 23034030Sdufault case _SC_FSYNC: 23134925Sdufault mib[0] = CTL_P1003_1B; 23234925Sdufault mib[1] = CTL_P1003_1B_FSYNC; 23334030Sdufault goto yesno; 23434030Sdufault case _SC_SHARED_MEMORY_OBJECTS: 23534925Sdufault mib[0] = CTL_P1003_1B; 23634925Sdufault mib[1] = CTL_P1003_1B_SHARED_MEMORY_OBJECTS; 23734030Sdufault goto yesno; 23834030Sdufault case _SC_SYNCHRONIZED_IO: 23934925Sdufault mib[0] = CTL_P1003_1B; 24034925Sdufault mib[1] = CTL_P1003_1B_SYNCHRONIZED_IO; 24134030Sdufault goto yesno; 24234030Sdufault case _SC_TIMERS: 24334925Sdufault mib[0] = CTL_P1003_1B; 24434925Sdufault mib[1] = CTL_P1003_1B_TIMERS; 24534030Sdufault goto yesno; 24634030Sdufault case _SC_AIO_LISTIO_MAX: 24734925Sdufault mib[0] = CTL_P1003_1B; 24834925Sdufault mib[1] = CTL_P1003_1B_AIO_LISTIO_MAX; 24934030Sdufault goto yesno; 25034030Sdufault case _SC_AIO_MAX: 25134925Sdufault mib[0] = CTL_P1003_1B; 25234925Sdufault mib[1] = CTL_P1003_1B_AIO_MAX; 25334030Sdufault goto yesno; 25434030Sdufault case _SC_AIO_PRIO_DELTA_MAX: 25534925Sdufault mib[0] = CTL_P1003_1B; 25634925Sdufault mib[1] = CTL_P1003_1B_AIO_PRIO_DELTA_MAX; 25734030Sdufault goto yesno; 25834030Sdufault case _SC_DELAYTIMER_MAX: 25934925Sdufault mib[0] = CTL_P1003_1B; 26034925Sdufault mib[1] = CTL_P1003_1B_DELAYTIMER_MAX; 26134030Sdufault goto yesno; 26234030Sdufault case _SC_MQ_OPEN_MAX: 26334925Sdufault mib[0] = CTL_P1003_1B; 26434925Sdufault mib[1] = CTL_P1003_1B_MQ_OPEN_MAX; 26534030Sdufault goto yesno; 26634030Sdufault case _SC_PAGESIZE: 26736577Smsmith defaultresult = getpagesize(); 26834925Sdufault mib[0] = CTL_P1003_1B; 26934925Sdufault mib[1] = CTL_P1003_1B_PAGESIZE; 27034030Sdufault goto yesno; 27134030Sdufault case _SC_RTSIG_MAX: 27234925Sdufault mib[0] = CTL_P1003_1B; 27334925Sdufault mib[1] = CTL_P1003_1B_RTSIG_MAX; 27434030Sdufault goto yesno; 27534030Sdufault case _SC_SEM_NSEMS_MAX: 27634925Sdufault mib[0] = CTL_P1003_1B; 27734925Sdufault mib[1] = CTL_P1003_1B_SEM_NSEMS_MAX; 27834030Sdufault goto yesno; 27934030Sdufault case _SC_SEM_VALUE_MAX: 28034925Sdufault mib[0] = CTL_P1003_1B; 28134925Sdufault mib[1] = CTL_P1003_1B_SEM_VALUE_MAX; 28234030Sdufault goto yesno; 28334030Sdufault case _SC_SIGQUEUE_MAX: 28434925Sdufault mib[0] = CTL_P1003_1B; 28534925Sdufault mib[1] = CTL_P1003_1B_SIGQUEUE_MAX; 28634030Sdufault goto yesno; 28734030Sdufault case _SC_TIMER_MAX: 28834925Sdufault mib[0] = CTL_P1003_1B; 28934925Sdufault mib[1] = CTL_P1003_1B_TIMER_MAX; 29034030Sdufault goto yesno; 29134925Sdufault#endif /* _P1003_1B_VISIBLE */ 29234030Sdufault 29387161Sjkoshy#if defined(_SC_NPROCESSORS_CONF) && defined(_SC_NPROCESSORS_ONLN) 29487161Sjkoshy case _SC_NPROCESSORS_CONF: 29587161Sjkoshy case _SC_NPROCESSORS_ONLN: 29687161Sjkoshy mib[0] = CTL_HW; 29787161Sjkoshy mib[1] = HW_NCPU; 29887161Sjkoshy break; 29987161Sjkoshy#endif 30087161Sjkoshy 30178431Swollman#ifdef _SC_IOV_MAX 30278431Swollman case _SC_IOV_MAX: 30378431Swollman mib[0] = CTL_KERN; 30478431Swollman mib[1] = KERN_IOV_MAX; 30578431Swollman break; 30678431Swollman#endif 30778431Swollman 3081573Srgrimesyesno: if (sysctl(mib, 2, &value, &len, NULL, 0) == -1) 3091573Srgrimes return (-1); 3101573Srgrimes if (value == 0) 31136577Smsmith return (defaultresult); 3121573Srgrimes return (value); 3131573Srgrimes break; 3141573Srgrimes default: 3151573Srgrimes errno = EINVAL; 3161573Srgrimes return (-1); 3171573Srgrimes } 3188870Srgrimes return (sysctl(mib, 2, &value, &len, NULL, 0) == -1 ? -1 : value); 3191573Srgrimes} 320