2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A
2N/A/*
2N/A * Copyright (c) 1989, 2011, Oracle and/or its affiliates. All rights reserved.
2N/A */
2N/A
2N/A/* Copyright (c) 1988 AT&T */
2N/A/* All Rights Reserved */
2N/A
2N/A/* sysconf(3C) - returns system configuration information */
2N/A
2N/A#pragma weak _sysconf = sysconf
2N/A
2N/A#include "lint.h"
2N/A#include <mtlib.h>
2N/A#include <sys/types.h>
2N/A#include <unistd.h>
2N/A#include <sys/sysconfig.h>
2N/A#include <limits.h>
2N/A#include <time.h>
2N/A#include <errno.h>
2N/A#include <nss_dbdefs.h>
2N/A#include <thread.h>
2N/A#include <xti.h>
2N/A#include "libc.h"
2N/A#include "xpg6.h"
2N/A
2N/A/* from nss_common.c */
2N/Aextern size_t _nss_get_bufsizes(int);
2N/A
2N/Along
2N/Asysconf(int name)
2N/A{
2N/A static int _pagesize = 0;
2N/A static int _hz = 0;
2N/A static pid_t _maxpid = 0;
2N/A static int _stackprot = 0;
2N/A static int _ngroups_max;
2N/A extern int __xpg4;
2N/A
2N/A switch (name) {
2N/A default:
2N/A errno = EINVAL;
2N/A return (-1L);
2N/A
2N/A case _SC_ARG_MAX:
2N/A return ((long)ARG_MAX);
2N/A
2N/A case _SC_CLK_TCK:
2N/A if (_hz <= 0)
2N/A _hz = _sysconfig(_CONFIG_CLK_TCK);
2N/A return (_hz);
2N/A
2N/A case _SC_JOB_CONTROL:
2N/A return ((long)_POSIX_JOB_CONTROL);
2N/A
2N/A case _SC_SAVED_IDS:
2N/A return ((long)_POSIX_SAVED_IDS);
2N/A
2N/A case _SC_CHILD_MAX:
2N/A return (_sysconfig(_CONFIG_CHILD_MAX));
2N/A
2N/A case _SC_NGROUPS_MAX:
2N/A if (_ngroups_max <= 0)
2N/A _ngroups_max = _sysconfig(_CONFIG_NGROUPS);
2N/A return (_ngroups_max);
2N/A
2N/A case _SC_OPEN_MAX:
2N/A return (_sysconfig(_CONFIG_OPEN_FILES));
2N/A
2N/A case _SC_VERSION:
2N/A if (__xpg6 & _C99SUSv3_XPG6_sysconf_version)
2N/A return (200112L);
2N/A else
2N/A return (199506L);
2N/A
2N/A case _SC_PAGESIZE:
2N/A if (_pagesize <= 0)
2N/A _pagesize = _sysconfig(_CONFIG_PAGESIZE);
2N/A return (_pagesize);
2N/A
2N/A case _SC_XOPEN_VERSION:
2N/A if (__xpg6 & _C99SUSv3_XPG6_sysconf_version)
2N/A return (600L);
2N/A else if (__xpg4 == 0)
2N/A return (_sysconfig(_CONFIG_XOPEN_VER));
2N/A else
2N/A return (4L);
2N/A
2N/A case _SC_XOPEN_XCU_VERSION:
2N/A if (__xpg6 & _C99SUSv3_XPG6_sysconf_version)
2N/A return (600L);
2N/A else
2N/A return (4L);
2N/A
2N/A /*
2N/A * old value for pre XPG5 conformant systems to match
2N/A * getpass() length.
2N/A * XPG5 special cased with __sysconf_xpg5()
2N/A * new value for default and modern XPG systems.
2N/A */
2N/A case _SC_PASS_MAX:
2N/A if ((__xpg4 == 1) &&
2N/A (!(__xpg6 & _C99SUSv3_XPG6_sysconf_version)))
2N/A return ((long)_PASS_MAX_XPG);
2N/A else
2N/A return ((long)_PASS_MAX);
2N/A
2N/A case _SC_LOGNAME_MAX:
2N/A return ((long)LOGNAME_MAX);
2N/A
2N/A case _SC_STREAM_MAX:
2N/A return (-1L);
2N/A
2N/A case _SC_TZNAME_MAX:
2N/A return (-1L);
2N/A
2N/A case _SC_NPROCESSORS_CONF:
2N/A return (_sysconfig(_CONFIG_NPROC_CONF));
2N/A
2N/A case _SC_NPROCESSORS_ONLN:
2N/A return (_sysconfig(_CONFIG_NPROC_ONLN));
2N/A
2N/A case _SC_NPROCESSORS_MAX:
2N/A return (_sysconfig(_CONFIG_NPROC_MAX));
2N/A
2N/A case _SC_STACK_PROT:
2N/A if (_stackprot == 0)
2N/A _stackprot = _sysconfig(_CONFIG_STACK_PROT);
2N/A return (_stackprot);
2N/A
2N/A /* POSIX.4 names */
2N/A
2N/A /*
2N/A * Each of the following also have _POSIX_* symbols
2N/A * defined in <unistd.h>. Values here should align
2N/A * with values in the header. Up until the SUSv3 standard
2N/A * we defined these simply as 1. With the introduction
2N/A * of the new revision, these were changed to 200112L.
2N/A * The standard allows us to change the value, however,
2N/A * we have kept both values in case application programs
2N/A * are relying on the previous value even though an
2N/A * application doing so is technically wrong.
2N/A */
2N/A case _SC_ASYNCHRONOUS_IO:
2N/A case _SC_FSYNC:
2N/A case _SC_MAPPED_FILES:
2N/A case _SC_MEMLOCK:
2N/A case _SC_MEMLOCK_RANGE:
2N/A case _SC_MEMORY_PROTECTION:
2N/A case _SC_MESSAGE_PASSING:
2N/A case _SC_PRIORITY_SCHEDULING:
2N/A case _SC_REALTIME_SIGNALS:
2N/A case _SC_SEMAPHORES:
2N/A case _SC_SHARED_MEMORY_OBJECTS:
2N/A case _SC_SYNCHRONIZED_IO:
2N/A case _SC_TIMERS:
2N/A if (__xpg6 & _C99SUSv3_mode_ON)
2N/A return (200112L);
2N/A else
2N/A return (1L);
2N/A
2N/A case _SC_PRIORITIZED_IO:
2N/A#ifdef _POSIX_PRIORITIZED_IO
2N/A return (1L);
2N/A#else
2N/A return (-1L);
2N/A#endif
2N/A
2N/A case _SC_AIO_LISTIO_MAX:
2N/A return (_sysconfig(_CONFIG_AIO_LISTIO_MAX));
2N/A
2N/A case _SC_AIO_MAX:
2N/A return (_sysconfig(_CONFIG_AIO_MAX));
2N/A
2N/A case _SC_AIO_PRIO_DELTA_MAX:
2N/A return (_sysconfig(_CONFIG_AIO_PRIO_DELTA_MAX));
2N/A
2N/A case _SC_DELAYTIMER_MAX:
2N/A return (_sysconfig(_CONFIG_DELAYTIMER_MAX));
2N/A
2N/A case _SC_MQ_OPEN_MAX:
2N/A return (_sysconfig(_CONFIG_MQ_OPEN_MAX));
2N/A
2N/A case _SC_MQ_PRIO_MAX:
2N/A return (_sysconfig(_CONFIG_MQ_PRIO_MAX));
2N/A
2N/A case _SC_RTSIG_MAX:
2N/A return (_sysconfig(_CONFIG_RTSIG_MAX));
2N/A
2N/A case _SC_SEM_NSEMS_MAX:
2N/A return (_sysconfig(_CONFIG_SEM_NSEMS_MAX));
2N/A
2N/A case _SC_SEM_VALUE_MAX:
2N/A return (_sysconfig(_CONFIG_SEM_VALUE_MAX));
2N/A
2N/A case _SC_SIGQUEUE_MAX:
2N/A return (_sysconfig(_CONFIG_SIGQUEUE_MAX));
2N/A
2N/A case _SC_SIGRT_MAX:
2N/A return (_sysconfig(_CONFIG_SIGRT_MAX));
2N/A
2N/A case _SC_SIGRT_MIN:
2N/A return (_sysconfig(_CONFIG_SIGRT_MIN));
2N/A
2N/A case _SC_TIMER_MAX:
2N/A return (_sysconfig(_CONFIG_TIMER_MAX));
2N/A
2N/A case _SC_PHYS_PAGES:
2N/A return (_sysconfig(_CONFIG_PHYS_PAGES));
2N/A
2N/A case _SC_AVPHYS_PAGES:
2N/A return (_sysconfig(_CONFIG_AVPHYS_PAGES));
2N/A
2N/A /* XPG4/POSIX.1-1990/POSIX.2-1992 names */
2N/A case _SC_2_C_BIND:
2N/A if (__xpg6 & _C99SUSv3_XPG6_sysconf_version)
2N/A return (200112L);
2N/A else
2N/A return (1L);
2N/A
2N/A case _SC_2_CHAR_TERM:
2N/A return ((long)_POSIX2_CHAR_TERM);
2N/A
2N/A case _SC_2_C_DEV:
2N/A if (__xpg6 & _C99SUSv3_XPG6_sysconf_version)
2N/A return (200112L);
2N/A else
2N/A return (1L);
2N/A
2N/A case _SC_2_C_VERSION:
2N/A if (__xpg6 & _C99SUSv3_XPG6_sysconf_version)
2N/A return (200112L);
2N/A else
2N/A return (199209L);
2N/A
2N/A case _SC_2_FORT_DEV:
2N/A return (-1L);
2N/A
2N/A case _SC_2_FORT_RUN:
2N/A if (__xpg6 & _C99SUSv3_XPG6_sysconf_version)
2N/A return (200112L);
2N/A else
2N/A return (1L);
2N/A
2N/A case _SC_2_LOCALEDEF:
2N/A if (__xpg6 & _C99SUSv3_XPG6_sysconf_version)
2N/A return (200112L);
2N/A else
2N/A return (1L);
2N/A
2N/A case _SC_2_SW_DEV:
2N/A if (__xpg6 & _C99SUSv3_XPG6_sysconf_version)
2N/A return (200112L);
2N/A else
2N/A return (1L);
2N/A
2N/A case _SC_2_UPE:
2N/A if (__xpg6 & _C99SUSv3_XPG6_sysconf_version)
2N/A return (200112L);
2N/A else
2N/A return (1L);
2N/A
2N/A case _SC_2_VERSION:
2N/A if (__xpg6 & _C99SUSv3_XPG6_sysconf_version)
2N/A return (200112L);
2N/A else
2N/A return (199209L);
2N/A
2N/A case _SC_BC_BASE_MAX:
2N/A return ((long)BC_BASE_MAX);
2N/A
2N/A case _SC_BC_DIM_MAX:
2N/A return ((long)BC_DIM_MAX);
2N/A
2N/A case _SC_BC_SCALE_MAX:
2N/A return ((long)BC_SCALE_MAX);
2N/A
2N/A case _SC_BC_STRING_MAX:
2N/A return ((long)BC_STRING_MAX);
2N/A
2N/A case _SC_COLL_WEIGHTS_MAX:
2N/A return ((long)COLL_WEIGHTS_MAX);
2N/A
2N/A case _SC_EXPR_NEST_MAX:
2N/A return ((long)EXPR_NEST_MAX);
2N/A
2N/A case _SC_LINE_MAX:
2N/A return ((long)LINE_MAX);
2N/A
2N/A case _SC_RE_DUP_MAX:
2N/A return ((long)RE_DUP_MAX);
2N/A
2N/A case _SC_XOPEN_CRYPT:
2N/A return (1L);
2N/A
2N/A case _SC_XOPEN_ENH_I18N:
2N/A return ((long)_XOPEN_ENH_I18N);
2N/A
2N/A case _SC_XOPEN_SHM:
2N/A return ((long)_XOPEN_SHM);
2N/A
2N/A /* XPG4v2 (SUS) names */
2N/A case _SC_XOPEN_UNIX:
2N/A return (1L);
2N/A
2N/A case _SC_XOPEN_LEGACY:
2N/A return (1L);
2N/A
2N/A case _SC_ATEXIT_MAX:
2N/A return (-1L);
2N/A
2N/A case _SC_IOV_MAX:
2N/A return ((long)IOV_MAX);
2N/A
2N/A case _SC_T_IOV_MAX:
2N/A return ((long)T_IOV_MAX);
2N/A
2N/A /* XPG5 (SUSv2) names */
2N/A case _SC_XOPEN_REALTIME:
2N/A return (1L);
2N/A
2N/A case _SC_XOPEN_REALTIME_THREADS:
2N/A#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && \
2N/A defined(_POSIX_THREAD_PRIO_INHERIT) && \
2N/A defined(_POSIX_THREAD_PRIO_PROTECT)
2N/A return (1L);
2N/A#else
2N/A return (-1L);
2N/A#endif
2N/A
2N/A case _SC_XBS5_ILP32_OFF32:
2N/A return (1L);
2N/A
2N/A case _SC_XBS5_ILP32_OFFBIG:
2N/A return (1L);
2N/A
2N/A case _SC_XBS5_LP64_OFF64:
2N/A return (1L);
2N/A
2N/A case _SC_XBS5_LPBIG_OFFBIG:
2N/A return (1L);
2N/A
2N/A /* POSIX.1c names */
2N/A case _SC_THREAD_DESTRUCTOR_ITERATIONS:
2N/A return (-1L);
2N/A
2N/A case _SC_GETGR_R_SIZE_MAX:
2N/A return ((long)_nss_get_bufsizes(_SC_GETGR_R_SIZE_MAX));
2N/A
2N/A case _SC_GETPW_R_SIZE_MAX:
2N/A return ((long)NSS_BUFLEN_PASSWD);
2N/A
2N/A case _SC_LOGIN_NAME_MAX:
2N/A return ((long)(LOGNAME_MAX + 1));
2N/A
2N/A case _SC_THREAD_KEYS_MAX:
2N/A return (-1L);
2N/A
2N/A case _SC_THREAD_STACK_MIN:
2N/A return ((long)thr_min_stack());
2N/A
2N/A case _SC_THREAD_THREADS_MAX:
2N/A return (-1L);
2N/A
2N/A case _SC_TTY_NAME_MAX:
2N/A return ((long)TTYNAME_MAX);
2N/A
2N/A case _SC_BARRIERS:
2N/A return ((long)_POSIX_BARRIERS);
2N/A
2N/A case _SC_CLOCK_SELECTION:
2N/A return ((long)_POSIX_CLOCK_SELECTION);
2N/A
2N/A case _SC_MONOTONIC_CLOCK:
2N/A return ((long)_POSIX_MONOTONIC_CLOCK);
2N/A
2N/A case _SC_SPAWN:
2N/A return ((long)_POSIX_SPAWN);
2N/A
2N/A case _SC_SPIN_LOCKS:
2N/A return ((long)_POSIX_SPIN_LOCKS);
2N/A
2N/A case _SC_THREADS:
2N/A case _SC_THREAD_ATTR_STACKADDR:
2N/A case _SC_THREAD_ATTR_STACKSIZE:
2N/A case _SC_THREAD_PRIORITY_SCHEDULING:
2N/A case _SC_THREAD_PRIO_INHERIT:
2N/A case _SC_THREAD_PRIO_PROTECT:
2N/A case _SC_THREAD_PROCESS_SHARED:
2N/A case _SC_THREAD_SAFE_FUNCTIONS:
2N/A if (__xpg6 & _C99SUSv3_mode_ON)
2N/A return (200112L);
2N/A else
2N/A return (1L);
2N/A
2N/A case _SC_TIMEOUTS:
2N/A return ((long)_POSIX_TIMEOUTS);
2N/A
2N/A /* 1216676 - cache info */
2N/A case _SC_COHER_BLKSZ:
2N/A return (_sysconfig(_CONFIG_COHERENCY));
2N/A
2N/A case _SC_SPLIT_CACHE:
2N/A return (_sysconfig(_CONFIG_SPLIT_CACHE));
2N/A
2N/A case _SC_ICACHE_SZ:
2N/A return (_sysconfig(_CONFIG_ICACHESZ));
2N/A
2N/A case _SC_DCACHE_SZ:
2N/A return (_sysconfig(_CONFIG_DCACHESZ));
2N/A
2N/A case _SC_ICACHE_LINESZ:
2N/A return (_sysconfig(_CONFIG_ICACHELINESZ));
2N/A
2N/A case _SC_DCACHE_LINESZ:
2N/A return (_sysconfig(_CONFIG_DCACHELINESZ));
2N/A
2N/A case _SC_ICACHE_BLKSZ:
2N/A return (_sysconfig(_CONFIG_ICACHEBLKSZ));
2N/A
2N/A case _SC_DCACHE_BLKSZ:
2N/A return (_sysconfig(_CONFIG_DCACHEBLKSZ));
2N/A
2N/A case _SC_DCACHE_TBLKSZ:
2N/A return (_sysconfig(_CONFIG_DCACHETBLKSZ));
2N/A
2N/A case _SC_ICACHE_ASSOC:
2N/A return (_sysconfig(_CONFIG_ICACHE_ASSOC));
2N/A
2N/A case _SC_DCACHE_ASSOC:
2N/A return (_sysconfig(_CONFIG_DCACHE_ASSOC));
2N/A
2N/A case _SC_MAXPID:
2N/A if (_maxpid <= 0)
2N/A _maxpid = _sysconfig(_CONFIG_MAXPID);
2N/A return (_maxpid);
2N/A
2N/A case _SC_CPUID_MAX:
2N/A return (_sysconfig(_CONFIG_CPUID_MAX));
2N/A
2N/A case _SC_EPHID_MAX:
2N/A return (_sysconfig(_CONFIG_EPHID_MAX));
2N/A
2N/A /* UNIX 03 names - XPG6/SUSv3/POSIX.1-2001 */
2N/A
2N/A case _SC_REGEXP:
2N/A return ((long)_POSIX_REGEXP);
2N/A
2N/A case _SC_SHELL:
2N/A return ((long)_POSIX_SHELL);
2N/A
2N/A case _SC_ADVISORY_INFO:
2N/A return ((long)_POSIX_ADVISORY_INFO);
2N/A
2N/A case _SC_HOST_NAME_MAX:
2N/A return ((long)_POSIX_HOST_NAME_MAX);
2N/A
2N/A case _SC_READER_WRITER_LOCKS:
2N/A return ((long)_POSIX_READER_WRITER_LOCKS);
2N/A
2N/A case _SC_IPV6:
2N/A return ((long)_POSIX_IPV6);
2N/A
2N/A case _SC_RAW_SOCKETS:
2N/A return ((long)_POSIX_RAW_SOCKETS);
2N/A
2N/A case _SC_XOPEN_STREAMS:
2N/A return ((long)_XOPEN_STREAMS);
2N/A
2N/A case _SC_SYMLOOP_MAX:
2N/A return (_sysconfig(_CONFIG_SYMLOOP_MAX));
2N/A
2N/A case _SC_V6_ILP32_OFF32:
2N/A return (1L);
2N/A
2N/A case _SC_V6_ILP32_OFFBIG:
2N/A return (1L);
2N/A
2N/A case _SC_V6_LP64_OFF64:
2N/A return (1L);
2N/A
2N/A case _SC_V6_LPBIG_OFFBIG:
2N/A return (1L);
2N/A
2N/A case _SC_OSM_PAGESIZE_MIN:
2N/A return (_sysconfig(_CONFIG_OSM_PGSZ_MIN));
2N/A
2N/A /* Unsupported UNIX 03 options */
2N/A case _SC_2_PBS:
2N/A case _SC_2_PBS_ACCOUNTING:
2N/A case _SC_2_PBS_CHECKPOINT:
2N/A case _SC_2_PBS_LOCATE:
2N/A case _SC_2_PBS_MESSAGE:
2N/A case _SC_2_PBS_TRACK:
2N/A case _SC_CPUTIME:
2N/A case _SC_SPORADIC_SERVER:
2N/A case _SC_SS_REPL_MAX:
2N/A case _SC_THREAD_CPUTIME:
2N/A case _SC_THREAD_SPORADIC_SERVER:
2N/A case _SC_TRACE:
2N/A case _SC_TRACE_EVENT_FILTER:
2N/A case _SC_TRACE_EVENT_NAME_MAX:
2N/A case _SC_TRACE_INHERIT:
2N/A case _SC_TRACE_LOG:
2N/A case _SC_TRACE_NAME_MAX:
2N/A case _SC_TRACE_SYS_MAX:
2N/A case _SC_TRACE_USER_EVENT_MAX:
2N/A case _SC_TYPED_MEMORY_OBJECTS:
2N/A return (-1L);
2N/A }
2N/A}
2N/A
2N/A/*
2N/A * UNIX 98 version of sysconf needed in order to set _XOPEN_VERSION to 500.
2N/A */
2N/A
2N/Along
2N/A__sysconf_xpg5(int name)
2N/A{
2N/A switch (name) {
2N/A default:
2N/A return (sysconf(name));
2N/A case _SC_XOPEN_VERSION:
2N/A return (500L);
2N/A case _SC_PASS_MAX:
2N/A return ((long)_PASS_MAX_XPG);
2N/A }
2N/A}