1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060 |
- /* Copyright (C) 1991, 93, 95, 96, 97, 2000 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
- #define _XOPEN_SOURCE 500
- #include <features.h>
- #include <errno.h>
- #include <limits.h>
- #include <grp.h>
- #include <pwd.h>
- #include <stddef.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <unistd.h>
- #include <sys/sysinfo.h>
- #include <sys/types.h>
- #include <regex.h>
- #ifndef SYSTEM_CLK_TCK
- # define SYSTEM_CLK_TCK 100
- #endif
- extern int getpagesize (void);
- extern int getdtablesize (void);
- /***********************************************************************/
- /*
- * Manuel Novoa III Jan 2001
- *
- * On i386, the switch-based implementation generates 796 bytes of code.
- * However, many of the return values are repeats. By collecting these
- * repeats and moving to a table-based implementation, we generate 283
- * bytes on i386 (-Os -fomit-frame-pointer).
- */
- #ifndef _UCLIBC_GENERATE_SYSCONF_MAIN
- #ifdef _UCLIBC_GENERATE_SYSCONF_ARCH
- /*
- * Set some errno's so the auto-gen code knows what it is dealing with.
- * 1) ENOSYS signifies that we're returning a default value.
- * This is just extra info for development.
- * 2) EISNAM signifies that the value returned varies at runtime.
- *
- * Option: GETPAGESIZE_IS_DYNAMIC
- * The current implementation of getpagesize in uClibc returns
- * a constant. The pagesize on the target arch should not vary,
- * so it should be safe to set this as 0.
- */
- #define RETURN_NEG_1 __set_errno(ENOSYS); return -1
- #define RETURN_FUNCTION(f) __set_errno(EISNAM); return (long int) #f
- #define GETPAGESIZE_IS_DYNAMIC 0
- #else
- #define RETURN_NEG_1 return -1
- #define RETURN_FUNCTION(f) return f;
- #endif /* _UCLIBC_GENERATE_SYSCONF_ARCH */
- /* Get the value of the system variable NAME. */
- long int __sysconf(int name)
- {
- switch (name)
- {
- default:
- __set_errno(EINVAL);
- return -1;
- case _SC_ARG_MAX:
- #ifdef ARG_MAX
- return ARG_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_CHILD_MAX:
- #ifdef CHILD_MAX
- return CHILD_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_CLK_TCK:
- /* Can't use CLK_TCK here since that calls __sysconf(_SC_CLK_TCK) */
- return SYSTEM_CLK_TCK;
- case _SC_NGROUPS_MAX:
- #ifdef NGROUPS_MAX
- return NGROUPS_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_OPEN_MAX:
- #if 1
- RETURN_FUNCTION(getdtablesize());
- #else
- RETURN_NEG_1;
- #endif
- case _SC_STREAM_MAX:
- #ifdef STREAM_MAX
- return STREAM_MAX;
- #else
- return FOPEN_MAX;
- #endif
- case _SC_TZNAME_MAX:
- #if 0
- RETURN_FUNCTION(tzname_max ());
- #else
- RETURN_NEG_1;
- #endif
- case _SC_JOB_CONTROL:
- #ifdef _POSIX_JOB_CONTROL
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_SAVED_IDS:
- #ifdef _POSIX_SAVED_IDS
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_REALTIME_SIGNALS:
- #ifdef _POSIX_REALTIME_SIGNALS
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PRIORITY_SCHEDULING:
- #ifdef _POSIX_PRIORITY_SCHEDULING
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_TIMERS:
- #ifdef _POSIX_TIMERS
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_ASYNCHRONOUS_IO:
- #ifdef _POSIX_ASYNCHRONOUS_IO
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PRIORITIZED_IO:
- #ifdef _POSIX_PRIORITIZED_IO
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_SYNCHRONIZED_IO:
- #ifdef _POSIX_SYNCHRONIZED_IO
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_FSYNC:
- #ifdef _POSIX_FSYNC
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_MAPPED_FILES:
- #ifdef _POSIX_MAPPED_FILES
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_MEMLOCK:
- #ifdef _POSIX_MEMLOCK
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_MEMLOCK_RANGE:
- #ifdef _POSIX_MEMLOCK_RANGE
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_MEMORY_PROTECTION:
- #ifdef _POSIX_MEMORY_PROTECTION
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_MESSAGE_PASSING:
- #ifdef _POSIX_MESSAGE_PASSING
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_SEMAPHORES:
- #ifdef _POSIX_SEMAPHORES
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_SHARED_MEMORY_OBJECTS:
- #ifdef _POSIX_SHARED_MEMORY_OBJECTS
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_VERSION:
- return _POSIX_VERSION;
- case _SC_PAGESIZE:
- #if defined(GETPAGESIZE_IS_DYNAMIC) && (GETPAGESIZE_IS_DYNAMIC == 1)
- RETURN_FUNCTION(getpagesize());
- #else
- return getpagesize(); /* note: currently this is not dynamic */
- #endif
- case _SC_AIO_LISTIO_MAX:
- #ifdef AIO_LISTIO_MAX
- return AIO_LISTIO_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_AIO_MAX:
- #ifdef AIO_MAX
- return AIO_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_AIO_PRIO_DELTA_MAX:
- #ifdef AIO_PRIO_DELTA_MAX
- return AIO_PRIO_DELTA_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_DELAYTIMER_MAX:
- #ifdef DELAYTIMER_MAX
- return DELAYTIMER_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_MQ_OPEN_MAX:
- #ifdef MQ_OPEN_MAX
- return MQ_OPEN_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_MQ_PRIO_MAX:
- #ifdef MQ_PRIO_MAX
- return MQ_PRIO_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_RTSIG_MAX:
- #ifdef RTSIG_MAX
- return RTSIG_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_SEM_NSEMS_MAX:
- #ifdef SEM_NSEMS_MAX
- return SEM_NSEMS_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_SEM_VALUE_MAX:
- #ifdef SEM_VALUE_MAX
- return SEM_VALUE_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_SIGQUEUE_MAX:
- #ifdef SIGQUEUE_MAX
- return SIGQUEUE_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_TIMER_MAX:
- #ifdef TIMER_MAX
- return TIMER_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_BC_BASE_MAX:
- #ifdef BC_BASE_MAX
- return BC_BASE_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_BC_DIM_MAX:
- #ifdef BC_DIM_MAX
- return BC_DIM_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_BC_SCALE_MAX:
- #ifdef BC_SCALE_MAX
- return BC_SCALE_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_BC_STRING_MAX:
- #ifdef BC_STRING_MAX
- return BC_STRING_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_COLL_WEIGHTS_MAX:
- #ifdef COLL_WEIGHTS_MAX
- return COLL_WEIGHTS_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_EQUIV_CLASS_MAX:
- #ifdef EQUIV_CLASS_MAX
- return EQUIV_CLASS_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_EXPR_NEST_MAX:
- #ifdef EXPR_NEST_MAX
- return EXPR_NEST_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_LINE_MAX:
- #ifdef LINE_MAX
- return LINE_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_RE_DUP_MAX:
- #ifdef RE_DUP_MAX
- return RE_DUP_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_CHARCLASS_NAME_MAX:
- #ifdef CHARCLASS_NAME_MAX
- return CHARCLASS_NAME_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PII:
- #ifdef _POSIX_PII
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PII_XTI:
- #ifdef _POSIX_PII_XTI
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PII_SOCKET:
- #ifdef _POSIX_PII_SOCKET
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PII_INTERNET:
- #ifdef _POSIX_PII_INTERNET
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PII_OSI:
- #ifdef _POSIX_PII_OSI
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_POLL:
- #ifdef _POSIX_POLL
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_SELECT:
- #ifdef _POSIX_SELECT
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_UIO_MAXIOV:
- #ifdef UIO_MAXIOV
- return UIO_MAXIOV;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PII_INTERNET_STREAM:
- #ifdef _POSIX_PII_INTERNET_STREAM
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PII_INTERNET_DGRAM:
- #ifdef _POSIX_PII_INTERNET_DGRAM
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PII_OSI_COTS:
- #ifdef _POSIX_PII_OSI_COTS
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PII_OSI_CLTS:
- #ifdef _POSIX_PII_OSI_CLTS
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PII_OSI_M:
- #ifdef _POSIX_PII_OSI_M
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_T_IOV_MAX:
- #ifdef _T_IOV_MAX
- return _T_IOV_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_2_VERSION:
- return _POSIX2_VERSION;
- case _SC_2_C_BIND:
- #ifdef _POSIX2_C_BIND
- return _POSIX2_C_BIND;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_2_C_DEV:
- #ifdef _POSIX2_C_DEV
- return _POSIX2_C_DEV;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_2_C_VERSION:
- #ifdef _POSIX2_C_VERSION
- return _POSIX2_C_VERSION;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_2_FORT_DEV:
- #ifdef _POSIX2_FORT_DEV
- return _POSIX2_FORT_DEV;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_2_FORT_RUN:
- #ifdef _POSIX2_FORT_RUN
- return _POSIX2_FORT_RUN;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_2_LOCALEDEF:
- #ifdef _POSIX2_LOCALEDEF
- return _POSIX2_LOCALEDEF;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_2_SW_DEV:
- #ifdef _POSIX2_SW_DEV
- return _POSIX2_SW_DEV;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_2_CHAR_TERM:
- #ifdef _POSIX2_CHAR_TERM
- return _POSIX2_CHAR_TERM;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_2_UPE:
- #ifdef _POSIX2_UPE
- return _POSIX2_UPE;
- #else
- RETURN_NEG_1;
- #endif
- /* POSIX 1003.1c (POSIX Threads). */
- case _SC_THREADS:
- #ifdef _POSIX_THREADS
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_THREAD_SAFE_FUNCTIONS:
- #ifdef _POSIX_THREAD_SAFE_FUNCTIONS
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_GETGR_R_SIZE_MAX:
- #ifdef NSS_BUFLEN_GROUP
- return NSS_BUFLEN_GROUP;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_GETPW_R_SIZE_MAX:
- #ifdef NSS_BUFLEN_PASSWD
- return NSS_BUFLEN_PASSWD;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_LOGIN_NAME_MAX:
- #ifdef _POSIX_LOGIN_NAME_MAX
- return _POSIX_LOGIN_NAME_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_TTY_NAME_MAX:
- #ifdef _POSIX_TTY_NAME_MAX
- return _POSIX_TTY_NAME_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_THREAD_DESTRUCTOR_ITERATIONS:
- #ifdef _POSIX_THREAD_DESTRUCTOR_ITERATIONS
- return _POSIX_THREAD_DESTRUCTOR_ITERATIONS;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_THREAD_KEYS_MAX:
- #ifdef PTHREAD_KEYS_MAX
- return PTHREAD_KEYS_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_THREAD_STACK_MIN:
- #ifdef PTHREAD_STACK_MIN
- return PTHREAD_STACK_MIN;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_THREAD_THREADS_MAX:
- #ifdef PTHREAD_THREADS_MAX
- return PTHREAD_THREADS_MAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_THREAD_ATTR_STACKADDR:
- #ifdef _POSIX_THREAD_ATTR_STACKADDR
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_THREAD_ATTR_STACKSIZE:
- #ifdef _POSIX_THREAD_ATTR_STACKSIZE
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_THREAD_PRIORITY_SCHEDULING:
- #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_THREAD_PRIO_INHERIT:
- #ifdef _POSIX_THREAD_PRIO_INHERIT
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_THREAD_PRIO_PROTECT:
- #ifdef _POSIX_THREAD_PRIO_PROTECT
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_THREAD_PROCESS_SHARED:
- #ifdef _POSIX_THREAD_PROCESS_SHARED
- return 1;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_NPROCESSORS_CONF:
- #if 0
- RETURN_FUNCTION(get_nprocs_conf());
- #else
- RETURN_NEG_1;
- #endif
- case _SC_NPROCESSORS_ONLN:
- #if 0
- RETURN_FUNCTION(get_nprocs());
- #else
- RETURN_NEG_1;
- #endif
- case _SC_PHYS_PAGES:
- #if 0
- RETURN_FUNCTION(get_phys_pages());
- #else
- RETURN_NEG_1;
- #endif
- case _SC_AVPHYS_PAGES:
- #if 0
- RETURN_FUNCTION(get_avphys_pages());
- #else
- RETURN_NEG_1;
- #endif
- case _SC_ATEXIT_MAX:
- return __UCLIBC_MAX_ATEXIT;
- case _SC_PASS_MAX:
- /* We have no limit but since the return value might be used to
- allocate a buffer we restrict the value. */
- return BUFSIZ;
- case _SC_XOPEN_VERSION:
- return _XOPEN_VERSION;
- case _SC_XOPEN_XCU_VERSION:
- return _XOPEN_XCU_VERSION;
- case _SC_XOPEN_UNIX:
- return _XOPEN_UNIX;
- case _SC_XOPEN_CRYPT:
- #ifdef _XOPEN_CRYPT
- return _XOPEN_CRYPT;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_XOPEN_ENH_I18N:
- #ifdef _XOPEN_ENH_I18N
- return _XOPEN_ENH_I18N;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_XOPEN_SHM:
- #ifdef _XOPEN_SHM
- return _XOPEN_SHM;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_XOPEN_XPG2:
- #ifdef _XOPEN_XPG2
- return _XOPEN_XPG2;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_XOPEN_XPG3:
- #ifdef _XOPEN_XPG3
- return _XOPEN_XPG3;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_XOPEN_XPG4:
- #ifdef _XOPEN_XPG4
- return _XOPEN_XPG4;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_CHAR_BIT:
- return CHAR_BIT;
- case _SC_CHAR_MAX:
- return CHAR_MAX;
- case _SC_CHAR_MIN:
- return CHAR_MIN;
- case _SC_INT_MAX:
- return INT_MAX;
- case _SC_INT_MIN:
- return INT_MIN;
- case _SC_LONG_BIT:
- return sizeof (long int) * CHAR_BIT;
- case _SC_WORD_BIT:
- return sizeof (int) * CHAR_BIT;
- case _SC_MB_LEN_MAX:
- return MB_LEN_MAX;
- case _SC_NZERO:
- return NZERO;
- case _SC_SSIZE_MAX:
- return _POSIX_SSIZE_MAX;
- case _SC_SCHAR_MAX:
- return SCHAR_MAX;
- case _SC_SCHAR_MIN:
- return SCHAR_MIN;
- case _SC_SHRT_MAX:
- return SHRT_MAX;
- case _SC_SHRT_MIN:
- return SHRT_MIN;
- case _SC_UCHAR_MAX:
- return UCHAR_MAX;
- case _SC_UINT_MAX:
- return UINT_MAX;
- case _SC_ULONG_MAX:
- return ULONG_MAX;
- case _SC_USHRT_MAX:
- return USHRT_MAX;
- case _SC_NL_ARGMAX:
- #ifdef NL_ARGMAX
- return NL_ARGMAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_NL_LANGMAX:
- #ifdef NL_LANGMAX
- return NL_LANGMAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_NL_MSGMAX:
- #ifdef NL_MSGMAX
- return NL_MSGMAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_NL_NMAX:
- #ifdef NL_NMAX
- return NL_NMAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_NL_SETMAX:
- #ifdef NL_SETMAX
- return NL_SETMAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_NL_TEXTMAX:
- #ifdef NL_TEXTMAX
- return NL_TEXTMAX;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_XBS5_ILP32_OFF32:
- #ifdef _XBS5_ILP32_OFF32
- return _XBS5_ILP32_OFF32;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_XBS5_ILP32_OFFBIG:
- #ifdef _XBS5_ILP32_OFFBIG
- return _XBS5_ILP32_OFFBIG;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_XBS5_LP64_OFF64:
- #ifdef _XBS5_LP64_OFF64
- return _XBS5_LP64_OFF64;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_XBS5_LPBIG_OFFBIG:
- #ifdef _XBS5_LPBIG_OFFBIG
- return _XBS5_LPBIG_OFFBIG;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_XOPEN_LEGACY:
- return _XOPEN_LEGACY;
- case _SC_XOPEN_REALTIME:
- #ifdef _XOPEN_REALTIME
- return _XOPEN_REALTIME;
- #else
- RETURN_NEG_1;
- #endif
- case _SC_XOPEN_REALTIME_THREADS:
- #ifdef _XOPEN_REALTIME_THREADS
- return _XOPEN_REALTIME_THREADS;
- #else
- RETURN_NEG_1;
- #endif
- }
- }
- weak_alias(__sysconf, sysconf);
- #endif /* _UCLIBC_GENERATE_SYSCONF_MAIN */
- /***********************************************************************/
- #ifdef _UCLIBC_GENERATE_SYSCONF_MAIN
- static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
- static const char *type_str[] = {
- "char", "short", "int", "long"
- };
- static const char *type_fmt[] = { " %4ld", " %6ld", " %8ld", " %8ld" };
- static const int type_mod[] = { 13, 9, 6, 6 };
- static int find_or_add_in_table(int index, long int val, int *table,
- int *num_in_table, int add_flag)
- {
- int i;
- for (i=0 ; i<*num_in_table ; i++) {
- if (ret_vals[table[i]] == val) {
- return i;
- }
- }
- if (add_flag) {
- table[(*num_in_table)++] = index;
- return i;
- } else {
- return -1;
- }
- }
- int main(void)
- {
- long int r;
- int type_table[5][_UCLIBC_SYSCONF_NUM_VALID_ARGS];
- int ret_type[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
- int num_type[5];
- int i, j, k, code;
- for (i=0 ; i<5 ; i++) {
- num_type[i] = 0;
- }
- for (i=0; i<_UCLIBC_SYSCONF_NUM_VALID_ARGS ; i++) {
- __set_errno(0);
- r = ret_vals[i] = sysconf(i);
- switch(errno) {
- case EINVAL: /* we're missing a case! */
- fprintf(stderr,"sysconf.c is broken! case %d missing!\n", i);
- return EXIT_FAILURE;
- case EISNAM: /* function */
- find_or_add_in_table(i,r,type_table[4],num_type+4,1);
- ret_type[i] = 4;
- break;
- case ENOSYS: /* defaults to -1 */
- /* why does this break for shared???? */
- fprintf(stderr,"gen_sysconf advisory --"
- "case %d defaults to -1\n", i);
- /* fall through */
- case 0:
- if ((r>=CHAR_MIN) && (r<=CHAR_MAX)) {
- ret_type[i] = 0;
- find_or_add_in_table(i,r,type_table[0],num_type+0,1);
- } else if ((r>=SHRT_MIN) && (r<=SHRT_MAX)) {
- ret_type[i] = 1;
- find_or_add_in_table(i,r,type_table[1],num_type+1,1);
- } else if ((r>=INT_MIN) && (r<=INT_MAX)) {
- ret_type[i] = 2;
- find_or_add_in_table(i,r,type_table[2],num_type+2,1);
- } else {
- ret_type[i] = 3;
- find_or_add_in_table(i,r,type_table[3],num_type+3,1);
- }
- break;
- default:
- fprintf(stderr,"sysconf.c is broken! errno = %d!\n", errno);
- break;
- }
- }
- printf("#include <errno.h>\n#include <unistd.h>\n#include <limits.h>\n\n");
- printf("static const unsigned char index[%d] = {",
- _UCLIBC_SYSCONF_NUM_VALID_ARGS);
- for (i=0 ; i<_UCLIBC_SYSCONF_NUM_VALID_ARGS ; i++) {
- if (i) printf(",");
- if (i%15 == 0) printf("\n");
- code = 0;
- for (j=0 ; j<4 ; j++) {
- k = find_or_add_in_table(i,ret_vals[i],type_table[j],num_type+j,0);
- if (k>=0) {
- code += k;
- break;
- }
- code += num_type[j];
- }
- printf(" %3d", code);
- }
- printf("\n};\n\n");
- for (j=0 ; j < 4 ; j++) {
- if (num_type[j]) {
- printf("static const %s %s_vals[%d] = {",
- type_str[j], type_str[j], num_type[j]);
- for (i = 0 ; i<num_type[j] ; i++) {
- if (i) printf(",");
- if (i%13 == 0) printf("\n");
- if (ret_vals[type_table[j][i]] == INT_MIN) {
- printf("%12s","INT_MIN");
- } else {
- printf(type_fmt[j], ret_vals[type_table[j][i]]);
- }
- }
- printf("\n};\n\n");
- }
- }
- printf("long int sysconf(int name)\n{\n\tint i;\n\n"
- "\tif ((name < 0) || (name >= %d)) {\n"
- "\t\terrno=EINVAL;\n"
- "\t\treturn -1;\n"
- "\t}\n\n", _UCLIBC_SYSCONF_NUM_VALID_ARGS);
- printf("\ti = index[name];\n\n");
- k = 0;
- for (i=0 ; i<4 ; i++) {
- if (num_type[i]) {
- if (k>0) {
- printf("\ti -= %d;\n", k);
- }
- printf("\tif (i < %d) {\n"
- "\t\treturn %s_vals[i];\n"
- "\t}\n\n",
- num_type[i], type_str[i]);
- k = num_type[i];
- }
- }
- if (num_type[4]) {
- if (k>0) {
- printf("\ti -= %d;\n", k);
- }
- printf("\tswitch(i) {\n");
- for (i = 0 ; i<num_type[4] ; i++) {
- printf("\t\tcase %d:\n"
- "\t\t\treturn %s;\n",
- i, (const char *)ret_vals[type_table[4][i]]);
- }
- printf("\t}\n\n");
- }
- printf("\treturn -1;\n"
- "}\n");
- return EXIT_SUCCESS;
- }
- /***********************************************************************/
- #endif
|