sysconf.c revision 331722
126159Sse/*- 226159Sse * Copyright (c) 1993 366529Smsmith * The Regents of the University of California. All rights reserved. 466529Smsmith * 526159Sse * This code is derived from software contributed to Berkeley by 626159Sse * Sean Eric Fagan of Cygnus Support. 726159Sse * 826159Sse * Redistribution and use in source and binary forms, with or without 926159Sse * modification, are permitted provided that the following conditions 1026159Sse * are met: 1126159Sse * 1. Redistributions of source code must retain the above copyright 1226159Sse * notice, this list of conditions and the following disclaimer. 1326159Sse * 2. Redistributions in binary form must reproduce the above copyright 1426159Sse * notice, this list of conditions and the following disclaimer in the 1526159Sse * documentation and/or other materials provided with the distribution. 1626159Sse * 4. Neither the name of the University nor the names of its contributors 1726159Sse * may be used to endorse or promote products derived from this software 1826159Sse * without specific prior written permission. 1926159Sse * 2026159Sse * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2126159Sse * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2226159Sse * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2326159Sse * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2426159Sse * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2526159Sse * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2626159Sse * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2726159Sse * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2850477Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2926159Sse * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3026159Sse * SUCH DAMAGE. 316104Sse */ 3266529Smsmith 336734Sbde#if defined(LIBC_SCCS) && !defined(lint) 3447307Speterstatic char sccsid[] = "@(#)sysconf.c 8.2 (Berkeley) 3/20/94"; 3547307Speter#endif /* LIBC_SCCS and not lint */ 3661994Smsmith#include <sys/cdefs.h> 3765304Speter__FBSDID("$FreeBSD: stable/11/lib/libc/gen/sysconf.c 331722 2018-03-29 02:50:57Z eadler $"); 3867185Simp 3967185Simp#include "namespace.h" 4067185Simp#include <sys/param.h> 416104Sse#include <sys/time.h> 4248832Smsmith#include <sys/sysctl.h> 4361994Smsmith#include <sys/resource.h> 4466416Speter#include <sys/socket.h> 4566529Smsmith 4659294Smsmith#include <elf.h> 4759294Smsmith#include <errno.h> 4859294Smsmith#include <limits.h> 4969783Smsmith#include <paths.h> 5069783Smsmith#include <pthread.h> /* we just need the limits */ 5169783Smsmith#include <semaphore.h> 5269783Smsmith#include <time.h> 5365176Sdfr#include <unistd.h> 5465176Sdfr#include "un-namespace.h" 5582441Simp 5682441Simp#include "../stdlib/atexit.h" 5726159Sse#include "tzfile.h" /* from ../../../contrib/tzcode/stdtime */ 5826159Sse#include "libc_private.h" 5959294Smsmith 6082035Simp#define _PATH_ZONEINFO TZDIR /* from tzfile.h */ 616104Sse 6282035Simp/* 6382035Simp * sysconf -- 6468218Smsmith * get configurable system variables. 6568218Smsmith * 6668218Smsmith * XXX 6768218Smsmith * POSIX 1003.1 (ISO/IEC 9945-1, 4.8.1.3) states that the variable values 6868218Smsmith * not change during the lifetime of the calling process. This would seem 6966529Smsmith * to require that any change to system limits kill all running processes. 7066529Smsmith * A workaround might be to cache the values when they are first retrieved 7159294Smsmith * and then simply return the cached value on subsequent calls. This is 7266529Smsmith * less useful than returning up-to-date values, however. 7366529Smsmith */ 7459294Smsmithlong 7559294Smsmithsysconf(int name) 7668218Smsmith{ 7767185Simp struct rlimit rl; 7867185Simp size_t len; 7982026Speter int mib[2], sverrno, value; 8082026Speter long lvalue, defaultresult; 8182026Speter const char *path; 8282026Speter 8382026Speter defaultresult = -1; 8482026Speter 8582026Speter switch (name) { 8682026Speter case _SC_ARG_MAX: 8782026Speter mib[0] = CTL_KERN; 8882026Speter mib[1] = KERN_ARGMAX; 8982026Speter break; 9082026Speter case _SC_CHILD_MAX: 9182026Speter if (getrlimit(RLIMIT_NPROC, &rl) != 0) 9282441Simp return (-1); 9382441Simp if (rl.rlim_cur == RLIM_INFINITY) 9482441Simp return (-1); 9582441Simp if (rl.rlim_cur > LONG_MAX) { 9682441Simp errno = EOVERFLOW; 9782441Simp return (-1); 9882441Simp } 9982441Simp return ((long)rl.rlim_cur); 10082441Simp case _SC_CLK_TCK: 10182441Simp return (CLK_TCK); 10282441Simp case _SC_NGROUPS_MAX: 10382441Simp mib[0] = CTL_KERN; 10482441Simp mib[1] = KERN_NGROUPS; 10582441Simp break; 10682441Simp case _SC_OPEN_MAX: 10782441Simp if (getrlimit(RLIMIT_NOFILE, &rl) != 0) 10882441Simp return (-1); 10982441Simp if (rl.rlim_cur == RLIM_INFINITY) 11082441Simp return (-1); 11182441Simp if (rl.rlim_cur > LONG_MAX) { 11282441Simp errno = EOVERFLOW; 11366529Smsmith return (-1); 11466529Smsmith } 11566529Smsmith return ((long)rl.rlim_cur); 11666529Smsmith case _SC_STREAM_MAX: 11766529Smsmith if (getrlimit(RLIMIT_NOFILE, &rl) != 0) 11859294Smsmith return (-1); 11967185Simp if (rl.rlim_cur == RLIM_INFINITY) 12067185Simp return (-1); 12167185Simp if (rl.rlim_cur > LONG_MAX) { 12267185Simp errno = EOVERFLOW; 12367185Simp return (-1); 12465176Sdfr } 12566529Smsmith /* 12666529Smsmith * struct __sFILE currently has a limitation that 12766529Smsmith * file descriptors must fit in a signed short. 12866529Smsmith * This doesn't precisely capture the letter of POSIX 12966529Smsmith * but approximates the spirit. 13066529Smsmith */ 13166529Smsmith if (rl.rlim_cur > SHRT_MAX) 13266529Smsmith return (SHRT_MAX); 13366529Smsmith 13466529Smsmith return ((long)rl.rlim_cur); 13567185Simp case _SC_JOB_CONTROL: 13667185Simp return (_POSIX_JOB_CONTROL); 13767185Simp case _SC_SAVED_IDS: 13867185Simp /* XXX - must be 1 */ 13982441Simp mib[0] = CTL_KERN; 14082441Simp mib[1] = KERN_SAVED_IDS; 14182441Simp goto yesno; 14267185Simp case _SC_VERSION: 14367185Simp mib[0] = CTL_KERN; 14467185Simp mib[1] = KERN_POSIX1; 14567185Simp break; 14667185Simp case _SC_BC_BASE_MAX: 14768218Smsmith return (BC_BASE_MAX); 14867185Simp case _SC_BC_DIM_MAX: 14967185Simp return (BC_DIM_MAX); 15067185Simp case _SC_BC_SCALE_MAX: 15167185Simp return (BC_SCALE_MAX); 15267185Simp case _SC_BC_STRING_MAX: 15366529Smsmith return (BC_STRING_MAX); 15466529Smsmith case _SC_COLL_WEIGHTS_MAX: 15559294Smsmith return (COLL_WEIGHTS_MAX); 15659294Smsmith case _SC_EXPR_NEST_MAX: 15766529Smsmith return (EXPR_NEST_MAX); 15869783Smsmith case _SC_LINE_MAX: 15966529Smsmith return (LINE_MAX); 16071237Speter case _SC_RE_DUP_MAX: 16169783Smsmith return (RE_DUP_MAX); 16259294Smsmith case _SC_2_VERSION: 16366529Smsmith /* 16466529Smsmith * This is something of a lie, but it would be silly at 16566529Smsmith * this point to try to deduce this from the contents 16659294Smsmith * of the filesystem. 16759294Smsmith */ 16869783Smsmith return (_POSIX2_VERSION); 16969783Smsmith case _SC_2_C_BIND: 17069783Smsmith return (_POSIX2_C_BIND); 17169783Smsmith case _SC_2_C_DEV: 17269783Smsmith return (_POSIX2_C_DEV); 17369783Smsmith case _SC_2_CHAR_TERM: 17469783Smsmith return (_POSIX2_CHAR_TERM); 17569783Smsmith case _SC_2_FORT_DEV: 17669783Smsmith return (_POSIX2_FORT_DEV); 17769783Smsmith case _SC_2_FORT_RUN: 17869783Smsmith return (_POSIX2_FORT_RUN); 17970953Sbmilekic case _SC_2_LOCALEDEF: 18069783Smsmith return (_POSIX2_LOCALEDEF); 18169783Smsmith case _SC_2_SW_DEV: 18269783Smsmith return (_POSIX2_SW_DEV); 18369783Smsmith case _SC_2_UPE: 18469783Smsmith return (_POSIX2_UPE); 18569783Smsmith case _SC_TZNAME_MAX: 18669783Smsmith path = _PATH_ZONEINFO; 18769783Smsmithdo_NAME_MAX: 18869783Smsmith sverrno = errno; 18969783Smsmith errno = 0; 19069783Smsmith lvalue = pathconf(path, _PC_NAME_MAX); 19169783Smsmith if (lvalue == -1 && errno != 0) 19269783Smsmith return (-1); 19369783Smsmith errno = sverrno; 19469783Smsmith return (lvalue); 19569783Smsmith 19669783Smsmith case _SC_ASYNCHRONOUS_IO: 19769783Smsmith#if _POSIX_ASYNCHRONOUS_IO == 0 19869783Smsmith mib[0] = CTL_P1003_1B; 19969783Smsmith mib[1] = CTL_P1003_1B_ASYNCHRONOUS_IO; 20069783Smsmith break; 20169783Smsmith#else 20269783Smsmith return (_POSIX_ASYNCHRONOUS_IO); 20369783Smsmith#endif 20469783Smsmith case _SC_MAPPED_FILES: 20569783Smsmith return (_POSIX_MAPPED_FILES); 20669783Smsmith case _SC_MEMLOCK: 20769783Smsmith return (_POSIX_MEMLOCK); 20869783Smsmith case _SC_MEMLOCK_RANGE: 20969783Smsmith return (_POSIX_MEMLOCK_RANGE); 21069783Smsmith case _SC_MEMORY_PROTECTION: 21169783Smsmith return (_POSIX_MEMORY_PROTECTION); 21269783Smsmith case _SC_MESSAGE_PASSING: 21369783Smsmith#if _POSIX_MESSAGE_PASSING == 0 21466529Smsmith mib[0] = CTL_P1003_1B; 21566529Smsmith mib[1] = CTL_P1003_1B_MESSAGE_PASSING; 21666529Smsmith goto yesno; 21766529Smsmith#else 21866529Smsmith return (_POSIX_MESSAGE_PASSING); 21959294Smsmith#endif 22066529Smsmith case _SC_PRIORITIZED_IO: 22166529Smsmith#if _POSIX_PRIORITIZED_IO == 0 22266529Smsmith mib[0] = CTL_P1003_1B; 22359294Smsmith mib[1] = CTL_P1003_1B_PRIORITIZED_IO; 22459294Smsmith goto yesno; 22566529Smsmith#else 22667185Simp return (_POSIX_PRIORITIZED_IO); 22767185Simp#endif 22867311Smsmith case _SC_PRIORITY_SCHEDULING: 22968218Smsmith#if _POSIX_PRIORITY_SCHEDULING == 0 23068218Smsmith mib[0] = CTL_P1003_1B; 23167185Simp mib[1] = CTL_P1003_1B_PRIORITY_SCHEDULING; 23267185Simp goto yesno; 23367185Simp#else 23467185Simp return (_POSIX_PRIORITY_SCHEDULING); 23567185Simp#endif 23667311Smsmith case _SC_REALTIME_SIGNALS: 23767311Smsmith#if _POSIX_REALTIME_SIGNALS == 0 23882441Simp mib[0] = CTL_P1003_1B; 23967185Simp mib[1] = CTL_P1003_1B_REALTIME_SIGNALS; 24082441Simp goto yesno; 24182441Simp#else 24282441Simp return (_POSIX_REALTIME_SIGNALS); 24382441Simp#endif 24482441Simp case _SC_SEMAPHORES: 24582441Simp#if _POSIX_SEMAPHORES == 0 24682441Simp mib[0] = CTL_P1003_1B; 24767186Simp mib[1] = CTL_P1003_1B_SEMAPHORES; 24867186Simp goto yesno; 24967185Simp#else 25067185Simp return (_POSIX_SEMAPHORES); 25167185Simp#endif 25267185Simp case _SC_FSYNC: 25367185Simp return (_POSIX_FSYNC); 25468218Smsmith 25567185Simp case _SC_SHARED_MEMORY_OBJECTS: 25667185Simp return (_POSIX_SHARED_MEMORY_OBJECTS); 25768218Smsmith case _SC_SYNCHRONIZED_IO: 25882441Simp#if _POSIX_SYNCHRONIZED_IO == 0 25982441Simp mib[0] = CTL_P1003_1B; 26082441Simp mib[1] = CTL_P1003_1B_SYNCHRONIZED_IO; 26182441Simp goto yesno; 26282441Simp#else 26382441Simp return (_POSIX_SYNCHRONIZED_IO); 26468218Smsmith#endif 26568218Smsmith case _SC_TIMERS: 26668218Smsmith#if _POSIX_TIMERS == 0 26768218Smsmith mib[0] = CTL_P1003_1B; 26868218Smsmith mib[1] = CTL_P1003_1B_TIMERS; 26967185Simp goto yesno; 27068218Smsmith#else 27168218Smsmith return (_POSIX_TIMERS); 27267311Smsmith#endif 27367311Smsmith case _SC_AIO_LISTIO_MAX: 27467311Smsmith mib[0] = CTL_P1003_1B; 27567311Smsmith mib[1] = CTL_P1003_1B_AIO_LISTIO_MAX; 27667311Smsmith break; 27767311Smsmith case _SC_AIO_MAX: 27882441Simp mib[0] = CTL_P1003_1B; 27982441Simp mib[1] = CTL_P1003_1B_AIO_MAX; 28082441Simp break; 28182441Simp case _SC_AIO_PRIO_DELTA_MAX: 28282441Simp mib[0] = CTL_P1003_1B; 28382441Simp mib[1] = CTL_P1003_1B_AIO_PRIO_DELTA_MAX; 28482441Simp break; 28582441Simp case _SC_DELAYTIMER_MAX: 28682441Simp mib[0] = CTL_P1003_1B; 28782441Simp mib[1] = CTL_P1003_1B_DELAYTIMER_MAX; 28867311Smsmith goto yesno; 28968218Smsmith case _SC_MQ_OPEN_MAX: 29068218Smsmith mib[0] = CTL_P1003_1B; 29168218Smsmith mib[1] = CTL_P1003_1B_MQ_OPEN_MAX; 29282441Simp goto yesno; 29382441Simp case _SC_PAGESIZE: 29467311Smsmith defaultresult = getpagesize(); 29567185Simp mib[0] = CTL_P1003_1B; 29668218Smsmith mib[1] = CTL_P1003_1B_PAGESIZE; 29782441Simp goto yesno; 29867185Simp case _SC_RTSIG_MAX: 29967185Simp mib[0] = CTL_P1003_1B; 30067185Simp mib[1] = CTL_P1003_1B_RTSIG_MAX; 30168218Smsmith goto yesno; 30268218Smsmith case _SC_SEM_NSEMS_MAX: 30368218Smsmith return (-1); 30468218Smsmith case _SC_SEM_VALUE_MAX: 30568218Smsmith return (SEM_VALUE_MAX); 30668218Smsmith case _SC_SIGQUEUE_MAX: 30768218Smsmith mib[0] = CTL_P1003_1B; 30868218Smsmith mib[1] = CTL_P1003_1B_SIGQUEUE_MAX; 30968218Smsmith goto yesno; 31068218Smsmith case _SC_TIMER_MAX: 31182441Simp mib[0] = CTL_P1003_1B; 31268218Smsmith mib[1] = CTL_P1003_1B_TIMER_MAX; 31368218Smsmithyesno: 31468218Smsmith len = sizeof(value); 31568218Smsmith if (sysctl(mib, 2, &value, &len, NULL, 0) == -1) 31667185Simp return (-1); 31767185Simp if (value == 0) 31868218Smsmith return (defaultresult); 31968218Smsmith return ((long)value); 32068218Smsmith 32168218Smsmith case _SC_2_PBS: 32268218Smsmith case _SC_2_PBS_ACCOUNTING: 32368218Smsmith case _SC_2_PBS_CHECKPOINT: 32468218Smsmith case _SC_2_PBS_LOCATE: 32568218Smsmith case _SC_2_PBS_MESSAGE: 32668218Smsmith case _SC_2_PBS_TRACK: 32768218Smsmith#if _POSIX2_PBS == 0 32868218Smsmith#error "don't know how to determine _SC_2_PBS" 32968218Smsmith /* 33068218Smsmith * This probably requires digging through the filesystem 33168218Smsmith * to see if the appropriate package has been installed. 33268218Smsmith * Since we don't currently support this option at all, 33368218Smsmith * it's not worth the effort to write the code now. 33468218Smsmith * Figuring out which of the sub-options are supported 33568218Smsmith * would be even more difficult, so it's probably easier 33668218Smsmith * to always say ``no''. 33768218Smsmith */ 33868218Smsmith#else 33968218Smsmith return (_POSIX2_PBS); 34068218Smsmith#endif 34168218Smsmith case _SC_ADVISORY_INFO: 34268218Smsmith#if _POSIX_ADVISORY_INFO == 0 34368218Smsmith#error "_POSIX_ADVISORY_INFO" 34468218Smsmith#else 34568218Smsmith return (_POSIX_ADVISORY_INFO); 34668218Smsmith#endif 34782441Simp case _SC_BARRIERS: 34882441Simp#if _POSIX_BARRIERS == 0 34968218Smsmith#error "_POSIX_BARRIERS" 35068218Smsmith#else 35168218Smsmith return (_POSIX_BARRIERS); 35268218Smsmith#endif 35368218Smsmith case _SC_CLOCK_SELECTION: 35468218Smsmith#if _POSIX_CLOCK_SELECTION == 0 35568218Smsmith#error "_POSIX_CLOCK_SELECTION" 35668218Smsmith#else 35768218Smsmith return (_POSIX_CLOCK_SELECTION); 35868218Smsmith#endif 35968218Smsmith case _SC_CPUTIME: 36068218Smsmith return (_POSIX_CPUTIME); 36168218Smsmith#ifdef notdef 36268218Smsmith case _SC_FILE_LOCKING: 36368218Smsmith /* 36468218Smsmith * XXX - The standard doesn't tell us how to define 36568218Smsmith * _POSIX_FILE_LOCKING, so we can't answer this one. 36668218Smsmith */ 36768218Smsmith#endif 36868218Smsmith 36968218Smsmith /* 37068218Smsmith * SUSv4tc1 says the following about _SC_GETGR_R_SIZE_MAX and 37168218Smsmith * _SC_GETPW_R_SIZE_MAX: 37268218Smsmith * Note that sysconf(_SC_GETGR_R_SIZE_MAX) may return -1 if 37368218Smsmith * there is no hard limit on the size of the buffer needed to 37468218Smsmith * store all the groups returned. 37568218Smsmith */ 37668218Smsmith case _SC_GETGR_R_SIZE_MAX: 37768218Smsmith case _SC_GETPW_R_SIZE_MAX: 37868218Smsmith return (-1); 37968218Smsmith case _SC_HOST_NAME_MAX: 38068218Smsmith return (MAXHOSTNAMELEN - 1); /* does not include \0 */ 38168218Smsmith case _SC_LOGIN_NAME_MAX: 38268218Smsmith return (MAXLOGNAME); 38368218Smsmith case _SC_MONOTONIC_CLOCK: 38468218Smsmith#if _POSIX_MONOTONIC_CLOCK == 0 38572182Smsmith#error "_POSIX_MONOTONIC_CLOCK" 38672182Smsmith#else 38768218Smsmith return (_POSIX_MONOTONIC_CLOCK); 38868218Smsmith#endif 38968218Smsmith#if _POSIX_MESSAGE_PASSING > -1 39068218Smsmith case _SC_MQ_PRIO_MAX: 39168218Smsmith return (MQ_PRIO_MAX); 39268218Smsmith#endif 39368218Smsmith case _SC_READER_WRITER_LOCKS: 39468218Smsmith return (_POSIX_READER_WRITER_LOCKS); 39582441Simp case _SC_REGEXP: 39676456Smsmith return (_POSIX_REGEXP); 39782441Simp case _SC_SHELL: 39872182Smsmith return (_POSIX_SHELL); 39968218Smsmith case _SC_SPAWN: 40068218Smsmith return (_POSIX_SPAWN); 40172182Smsmith case _SC_SPIN_LOCKS: 40272182Smsmith return (_POSIX_SPIN_LOCKS); 40368218Smsmith case _SC_SPORADIC_SERVER: 40472182Smsmith#if _POSIX_SPORADIC_SERVER == 0 40572182Smsmith#error "_POSIX_SPORADIC_SERVER" 40672182Smsmith#else 40768218Smsmith return (_POSIX_SPORADIC_SERVER); 40868218Smsmith#endif 40968218Smsmith case _SC_THREAD_ATTR_STACKADDR: 41068218Smsmith return (_POSIX_THREAD_ATTR_STACKADDR); 41168218Smsmith case _SC_THREAD_ATTR_STACKSIZE: 41268218Smsmith return (_POSIX_THREAD_ATTR_STACKSIZE); 41368218Smsmith case _SC_THREAD_CPUTIME: 41468218Smsmith return (_POSIX_THREAD_CPUTIME); 41568218Smsmith case _SC_THREAD_DESTRUCTOR_ITERATIONS: 41668218Smsmith return (PTHREAD_DESTRUCTOR_ITERATIONS); 41768218Smsmith case _SC_THREAD_KEYS_MAX: 41868218Smsmith return (PTHREAD_KEYS_MAX); 41968218Smsmith case _SC_THREAD_PRIO_INHERIT: 42068218Smsmith return (_POSIX_THREAD_PRIO_INHERIT); 42168218Smsmith case _SC_THREAD_PRIO_PROTECT: 42268218Smsmith return (_POSIX_THREAD_PRIO_PROTECT); 42368218Smsmith case _SC_THREAD_PRIORITY_SCHEDULING: 42482441Simp return (_POSIX_THREAD_PRIORITY_SCHEDULING); 42568218Smsmith case _SC_THREAD_PROCESS_SHARED: 42668218Smsmith return (_POSIX_THREAD_PROCESS_SHARED); 42768218Smsmith case _SC_THREAD_SAFE_FUNCTIONS: 42868218Smsmith return (_POSIX_THREAD_SAFE_FUNCTIONS); 42968218Smsmith case _SC_THREAD_STACK_MIN: 43068218Smsmith return (PTHREAD_STACK_MIN); 43168218Smsmith case _SC_THREAD_THREADS_MAX: 43268218Smsmith return (PTHREAD_THREADS_MAX); /* XXX wrong type! */ 43368218Smsmith case _SC_TIMEOUTS: 43482441Simp return (_POSIX_TIMEOUTS); 43568218Smsmith case _SC_THREADS: 43668218Smsmith return (_POSIX_THREADS); 43768218Smsmith case _SC_TRACE: 43868218Smsmith#if _POSIX_TRACE == 0 43968218Smsmith#error "_POSIX_TRACE" 44068218Smsmith /* While you're implementing this, also do the ones below. */ 44168218Smsmith#else 44268218Smsmith return (_POSIX_TRACE); 44366529Smsmith#endif 44466529Smsmith#if _POSIX_TRACE > -1 44559294Smsmith case _SC_TRACE_EVENT_FILTER: 44665176Sdfr return (_POSIX_TRACE_EVENT_FILTER); 44759294Smsmith case _SC_TRACE_INHERIT: 44866529Smsmith return (_POSIX_TRACE_INHERIT); 44966529Smsmith case _SC_TRACE_LOG: 45065304Speter return (_POSIX_TRACE_LOG); 45166529Smsmith#endif 45266529Smsmith case _SC_TTY_NAME_MAX: 45366529Smsmith path = _PATH_DEV; 45466529Smsmith goto do_NAME_MAX; 45566529Smsmith case _SC_TYPED_MEMORY_OBJECTS: 45666529Smsmith#if _POSIX_TYPED_MEMORY_OBJECTS == 0 45766529Smsmith#error "_POSIX_TYPED_MEMORY_OBJECTS" 45866529Smsmith#else 45966529Smsmith return (_POSIX_TYPED_MEMORY_OBJECTS); 46066529Smsmith#endif 46166529Smsmith case _SC_V6_ILP32_OFF32: 46266529Smsmith#if _V6_ILP32_OFF32 == 0 46366529Smsmith if (sizeof(int) * CHAR_BIT == 32 && 46466529Smsmith sizeof(int) == sizeof(long) && 46566529Smsmith sizeof(long) == sizeof(void *) && 46666529Smsmith sizeof(void *) == sizeof(off_t)) 46766529Smsmith return 1; 46866529Smsmith else 46966529Smsmith return -1; 47066529Smsmith#else 47166529Smsmith return (_V6_ILP32_OFF32); 47259294Smsmith#endif 47359294Smsmith case _SC_V6_ILP32_OFFBIG: 47459294Smsmith#if _V6_ILP32_OFFBIG == 0 47565176Sdfr if (sizeof(int) * CHAR_BIT == 32 && 47659294Smsmith sizeof(int) == sizeof(long) && 47766529Smsmith sizeof(long) == sizeof(void *) && 47865304Speter sizeof(off_t) * CHAR_BIT >= 64) 47966529Smsmith return 1; 48066529Smsmith else 48166529Smsmith return -1; 48266529Smsmith#else 48366529Smsmith return (_V6_ILP32_OFFBIG); 48466529Smsmith#endif 48566529Smsmith case _SC_V6_LP64_OFF64: 48666529Smsmith#if _V6_LP64_OFF64 == 0 48766529Smsmith if (sizeof(int) * CHAR_BIT == 32 && 48866529Smsmith sizeof(long) * CHAR_BIT == 64 && 48966529Smsmith sizeof(long) == sizeof(void *) && 49066529Smsmith sizeof(void *) == sizeof(off_t)) 49166529Smsmith return 1; 49266529Smsmith else 49366529Smsmith return -1; 49466529Smsmith#else 49566529Smsmith return (_V6_LP64_OFF64); 49659294Smsmith#endif 49759294Smsmith case _SC_V6_LPBIG_OFFBIG: 49866529Smsmith#if _V6_LPBIG_OFFBIG == 0 49966529Smsmith if (sizeof(int) * CHAR_BIT >= 32 && 50066529Smsmith sizeof(long) * CHAR_BIT >= 64 && 50159294Smsmith sizeof(void *) * CHAR_BIT >= 64 && 50259294Smsmith sizeof(off_t) * CHAR_BIT >= 64) 50359294Smsmith return 1; 50482035Simp else 50582035Simp return -1; 50682035Simp#else 50782035Simp return (_V6_LPBIG_OFFBIG); 50882035Simp#endif 50982035Simp case _SC_ATEXIT_MAX: 51082035Simp return (ATEXIT_SIZE); 51182035Simp case _SC_IOV_MAX: 51282035Simp mib[0] = CTL_KERN; 51359294Smsmith mib[1] = KERN_IOV_MAX; 51459294Smsmith break; 51566529Smsmith case _SC_XOPEN_CRYPT: 51666529Smsmith return (_XOPEN_CRYPT); 51766529Smsmith case _SC_XOPEN_ENH_I18N: 51859294Smsmith return (_XOPEN_ENH_I18N); 51926159Sse case _SC_XOPEN_LEGACY: 52010887Sse return (_XOPEN_LEGACY); 52126159Sse case _SC_XOPEN_REALTIME: 52226159Sse#if _XOPEN_REALTIME == 0 52366529Smsmith sverrno = errno; 52410887Sse value = sysconf(_SC_ASYNCHRONOUS_IO) > 0 && 52566529Smsmith sysconf(_SC_MEMLOCK) > 0 && 52666529Smsmith sysconf(_SC_MEMLOCK_RANGE) > 0 && 52766529Smsmith sysconf(_SC_MESSAGE_PASSING) > 0 && 52866529Smsmith sysconf(_SC_PRIORITY_SCHEDULING) > 0 && 52966529Smsmith sysconf(_SC_REALTIME_SIGNALS) > 0 && 53066529Smsmith sysconf(_SC_SEMAPHORES) > 0 && 53166529Smsmith sysconf(_SC_SHARED_MEMORY_OBJECTS) > 0 && 53266529Smsmith sysconf(_SC_SYNCHRONIZED_IO) > 0 && 53366529Smsmith sysconf(_SC_TIMERS) > 0; 53466529Smsmith errno = sverrno; 53566529Smsmith if (value) 53666529Smsmith return (200112L); 53766529Smsmith else 53866529Smsmith return (-1); 53966529Smsmith#else 54066529Smsmith return (_XOPEN_REALTIME); 54166529Smsmith#endif 54266529Smsmith case _SC_XOPEN_REALTIME_THREADS: 54366529Smsmith#if _XOPEN_REALTIME_THREADS == 0 54426159Sse#error "_XOPEN_REALTIME_THREADS" 54566529Smsmith#else 54666529Smsmith return (_XOPEN_REALTIME_THREADS); 54726159Sse#endif 5486104Sse case _SC_XOPEN_SHM: 54926159Sse len = sizeof(lvalue); 5506104Sse sverrno = errno; 55126159Sse if (sysctlbyname("kern.ipc.shmmin", &lvalue, &len, NULL, 55226159Sse 0) == -1) { 55366529Smsmith errno = sverrno; 55466529Smsmith return (-1); 55566529Smsmith } 55666529Smsmith errno = sverrno; 55766529Smsmith return (1); 55866529Smsmith case _SC_XOPEN_STREAMS: 55966529Smsmith return (_XOPEN_STREAMS); 56066529Smsmith case _SC_XOPEN_UNIX: 56166529Smsmith return (_XOPEN_UNIX); 56226159Sse#ifdef _XOPEN_VERSION 5636104Sse case _SC_XOPEN_VERSION: 56459294Smsmith return (_XOPEN_VERSION); 56565176Sdfr#endif 56626159Sse#ifdef _XOPEN_XCU_VERSION 56766529Smsmith case _SC_XOPEN_XCU_VERSION: 56866529Smsmith return (_XOPEN_XCU_VERSION); 5697234Sse#endif 57066529Smsmith case _SC_SYMLOOP_MAX: 5717234Sse return (MAXSYMLINKS); 57266529Smsmith case _SC_RAW_SOCKETS: 57366529Smsmith return (_POSIX_RAW_SOCKETS); 57466529Smsmith case _SC_IPV6: 57566529Smsmith#if _POSIX_IPV6 == 0 57666529Smsmith sverrno = errno; 57766529Smsmith value = _socket(PF_INET6, SOCK_DGRAM, 0); 57866529Smsmith errno = sverrno; 57966529Smsmith if (value >= 0) { 58066529Smsmith _close(value); 58166529Smsmith return (200112L); 58266529Smsmith } else 58326159Sse return (0); 58466529Smsmith#else 58566529Smsmith return (_POSIX_IPV6); 58666529Smsmith#endif 58726159Sse 5887234Sse case _SC_NPROCESSORS_CONF: 58959294Smsmith case _SC_NPROCESSORS_ONLN: 59065176Sdfr if (_elf_aux_info(AT_NCPUS, &value, sizeof(value)) == 0) 59126159Sse return ((long)value); 59266529Smsmith mib[0] = CTL_HW; 5936104Sse mib[1] = HW_NCPU; 59466529Smsmith break; 59566529Smsmith 59666529Smsmith#ifdef _SC_PHYS_PAGES 59766529Smsmith case _SC_PHYS_PAGES: 59866529Smsmith len = sizeof(lvalue); 59966529Smsmith if (sysctlbyname("hw.availpages", &lvalue, &len, NULL, 0) == -1) 60066529Smsmith return (-1); 60166529Smsmith return (lvalue); 60266529Smsmith#endif 60366529Smsmith 60466529Smsmith#ifdef _SC_CPUSET_SIZE 60566529Smsmith case _SC_CPUSET_SIZE: 60626159Sse len = sizeof(value); 60766529Smsmith if (sysctlbyname("kern.sched.cpusetsize", &value, &len, NULL, 60866529Smsmith 0) == -1) 60926159Sse return (-1); 6106104Sse return ((long)value); 61166529Smsmith#endif 61210887Sse 61326159Sse default: 61410887Sse errno = EINVAL; 61566529Smsmith return (-1); 61610735Sse } 61766529Smsmith len = sizeof(value); 61866529Smsmith if (sysctl(mib, 2, &value, &len, NULL, 0) == -1) 61966529Smsmith value = -1; 62066529Smsmith return ((long)value); 62166529Smsmith} 62226159Sse