diff options
author | Yabin Cui <yabinc@google.com> | 2014-11-19 19:49:14 -0800 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2014-11-21 19:10:52 -0800 |
commit | 1c19194c9d2518dbe86973cd313a277ecb70d75c (patch) | |
tree | 46cffb5ae65c870a36e217b2b9a7b27e2c3154be /libc/bionic/sysconf.cpp | |
parent | 27aa9c5b50cc3e979fc67c1bf5296dfd725c8540 (diff) | |
download | bionic-1c19194c9d2518dbe86973cd313a277ecb70d75c.zip bionic-1c19194c9d2518dbe86973cd313a277ecb70d75c.tar.gz bionic-1c19194c9d2518dbe86973cd313a277ecb70d75c.tar.bz2 |
flesh out sysconf(3) and the _POSIX_* constants
Bug: 17571891
Change-Id: I81036615486bde65969ae5662587fcc88348474e
Diffstat (limited to 'libc/bionic/sysconf.cpp')
-rw-r--r-- | libc/bionic/sysconf.cpp | 191 |
1 files changed, 99 insertions, 92 deletions
diff --git a/libc/bionic/sysconf.cpp b/libc/bionic/sysconf.cpp index 2df6acc..67f48e7 100644 --- a/libc/bionic/sysconf.cpp +++ b/libc/bionic/sysconf.cpp @@ -29,8 +29,10 @@ #include <errno.h> #include <fcntl.h> #include <limits.h> +#include <linux/uio.h> // For UIO_MAXIOV. #include <pthread.h> #include <stdio.h> // For FOPEN_MAX. +#include <sys/auxv.h> #include <sys/sysconf.h> #include <sys/sysinfo.h> #include <time.h> @@ -38,33 +40,6 @@ #include "private/bionic_tls.h" -/* seems to be the default on Linux, per the GLibc sources and my own digging */ - -#define SYSTEM_CLK_TCK 100 -#define SYSTEM_IOV_MAX 1024 -#define SYSTEM_DELAYTIMER_MAX 2147483647 -#define SYSTEM_MQ_OPEN_MAX 8 -#define SYSTEM_MQ_PRIO_MAX 32768 -#define SYSTEM_SEM_NSEMS_MAX 256 -#define SYSTEM_SIGQUEUE_MAX 32 -#define SYSTEM_TIMER_MAX 32 -#define SYSTEM_LOGIN_NAME_MAX 256 -#define SYSTEM_TTY_NAME_MAX 32 - -/* the following depends on our implementation */ -#define SYSTEM_ATEXIT_MAX 65536 /* our implementation is unlimited */ -#define SYSTEM_THREAD_THREADS_MAX 2048 /* really unlimited */ - -#define SYSTEM_2_C_BIND _POSIX_VERSION /* Posix C binding version */ -#define SYSTEM_2_C_VER _POSIX2_C_VERSION -#define SYSTEM_2_C_DEV -1 /* Posix C development tools unsupported on the device */ -#define SYSTEM_2_FORT_DEV -1 /* Fortran development unsupported */ -#define SYSTEM_2_FORT_RUN -1 /* Fortran runtime unsupported */ -#define SYSTEM_2_SW_DEV -1 /* posix software dev utilities unsupported */ -#define SYSTEM_2_LOCALEDEF -1 /* localedef() unimplemented */ -#define SYSTEM_2_UPE -1 /* No UPE for you ! (User Portability Utilities) */ -#define SYSTEM_2_VERSION -1 /* No posix command-line tools */ - static int __sysconf_monotonic_clock() { timespec t; int rc = clock_getres(CLOCK_MONOTONIC, &t); @@ -73,103 +48,135 @@ static int __sysconf_monotonic_clock() { long sysconf(int name) { switch (name) { - case _SC_ARG_MAX: return _POSIX_ARG_MAX; + case _SC_ARG_MAX: return ARG_MAX; + case _SC_BC_BASE_MAX: return _POSIX2_BC_BASE_MAX; // Minimum requirement. + case _SC_BC_DIM_MAX: return _POSIX2_BC_DIM_MAX; // Minimum requirement. + case _SC_BC_SCALE_MAX: return _POSIX2_BC_SCALE_MAX; // Minimum requirement. + case _SC_BC_STRING_MAX: return _POSIX2_BC_STRING_MAX; // Minimum requirement. case _SC_CHILD_MAX: return CHILD_MAX; - case _SC_CLK_TCK: return SYSTEM_CLK_TCK; - case _SC_LINE_MAX: return _POSIX2_LINE_MAX; + case _SC_CLK_TCK: return static_cast<long>(getauxval(AT_CLKTCK)); + case _SC_COLL_WEIGHTS_MAX: return _POSIX2_COLL_WEIGHTS_MAX; // Minimum requirement. + case _SC_EXPR_NEST_MAX: return _POSIX2_EXPR_NEST_MAX; // Minimum requirement. + case _SC_LINE_MAX: return _POSIX2_LINE_MAX; // Minimum requirement. case _SC_NGROUPS_MAX: return NGROUPS_MAX; case _SC_OPEN_MAX: return OPEN_MAX; case _SC_PASS_MAX: return PASS_MAX; - case _SC_2_C_BIND: return SYSTEM_2_C_BIND; - case _SC_2_C_DEV: return SYSTEM_2_C_DEV; - case _SC_2_C_VERSION: return SYSTEM_2_C_VER; - //case _SC_2_CHAR_TERM: return ; - case _SC_2_FORT_DEV: return SYSTEM_2_FORT_DEV; - case _SC_2_FORT_RUN: return SYSTEM_2_FORT_RUN; - case _SC_2_LOCALEDEF: return SYSTEM_2_LOCALEDEF; - case _SC_2_SW_DEV: return SYSTEM_2_SW_DEV; - case _SC_2_UPE: return SYSTEM_2_UPE; - case _SC_2_VERSION: return SYSTEM_2_VERSION; + case _SC_2_C_BIND: return _POSIX2_C_BIND; + case _SC_2_C_DEV: return _POSIX2_C_DEV; + case _SC_2_CHAR_TERM: return _POSIX2_CHAR_TERM; + case _SC_2_FORT_DEV: return -1; + case _SC_2_FORT_RUN: return -1; + case _SC_2_LOCALEDEF: return _POSIX2_LOCALEDEF; + case _SC_2_SW_DEV: return _POSIX2_SW_DEV; + case _SC_2_UPE: return _POSIX2_UPE; + case _SC_2_VERSION: return _POSIX2_VERSION; case _SC_JOB_CONTROL: return _POSIX_JOB_CONTROL; case _SC_SAVED_IDS: return _POSIX_SAVED_IDS; case _SC_VERSION: return _POSIX_VERSION; - case _SC_RE_DUP_MAX: return _POSIX_RE_DUP_MAX; + case _SC_RE_DUP_MAX: return _POSIX_RE_DUP_MAX; // Minimum requirement. case _SC_STREAM_MAX: return FOPEN_MAX; - case _SC_TZNAME_MAX: return _POSIX_TZNAME_MAX; + case _SC_TZNAME_MAX: return _POSIX_TZNAME_MAX; // Minimum requirement. case _SC_XOPEN_CRYPT: return _XOPEN_CRYPT; case _SC_XOPEN_ENH_I18N: return _XOPEN_ENH_I18N; - //case _SC_XOPEN_SHM: return _XOPEN_SHM; + case _SC_XOPEN_SHM: return _XOPEN_SHM; case _SC_XOPEN_VERSION: return _XOPEN_VERSION; - case _SC_XOPEN_XCU_VERSION: return _XOPEN_XCU_VERSION; case _SC_XOPEN_REALTIME: return _XOPEN_REALTIME; case _SC_XOPEN_REALTIME_THREADS: return _XOPEN_REALTIME_THREADS; case _SC_XOPEN_LEGACY: return _XOPEN_LEGACY; - case _SC_ATEXIT_MAX: return SYSTEM_ATEXIT_MAX; - case _SC_IOV_MAX: return SYSTEM_IOV_MAX; - - case _SC_PAGESIZE: - case _SC_PAGE_SIZE: - return PAGE_SIZE; + case _SC_ATEXIT_MAX: return LONG_MAX; // Unlimited. + case _SC_IOV_MAX: return UIO_MAXIOV; + case _SC_PAGESIZE: // Fall through, PAGESIZE and PAGE_SIZE always hold the same value. + case _SC_PAGE_SIZE: return PAGE_SIZE; case _SC_XOPEN_UNIX: return _XOPEN_UNIX; - - // XXX: TODO: XBS5 nonsense - - //case _SC_AIO_LISTIO_MAX: return AIO_LISTIO_MAX; - //case _SC_AIO_MAX: return AIO_MAX; - //case _SC_AIO_PRIO_DELTA_MAX: return AIO_PRIO_DELTA_MAX; - case _SC_DELAYTIMER_MAX: return SYSTEM_DELAYTIMER_MAX; - case _SC_MQ_OPEN_MAX: return SYSTEM_MQ_OPEN_MAX; - case _SC_MQ_PRIO_MAX: return SYSTEM_MQ_PRIO_MAX; + case _SC_AIO_LISTIO_MAX: return _POSIX_AIO_LISTIO_MAX; // Minimum requirement. + case _SC_AIO_MAX: return _POSIX_AIO_MAX; // Minimum requirement. + case _SC_AIO_PRIO_DELTA_MAX:return 0; // Minimum requirement. + case _SC_DELAYTIMER_MAX: return INT_MAX; + case _SC_MQ_OPEN_MAX: return _POSIX_MQ_OPEN_MAX; // Minimum requirement. + case _SC_MQ_PRIO_MAX: return _POSIX_MQ_PRIO_MAX; // Minimum requirement. case _SC_RTSIG_MAX: return RTSIG_MAX; - case _SC_SEM_NSEMS_MAX: return SYSTEM_SEM_NSEMS_MAX; + case _SC_SEM_NSEMS_MAX: return _POSIX_SEM_NSEMS_MAX; // Minimum requirement. case _SC_SEM_VALUE_MAX: return SEM_VALUE_MAX; - case _SC_SIGQUEUE_MAX: return SYSTEM_SIGQUEUE_MAX; - case _SC_TIMER_MAX: return SYSTEM_TIMER_MAX; - //case _SC_ASYNCHRONOUS_IO: return _POSIX_ASYNCHRONOUS_IO; + case _SC_SIGQUEUE_MAX: return _POSIX_SIGQUEUE_MAX; // Minimum requirement. + case _SC_TIMER_MAX: return _POSIX_TIMER_MAX; // Minimum requirement. + case _SC_ASYNCHRONOUS_IO: return _POSIX_ASYNCHRONOUS_IO; case _SC_FSYNC: return _POSIX_FSYNC; case _SC_MAPPED_FILES: return _POSIX_MAPPED_FILES; - //case _SC_MEMLOCK: return _POSIX_MEMLOCK; - //case _SC_MEMLOCK_RANGE: return _POSIX_MEMLOCK_RANGE; - //case _SC_MEMORY_PROTECTION: return _POSIX_MEMORY_PROTECTION; - //case _SC_MESSAGE_PASSING: return _POSIX_MESSAGE_PASSING; - //case _SC_PRIORITIZED_IO: return _POSIX_PRIORITIZED_IO; + case _SC_MEMLOCK: return _POSIX_MEMLOCK; + case _SC_MEMLOCK_RANGE: return _POSIX_MEMLOCK_RANGE; + case _SC_MEMORY_PROTECTION: return _POSIX_MEMORY_PROTECTION; + case _SC_MESSAGE_PASSING: return _POSIX_MESSAGE_PASSING; + case _SC_PRIORITIZED_IO: return _POSIX_PRIORITIZED_IO; case _SC_PRIORITY_SCHEDULING: return _POSIX_PRIORITY_SCHEDULING; case _SC_REALTIME_SIGNALS: return _POSIX_REALTIME_SIGNALS; case _SC_SEMAPHORES: return _POSIX_SEMAPHORES; - //case _SC_SHARED_MEMORY_OBJECTS: return _POSIX_SHARED_MEMORY_OBJECTS; + case _SC_SHARED_MEMORY_OBJECTS: return _POSIX_SHARED_MEMORY_OBJECTS; case _SC_SYNCHRONIZED_IO: return _POSIX_SYNCHRONIZED_IO; case _SC_TIMERS: return _POSIX_TIMERS; - - case _SC_GETGR_R_SIZE_MAX: return 1024; - case _SC_GETPW_R_SIZE_MAX: return 1024; - - case _SC_LOGIN_NAME_MAX: return SYSTEM_LOGIN_NAME_MAX; - - case _SC_THREAD_DESTRUCTOR_ITERATIONS: - return _POSIX_THREAD_DESTRUCTOR_ITERATIONS; - - case _SC_THREAD_KEYS_MAX: - return (BIONIC_TLS_SLOTS - TLS_SLOT_FIRST_USER_SLOT - BIONIC_TLS_RESERVED_SLOTS); - + case _SC_GETGR_R_SIZE_MAX: return 1024; + case _SC_GETPW_R_SIZE_MAX: return 1024; + case _SC_LOGIN_NAME_MAX: return 256; // Seems default on linux. + case _SC_THREAD_DESTRUCTOR_ITERATIONS: return PTHREAD_DESTRUCTOR_ITERATIONS; + case _SC_THREAD_KEYS_MAX: return PTHREAD_KEYS_MAX; case _SC_THREAD_STACK_MIN: return PTHREAD_STACK_MIN; - case _SC_THREAD_THREADS_MAX: return SYSTEM_THREAD_THREADS_MAX; - case _SC_TTY_NAME_MAX: return SYSTEM_TTY_NAME_MAX; + case _SC_THREAD_THREADS_MAX: return PTHREAD_THREADS_MAX; + case _SC_TTY_NAME_MAX: return 32; // Seems default on linux. case _SC_THREADS: return _POSIX_THREADS; - - case _SC_THREAD_ATTR_STACKADDR: return -1; // Removed in POSIX 2008 - case _SC_THREAD_ATTR_STACKSIZE: return -1; // Removed in POSIX 2008 - - //case _SC_THREAD_PRIORITY_SCHEDULING: return _POSIX_THREAD_PRIORITY_SCHEDULING; - case _SC_THREAD_PRIO_INHERIT: return _POSIX_THREAD_PRIO_INHERIT; + case _SC_THREAD_ATTR_STACKADDR: return _POSIX_THREAD_ATTR_STACKADDR; + case _SC_THREAD_ATTR_STACKSIZE: return _POSIX_THREAD_ATTR_STACKSIZE; + case _SC_THREAD_PRIORITY_SCHEDULING: return _POSIX_THREAD_PRIORITY_SCHEDULING; + case _SC_THREAD_PRIO_INHERIT: return _POSIX_THREAD_PRIO_INHERIT; case _SC_THREAD_PRIO_PROTECT: return _POSIX_THREAD_PRIO_PROTECT; - //case _SC_THREAD_SAFE_FUNCTIONS: return _POSIX_THREAD_SAFE_FUNCTIONS - - case _SC_MONOTONIC_CLOCK: return __sysconf_monotonic_clock(); + case _SC_THREAD_SAFE_FUNCTIONS: return _POSIX_THREAD_SAFE_FUNCTIONS; case _SC_NPROCESSORS_CONF: return get_nprocs_conf(); case _SC_NPROCESSORS_ONLN: return get_nprocs(); case _SC_PHYS_PAGES: return get_phys_pages(); case _SC_AVPHYS_PAGES: return get_avphys_pages(); + case _SC_MONOTONIC_CLOCK: return __sysconf_monotonic_clock(); + + case _SC_2_PBS: return -1; // Obsolescent in POSIX.1-2008. + case _SC_2_PBS_ACCOUNTING: return -1; // Obsolescent in POSIX.1-2008. + case _SC_2_PBS_CHECKPOINT: return -1; // Obsolescent in POSIX.1-2008. + case _SC_2_PBS_LOCATE: return -1; // Obsolescent in POSIX.1-2008. + case _SC_2_PBS_MESSAGE: return -1; // Obsolescent in POSIX.1-2008. + case _SC_2_PBS_TRACK: return -1; // Obsolescent in POSIX.1-2008. + case _SC_ADVISORY_INFO: return _POSIX_ADVISORY_INFO; + case _SC_BARRIERS: return _POSIX_BARRIERS; + case _SC_CLOCK_SELECTION: return _POSIX_CLOCK_SELECTION; + case _SC_CPUTIME: return _POSIX_CPUTIME; + case _SC_HOST_NAME_MAX: return _POSIX_HOST_NAME_MAX; // Minimum requirement. + case _SC_IPV6: return _POSIX_IPV6; + case _SC_RAW_SOCKETS: return _POSIX_RAW_SOCKETS; + case _SC_READER_WRITER_LOCKS: return _POSIX_READER_WRITER_LOCKS; + case _SC_REGEXP: return _POSIX_REGEXP; + case _SC_SHELL: return _POSIX_SHELL; + case _SC_SPAWN: return _POSIX_SPAWN; + case _SC_SPIN_LOCKS: return _POSIX_SPIN_LOCKS; + case _SC_SPORADIC_SERVER: return _POSIX_SPORADIC_SERVER; + case _SC_SS_REPL_MAX: return -1; + case _SC_SYMLOOP_MAX: return _POSIX_SYMLOOP_MAX; // Minimum requirement. + case _SC_THREAD_CPUTIME: return _POSIX_THREAD_CPUTIME; + case _SC_THREAD_PROCESS_SHARED: return _POSIX_THREAD_PROCESS_SHARED; + case _SC_THREAD_ROBUST_PRIO_INHERIT: return _POSIX_THREAD_ROBUST_PRIO_INHERIT; + case _SC_THREAD_ROBUST_PRIO_PROTECT: return _POSIX_THREAD_ROBUST_PRIO_PROTECT; + case _SC_THREAD_SPORADIC_SERVER: return _POSIX_THREAD_SPORADIC_SERVER; + case _SC_TIMEOUTS: return _POSIX_TIMEOUTS; + case _SC_TRACE: return -1; // Obsolescent in POSIX.1-2008. + case _SC_TRACE_EVENT_FILTER: return -1; // Obsolescent in POSIX.1-2008. + case _SC_TRACE_EVENT_NAME_MAX: return -1; + case _SC_TRACE_INHERIT: return -1; // Obsolescent in POSIX.1-2008. + case _SC_TRACE_LOG: return -1; // Obsolescent in POSIX.1-2008. + case _SC_TRACE_NAME_MAX: return -1; + case _SC_TRACE_SYS_MAX: return -1; + case _SC_TRACE_USER_EVENT_MAX: return -1; + case _SC_TYPED_MEMORY_OBJECTS: return _POSIX_TYPED_MEMORY_OBJECTS; + case _SC_V7_ILP32_OFF32: return _POSIX_V7_ILP32_OFF32; + case _SC_V7_ILP32_OFFBIG: return _POSIX_V7_ILP32_OFFBIG; + case _SC_V7_LP64_OFF64: return _POSIX_V7_LP64_OFF64; + case _SC_V7_LPBIG_OFFBIG: return _POSIX_V7_LPBIG_OFFBIG; + case _SC_XOPEN_STREAMS: return -1; // Obsolescent in POSIX.1-2008. + case _SC_XOPEN_UUCP: return -1; default: // Posix says EINVAL is the only error that shall be returned, |