1  /* Copyright (C) 1991-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <errno.h>
      19  #include <limits.h>
      20  #include <grp.h>
      21  #include <pwd.h>
      22  #include <stddef.h>
      23  #include <stdio.h>
      24  #include <stdlib.h>
      25  #include <string.h>
      26  #include <time.h>
      27  #include <unistd.h>
      28  #include <sys/param.h>
      29  #include <sys/stat.h>
      30  #include <sys/sysinfo.h>
      31  #include <sys/types.h>
      32  #include <sys/uio.h>
      33  #include <regex.h>
      34  #include <signal.h>
      35  #include <sysconf-pthread_stack_min.h>
      36  
      37  #define NEED_SPEC_ARRAY 0
      38  #include <posix-conf-vars.h>
      39  
      40  #if !defined _XBS5_ILP32_OFF32 || !defined _XBS5_ILP32_OFFBIG \
      41     || !defined _XBS5_LP64_OFF64 || !defined _XBS5_LPBIG_OFFBIG \
      42     || !defined _POSIX_V6_ILP32_OFF32 || !defined _POSIX_V6_ILP32_OFFBIG \
      43     || !defined _POSIX_V6_LP64_OFF64 || !defined _POSIX_V6_LPBIG_OFFBIG \
      44     || !defined _POSIX_V7_ILP32_OFF32 || !defined _POSIX_V7_ILP32_OFFBIG \
      45     || !defined _POSIX_V7_LP64_OFF64 || !defined _POSIX_V7_LPBIG_OFFBIG
      46  # define NEED_CHECK_SPEC 1
      47  #else
      48  # define NEED_CHECK_SPEC 0
      49  #endif
      50  
      51  #if NEED_CHECK_SPEC
      52  static long int __sysconf_check_spec (const char *spec);
      53  #endif
      54  
      55  
      56  /* Get the value of the system variable NAME.  */
      57  long int
      58  __sysconf (int name)
      59  {
      60    switch (name)
      61      {
      62        /* Also add obsolete or unnecessarily added constants here.  */
      63      case _SC_EQUIV_CLASS_MAX:
      64      default:
      65        __set_errno (EINVAL);
      66        return -1;
      67  
      68      case _SC_ARG_MAX:
      69  #ifdef	ARG_MAX
      70        return ARG_MAX;
      71  #else
      72        return -1;
      73  #endif
      74  
      75      case _SC_CHILD_MAX:
      76  #ifdef	CHILD_MAX
      77        return CHILD_MAX;
      78  #else
      79        return __get_child_max ();
      80  #endif
      81  
      82      case _SC_CLK_TCK:
      83        return __getclktck ();
      84  
      85      case _SC_NGROUPS_MAX:
      86  #ifdef	NGROUPS_MAX
      87        return NGROUPS_MAX;
      88  #else
      89        return -1;
      90  #endif
      91  
      92      case _SC_OPEN_MAX:
      93        return __getdtablesize ();
      94  
      95      case _SC_STREAM_MAX:
      96  #ifdef	STREAM_MAX
      97        return STREAM_MAX;
      98  #else
      99        return FOPEN_MAX;
     100  #endif
     101  
     102      case _SC_TZNAME_MAX:
     103        return -1;
     104  
     105      case _SC_JOB_CONTROL:
     106  #if CONF_IS_DEFINED_SET (_POSIX_JOB_CONTROL)
     107        return _POSIX_JOB_CONTROL;
     108  #else
     109        return -1;
     110  #endif
     111  
     112      case _SC_SAVED_IDS:
     113  #if CONF_IS_DEFINED_SET (_POSIX_SAVED_IDS)
     114        return 1;
     115  #else
     116        return -1;
     117  #endif
     118  
     119      case _SC_REALTIME_SIGNALS:
     120  #if CONF_IS_DEFINED_SET (_POSIX_REALTIME_SIGNALS)
     121        return _POSIX_REALTIME_SIGNALS;
     122  #else
     123        return -1;
     124  #endif
     125  
     126      case _SC_PRIORITY_SCHEDULING:
     127  #if CONF_IS_DEFINED_SET (_POSIX_PRIORITY_SCHEDULING)
     128        return _POSIX_PRIORITY_SCHEDULING;
     129  #else
     130        return -1;
     131  #endif
     132  
     133      case _SC_TIMERS:
     134  #if CONF_IS_DEFINED_SET (_POSIX_TIMERS)
     135        return _POSIX_TIMERS;
     136  #else
     137        return -1;
     138  #endif
     139  
     140      case _SC_ASYNCHRONOUS_IO:
     141  #if CONF_IS_DEFINED_SET (_POSIX_ASYNCHRONOUS_IO)
     142        return _POSIX_ASYNCHRONOUS_IO;
     143  #else
     144        return -1;
     145  #endif
     146  
     147      case _SC_PRIORITIZED_IO:
     148  #if CONF_IS_DEFINED_SET (_POSIX_PRIORITIZED_IO)
     149        return _POSIX_PRIORITIZED_IO;
     150  #else
     151        return -1;
     152  #endif
     153  
     154      case _SC_SYNCHRONIZED_IO:
     155  #if CONF_IS_DEFINED_SET (_POSIX_SYNCHRONIZED_IO)
     156        return _POSIX_SYNCHRONIZED_IO;
     157  #else
     158        return -1;
     159  #endif
     160  
     161      case _SC_FSYNC:
     162  #if CONF_IS_DEFINED_SET (_POSIX_FSYNC)
     163        return _POSIX_FSYNC;
     164  #else
     165        return -1;
     166  #endif
     167  
     168      case _SC_MAPPED_FILES:
     169  #if CONF_IS_DEFINED_SET (_POSIX_MAPPED_FILES)
     170        return _POSIX_MAPPED_FILES;
     171  #else
     172        return -1;
     173  #endif
     174  
     175      case _SC_MEMLOCK:
     176  #if CONF_IS_DEFINED_SET (_POSIX_MEMLOCK)
     177        return _POSIX_MEMLOCK;
     178  #else
     179        return -1;
     180  #endif
     181  
     182      case _SC_MEMLOCK_RANGE:
     183  #if CONF_IS_DEFINED_SET (_POSIX_MEMLOCK_RANGE)
     184        return _POSIX_MEMLOCK_RANGE;
     185  #else
     186        return -1;
     187  #endif
     188  
     189      case _SC_MEMORY_PROTECTION:
     190  #if CONF_IS_DEFINED_SET (_POSIX_MEMORY_PROTECTION)
     191        return _POSIX_MEMORY_PROTECTION;
     192  #else
     193        return -1;
     194  #endif
     195  
     196      case _SC_MESSAGE_PASSING:
     197  #if CONF_IS_DEFINED_SET (_POSIX_MESSAGE_PASSING)
     198        return _POSIX_MESSAGE_PASSING;
     199  #else
     200        return -1;
     201  #endif
     202  
     203      case _SC_SEMAPHORES:
     204  #if CONF_IS_DEFINED_SET (_POSIX_SEMAPHORES)
     205        return _POSIX_SEMAPHORES;
     206  #else
     207        return -1;
     208  #endif
     209  
     210      case _SC_SHARED_MEMORY_OBJECTS:
     211  #if CONF_IS_DEFINED_SET (_POSIX_SHARED_MEMORY_OBJECTS)
     212        return _POSIX_SHARED_MEMORY_OBJECTS;
     213  #else
     214        return -1;
     215  #endif
     216  
     217      case _SC_VERSION:
     218        return _POSIX_VERSION;
     219  
     220      case _SC_PAGESIZE:
     221        return __getpagesize ();
     222  
     223      case _SC_AIO_LISTIO_MAX:
     224  #ifdef	AIO_LISTIO_MAX
     225        return AIO_LISTIO_MAX;
     226  #else
     227        return -1;
     228  #endif
     229  
     230      case _SC_AIO_MAX:
     231  #ifdef	AIO_MAX
     232        return AIO_MAX;
     233  #else
     234        return -1;
     235  #endif
     236  
     237      case _SC_AIO_PRIO_DELTA_MAX:
     238  #ifdef	AIO_PRIO_DELTA_MAX
     239        return AIO_PRIO_DELTA_MAX;
     240  #else
     241        return -1;
     242  #endif
     243  
     244      case _SC_DELAYTIMER_MAX:
     245  #ifdef	DELAYTIMER_MAX
     246        return DELAYTIMER_MAX;
     247  #else
     248        return -1;
     249  #endif
     250  
     251      case _SC_MQ_OPEN_MAX:
     252  #ifdef	MQ_OPEN_MAX
     253        return MQ_OPEN_MAX;
     254  #else
     255        return -1;
     256  #endif
     257  
     258      case _SC_MQ_PRIO_MAX:
     259  #ifdef	MQ_PRIO_MAX
     260        return MQ_PRIO_MAX;
     261  #else
     262        return -1;
     263  #endif
     264  
     265      case _SC_RTSIG_MAX:
     266  #ifdef	RTSIG_MAX
     267        return RTSIG_MAX;
     268  #else
     269        return -1;
     270  #endif
     271  
     272      case _SC_SEM_NSEMS_MAX:
     273  #ifdef	SEM_NSEMS_MAX
     274        return SEM_NSEMS_MAX;
     275  #else
     276        return -1;
     277  #endif
     278  
     279      case _SC_SEM_VALUE_MAX:
     280  #ifdef	SEM_VALUE_MAX
     281        return SEM_VALUE_MAX;
     282  #else
     283        return -1;
     284  #endif
     285  
     286      case _SC_SIGQUEUE_MAX:
     287  #ifdef	SIGQUEUE_MAX
     288        return SIGQUEUE_MAX;
     289  #else
     290        return -1;
     291  #endif
     292  
     293      case _SC_TIMER_MAX:
     294  #ifdef	TIMER_MAX
     295        return TIMER_MAX;
     296  #else
     297        return -1;
     298  #endif
     299  
     300      case _SC_BC_BASE_MAX:
     301  #ifdef	BC_BASE_MAX
     302        return BC_BASE_MAX;
     303  #else
     304        return -1;
     305  #endif
     306  
     307      case _SC_BC_DIM_MAX:
     308  #ifdef	BC_DIM_MAX
     309        return BC_DIM_MAX;
     310  #else
     311        return -1;
     312  #endif
     313  
     314      case _SC_BC_SCALE_MAX:
     315  #ifdef	BC_SCALE_MAX
     316        return BC_SCALE_MAX;
     317  #else
     318        return -1;
     319  #endif
     320  
     321      case _SC_BC_STRING_MAX:
     322  #ifdef	BC_STRING_MAX
     323        return BC_STRING_MAX;
     324  #else
     325        return -1;
     326  #endif
     327  
     328      case _SC_COLL_WEIGHTS_MAX:
     329  #ifdef	COLL_WEIGHTS_MAX
     330        return COLL_WEIGHTS_MAX;
     331  #else
     332        return -1;
     333  #endif
     334  
     335      case _SC_EXPR_NEST_MAX:
     336  #ifdef	EXPR_NEST_MAX
     337        return EXPR_NEST_MAX;
     338  #else
     339        return -1;
     340  #endif
     341  
     342      case _SC_LINE_MAX:
     343  #ifdef	LINE_MAX
     344        return LINE_MAX;
     345  #else
     346        return -1;
     347  #endif
     348  
     349      case _SC_RE_DUP_MAX:
     350  #ifdef	RE_DUP_MAX
     351        return RE_DUP_MAX;
     352  #else
     353        return -1;
     354  #endif
     355  
     356      case _SC_CHARCLASS_NAME_MAX:
     357  #ifdef	CHARCLASS_NAME_MAX
     358        return CHARCLASS_NAME_MAX;
     359  #else
     360        return -1;
     361  #endif
     362  
     363      case _SC_PII:
     364  #if CONF_IS_DEFINED_SET (_POSIX_PII)
     365        return 1;
     366  #else
     367        return -1;
     368  #endif
     369  
     370      case _SC_PII_XTI:
     371  #if CONF_IS_DEFINED_SET (_POSIX_PII_XTI)
     372        return 1;
     373  #else
     374        return -1;
     375  #endif
     376  
     377      case _SC_PII_SOCKET:
     378  #if CONF_IS_DEFINED_SET (_POSIX_PII_SOCKET)
     379        return 1;
     380  #else
     381        return -1;
     382  #endif
     383  
     384      case _SC_PII_INTERNET:
     385  #if CONF_IS_DEFINED_SET (_POSIX_PII_INTERNET)
     386        return 1;
     387  #else
     388        return -1;
     389  #endif
     390  
     391      case _SC_PII_OSI:
     392  #if CONF_IS_DEFINED_SET (_POSIX_PII_OSI)
     393        return 1;
     394  #else
     395        return -1;
     396  #endif
     397  
     398      case _SC_POLL:
     399  #if CONF_IS_DEFINED_SET (_POSIX_POLL)
     400        return 1;
     401  #else
     402        return -1;
     403  #endif
     404  
     405      case _SC_SELECT:
     406  #if CONF_IS_DEFINED_SET (_POSIX_SELECT)
     407        return 1;
     408  #else
     409        return -1;
     410  #endif
     411  
     412        /* The same as _SC_IOV_MAX.  */
     413      case _SC_UIO_MAXIOV:
     414  #ifdef	UIO_MAXIOV
     415        return UIO_MAXIOV;
     416  #else
     417        return -1;
     418  #endif
     419  
     420      case _SC_PII_INTERNET_STREAM:
     421  #if CONF_IS_DEFINED_SET (_POSIX_PII_INTERNET_STREAM)
     422        return 1;
     423  #else
     424        return -1;
     425  #endif
     426  
     427      case _SC_PII_INTERNET_DGRAM:
     428  #if CONF_IS_DEFINED_SET (_POSIX_PII_INTERNET_DGRAM)
     429        return 1;
     430  #else
     431        return -1;
     432  #endif
     433  
     434      case _SC_PII_OSI_COTS:
     435  #if CONF_IS_DEFINED_SET (_POSIX_PII_OSI_COTS)
     436        return 1;
     437  #else
     438        return -1;
     439  #endif
     440  
     441      case _SC_PII_OSI_CLTS:
     442  #if CONF_IS_DEFINED_SET (_POSIX_PII_OSI_CLTS)
     443        return 1;
     444  #else
     445        return -1;
     446  #endif
     447  
     448      case _SC_PII_OSI_M:
     449  #if CONF_IS_DEFINED_SET (_POSIX_PII_OSI_M)
     450        return 1;
     451  #else
     452        return -1;
     453  #endif
     454  
     455      case _SC_T_IOV_MAX:
     456  #ifdef	_T_IOV_MAX
     457        return _T_IOV_MAX;
     458  #else
     459        return -1;
     460  #endif
     461  
     462      case _SC_2_VERSION:
     463        return _POSIX2_VERSION;
     464  
     465      case _SC_2_C_BIND:
     466  #ifdef	_POSIX2_C_BIND
     467        return _POSIX2_C_BIND;
     468  #else
     469        return -1;
     470  #endif
     471  
     472      case _SC_2_C_DEV:
     473  #ifdef	_POSIX2_C_DEV
     474        return _POSIX2_C_DEV;
     475  #else
     476        return -1;
     477  #endif
     478  
     479      case _SC_2_C_VERSION:
     480  #ifdef	_POSIX2_C_VERSION
     481        return _POSIX2_C_VERSION;
     482  #else
     483        return -1;
     484  #endif
     485  
     486      case _SC_2_FORT_DEV:
     487  #ifdef	_POSIX2_FORT_DEV
     488        return _POSIX2_FORT_DEV;
     489  #else
     490        return -1;
     491  #endif
     492  
     493      case _SC_2_FORT_RUN:
     494  #ifdef	_POSIX2_FORT_RUN
     495        return _POSIX2_FORT_RUN;
     496  #else
     497        return -1;
     498  #endif
     499  
     500      case _SC_2_LOCALEDEF:
     501  #ifdef	_POSIX2_LOCALEDEF
     502        return _POSIX2_LOCALEDEF;
     503  #else
     504        return -1;
     505  #endif
     506  
     507      case _SC_2_SW_DEV:
     508  #ifdef	_POSIX2_SW_DEV
     509        return _POSIX2_SW_DEV;
     510  #else
     511        return -1;
     512  #endif
     513  
     514      case _SC_2_CHAR_TERM:
     515  #ifdef	_POSIX2_CHAR_TERM
     516        return _POSIX2_CHAR_TERM;
     517  #else
     518        return -1;
     519  #endif
     520  
     521      case _SC_2_UPE:
     522  #ifdef	_POSIX2_UPE
     523        return _POSIX2_UPE;
     524  #else
     525        return -1;
     526  #endif
     527  
     528        /* POSIX 1003.1c (POSIX Threads).  */
     529      case _SC_THREADS:
     530  #if CONF_IS_DEFINED_SET (_POSIX_THREADS)
     531        return _POSIX_THREADS;
     532  #else
     533        return -1;
     534  #endif
     535  
     536      case _SC_THREAD_SAFE_FUNCTIONS:
     537  #if CONF_IS_DEFINED_SET (_POSIX_THREAD_SAFE_FUNCTIONS)
     538        return _POSIX_THREAD_SAFE_FUNCTIONS;
     539  #else
     540        return -1;
     541  #endif
     542  
     543      case _SC_GETGR_R_SIZE_MAX:
     544        return NSS_BUFLEN_GROUP;
     545  
     546      case _SC_GETPW_R_SIZE_MAX:
     547        return NSS_BUFLEN_PASSWD;
     548  
     549      case _SC_LOGIN_NAME_MAX:
     550  #ifdef	LOGIN_NAME_MAX
     551        return LOGIN_NAME_MAX;
     552  #else
     553        return -1;
     554  #endif
     555  
     556      case _SC_TTY_NAME_MAX:
     557  #ifdef	TTY_NAME_MAX
     558        return TTY_NAME_MAX;
     559  #else
     560        return -1;
     561  #endif
     562  
     563      case _SC_THREAD_DESTRUCTOR_ITERATIONS:
     564  #if CONF_IS_DEFINED_SET (_POSIX_THREAD_DESTRUCTOR_ITERATIONS)
     565        return _POSIX_THREAD_DESTRUCTOR_ITERATIONS;
     566  #else
     567        return -1;
     568  #endif
     569  
     570      case _SC_THREAD_KEYS_MAX:
     571  #ifdef	PTHREAD_KEYS_MAX
     572        return PTHREAD_KEYS_MAX;
     573  #else
     574        return -1;
     575  #endif
     576  
     577      case _SC_THREAD_STACK_MIN:
     578        return __get_pthread_stack_min ();
     579  
     580      case _SC_THREAD_THREADS_MAX:
     581  #ifdef	PTHREAD_THREADS_MAX
     582        return PTHREAD_THREADS_MAX;
     583  #else
     584        return -1;
     585  #endif
     586  
     587      case _SC_THREAD_ATTR_STACKADDR:
     588  #if CONF_IS_DEFINED_SET (_POSIX_THREAD_ATTR_STACKADDR)
     589        return _POSIX_THREAD_ATTR_STACKADDR;
     590  #else
     591        return -1;
     592  #endif
     593  
     594      case _SC_THREAD_ATTR_STACKSIZE:
     595  #if CONF_IS_DEFINED_SET (_POSIX_THREAD_ATTR_STACKSIZE)
     596        return _POSIX_THREAD_ATTR_STACKSIZE;
     597  #else
     598        return -1;
     599  #endif
     600  
     601      case _SC_THREAD_PRIORITY_SCHEDULING:
     602  #if CONF_IS_DEFINED_SET (_POSIX_THREAD_PRIORITY_SCHEDULING)
     603        return _POSIX_THREAD_PRIORITY_SCHEDULING;
     604  #else
     605        return -1;
     606  #endif
     607  
     608      case _SC_THREAD_PRIO_INHERIT:
     609  #if CONF_IS_DEFINED_SET (_POSIX_THREAD_PRIO_INHERIT)
     610        return _POSIX_THREAD_PRIO_INHERIT;
     611  #else
     612        return -1;
     613  #endif
     614  
     615      case _SC_THREAD_PRIO_PROTECT:
     616  #if CONF_IS_DEFINED_SET (_POSIX_THREAD_PRIO_PROTECT)
     617        return _POSIX_THREAD_PRIO_PROTECT;
     618  #else
     619        return -1;
     620  #endif
     621  
     622      case _SC_THREAD_PROCESS_SHARED:
     623  #if CONF_IS_DEFINED_SET (_POSIX_THREAD_PROCESS_SHARED)
     624        return _POSIX_THREAD_PROCESS_SHARED;
     625  #else
     626        return -1;
     627  #endif
     628  
     629      case _SC_NPROCESSORS_CONF:
     630        return __get_nprocs_conf ();
     631  
     632      case _SC_NPROCESSORS_ONLN:
     633        return __get_nprocs ();
     634  
     635      case _SC_PHYS_PAGES:
     636        return __get_phys_pages ();
     637  
     638      case _SC_AVPHYS_PAGES:
     639        return __get_avphys_pages ();
     640  
     641      case _SC_ATEXIT_MAX:
     642        /* We have no limit since we use lists.  */
     643        return INT_MAX;
     644  
     645      case _SC_PASS_MAX:
     646        /* We have no limit but since the return value might be used to
     647  	 allocate a buffer we restrict the value.  */
     648        return BUFSIZ;
     649  
     650      case _SC_XOPEN_VERSION:
     651        return _XOPEN_VERSION;
     652  
     653      case _SC_XOPEN_XCU_VERSION:
     654        return _XOPEN_XCU_VERSION;
     655  
     656      case _SC_XOPEN_UNIX:
     657        return _XOPEN_UNIX;
     658  
     659      case _SC_XOPEN_CRYPT:
     660  #ifdef	_XOPEN_CRYPT
     661        return _XOPEN_CRYPT;
     662  #else
     663        return -1;
     664  #endif
     665  
     666      case _SC_XOPEN_ENH_I18N:
     667  #ifdef	_XOPEN_ENH_I18N
     668        return _XOPEN_ENH_I18N;
     669  #else
     670        return -1;
     671  #endif
     672  
     673      case _SC_XOPEN_SHM:
     674  #ifdef	_XOPEN_SHM
     675        return _XOPEN_SHM;
     676  #else
     677        return -1;
     678  #endif
     679  
     680      case _SC_XOPEN_XPG2:
     681  #ifdef	_XOPEN_XPG2
     682        return _XOPEN_XPG2;
     683  #else
     684        return -1;
     685  #endif
     686  
     687      case _SC_XOPEN_XPG3:
     688  #ifdef	_XOPEN_XPG3
     689        return _XOPEN_XPG3;
     690  #else
     691        return -1;
     692  #endif
     693  
     694      case _SC_XOPEN_XPG4:
     695  #ifdef	_XOPEN_XPG4
     696        return _XOPEN_XPG4;
     697  #else
     698        return -1;
     699  #endif
     700  
     701      case _SC_CHAR_BIT:
     702        return CHAR_BIT;
     703  
     704      case _SC_CHAR_MAX:
     705        return CHAR_MAX;
     706  
     707      case _SC_CHAR_MIN:
     708        return CHAR_MIN;
     709  
     710      case _SC_INT_MAX:
     711        return INT_MAX;
     712  
     713      case _SC_INT_MIN:
     714        return INT_MIN;
     715  
     716      case _SC_LONG_BIT:
     717        return sizeof (long int) * CHAR_BIT;
     718  
     719      case _SC_WORD_BIT:
     720        return sizeof (int) * CHAR_BIT;
     721  
     722      case _SC_MB_LEN_MAX:
     723        return MB_LEN_MAX;
     724  
     725      case _SC_NZERO:
     726        return NZERO;
     727  
     728      case _SC_SSIZE_MAX:
     729        return _POSIX_SSIZE_MAX;
     730  
     731      case _SC_SCHAR_MAX:
     732        return SCHAR_MAX;
     733  
     734      case _SC_SCHAR_MIN:
     735        return SCHAR_MIN;
     736  
     737      case _SC_SHRT_MAX:
     738        return SHRT_MAX;
     739  
     740      case _SC_SHRT_MIN:
     741        return SHRT_MIN;
     742  
     743      case _SC_UCHAR_MAX:
     744        return UCHAR_MAX;
     745  
     746      case _SC_UINT_MAX:
     747        return UINT_MAX;
     748  
     749      case _SC_ULONG_MAX:
     750        return ULONG_MAX;
     751  
     752      case _SC_USHRT_MAX:
     753        return USHRT_MAX;
     754  
     755      case _SC_NL_ARGMAX:
     756  #ifdef	NL_ARGMAX
     757        return NL_ARGMAX;
     758  #else
     759        return -1;
     760  #endif
     761  
     762      case _SC_NL_LANGMAX:
     763  #ifdef	NL_LANGMAX
     764        return NL_LANGMAX;
     765  #else
     766        return -1;
     767  #endif
     768  
     769      case _SC_NL_MSGMAX:
     770  #ifdef	NL_MSGMAX
     771        return NL_MSGMAX;
     772  #else
     773        return -1;
     774  #endif
     775  
     776      case _SC_NL_NMAX:
     777  #ifdef	NL_NMAX
     778        return NL_NMAX;
     779  #else
     780        return -1;
     781  #endif
     782  
     783      case _SC_NL_SETMAX:
     784  #ifdef	NL_SETMAX
     785        return NL_SETMAX;
     786  #else
     787        return -1;
     788  #endif
     789  
     790      case _SC_NL_TEXTMAX:
     791  #ifdef	NL_TEXTMAX
     792        return NL_TEXTMAX;
     793  #else
     794        return -1;
     795  #endif
     796  
     797  #define START_ENV_GROUP(VERSION)		\
     798        /* Empty.  */
     799  
     800  #define END_ENV_GROUP(VERSION)			\
     801        /* Empty.  */
     802  
     803  #define KNOWN_ABSENT_ENVIRONMENT(SC_PREFIX, ENV_PREFIX, SUFFIX)	\
     804      case _SC_##SC_PREFIX##_##SUFFIX:				\
     805        return _##ENV_PREFIX##_##SUFFIX;
     806  
     807  #define KNOWN_PRESENT_ENVIRONMENT(SC_PREFIX, ENV_PREFIX, SUFFIX)	\
     808      case _SC_##SC_PREFIX##_##SUFFIX:					\
     809        return _##ENV_PREFIX##_##SUFFIX;
     810  
     811  #define UNKNOWN_ENVIRONMENT(SC_PREFIX, ENV_PREFIX, SUFFIX)	\
     812      case _SC_##SC_PREFIX##_##SUFFIX:				\
     813        return __sysconf_check_spec (#SUFFIX);
     814  
     815  #include <posix/posix-envs.def>
     816  
     817  #undef START_ENV_GROUP
     818  #undef END_ENV_GROUP
     819  #undef KNOWN_ABSENT_ENVIRONMENT
     820  #undef KNOWN_PRESENT_ENVIRONMENT
     821  #undef UNKNOWN_ENVIRONMENT
     822  
     823      case _SC_XOPEN_LEGACY:
     824        return _XOPEN_LEGACY;
     825  
     826      case _SC_XOPEN_REALTIME:
     827  #ifdef _XOPEN_REALTIME
     828        return _XOPEN_REALTIME;
     829  #else
     830        return -1;
     831  #endif
     832      case _SC_XOPEN_REALTIME_THREADS:
     833  #ifdef _XOPEN_REALTIME_THREADS
     834        return _XOPEN_REALTIME_THREADS;
     835  #else
     836        return -1;
     837  #endif
     838  
     839      case _SC_ADVISORY_INFO:
     840  #if CONF_IS_DEFINED_SET (_POSIX_ADVISORY_INFO)
     841        return _POSIX_ADVISORY_INFO;
     842  #else
     843        return -1;
     844  #endif
     845  
     846      case _SC_BARRIERS:
     847  #if CONF_IS_DEFINED_SET (_POSIX_BARRIERS)
     848        return _POSIX_BARRIERS;
     849  #else
     850        return -1;
     851  #endif
     852  
     853      case _SC_BASE:
     854  #if CONF_IS_DEFINED_SET (_POSIX_BASE)
     855        return _POSIX_BASE;
     856  #else
     857        return -1;
     858  #endif
     859      case _SC_C_LANG_SUPPORT:
     860  #if CONF_IS_DEFINED_SET (_POSIX_C_LANG_SUPPORT)
     861        return _POSIX_C_LANG_SUPPORT;
     862  #else
     863        return -1;
     864  #endif
     865      case _SC_C_LANG_SUPPORT_R:
     866  #if CONF_IS_DEFINED_SET (_POSIX_C_LANG_SUPPORT_R)
     867        return _POSIX_C_LANG_SUPPORT_R;
     868  #else
     869        return -1;
     870  #endif
     871  
     872      case _SC_CLOCK_SELECTION:
     873  #if CONF_IS_DEFINED_SET (_POSIX_CLOCK_SELECTION)
     874        return _POSIX_CLOCK_SELECTION;
     875  #else
     876        return -1;
     877  #endif
     878  
     879      case _SC_CPUTIME:
     880  #if CONF_IS_DEFINED_SET (_POSIX_CPUTIME)
     881        return _POSIX_CPUTIME;
     882  #else
     883        return -1;
     884  #endif
     885  
     886      case _SC_DEVICE_IO:
     887  #if CONF_IS_DEFINED_SET (_POSIX_DEVICE_IO)
     888        return _POSIX_DEVICE_IO;
     889  #else
     890        return -1;
     891  #endif
     892      case _SC_DEVICE_SPECIFIC:
     893  #if CONF_IS_DEFINED_SET (_POSIX_DEVICE_SPECIFIC)
     894        return _POSIX_DEVICE_SPECIFIC;
     895  #else
     896        return -1;
     897  #endif
     898      case _SC_DEVICE_SPECIFIC_R:
     899  #if CONF_IS_DEFINED_SET (_POSIX_DEVICE_SPECIFIC_R)
     900        return _POSIX_DEVICE_SPECIFIC_R;
     901  #else
     902        return -1;
     903  #endif
     904  
     905      case _SC_FD_MGMT:
     906  #if CONF_IS_DEFINED_SET (_POSIX_FD_MGMT)
     907        return _POSIX_FD_MGMT;
     908  #else
     909        return -1;
     910  #endif
     911  
     912      case _SC_FIFO:
     913  #if CONF_IS_DEFINED_SET (_POSIX_FIFO)
     914        return _POSIX_FIFO;
     915  #else
     916        return -1;
     917  #endif
     918      case _SC_PIPE:
     919  #if CONF_IS_DEFINED_SET (_POSIX_PIPE)
     920        return _POSIX_PIPE;
     921  #else
     922        return -1;
     923  #endif
     924  
     925      case _SC_FILE_ATTRIBUTES:
     926  #if CONF_IS_DEFINED_SET (_POSIX_FILE_ATTRIBUTES)
     927        return _POSIX_FILE_ATTRIBUTES;
     928  #else
     929        return -1;
     930  #endif
     931      case _SC_FILE_LOCKING:
     932  #if CONF_IS_DEFINED_SET (_POSIX_FILE_LOCKING)
     933        return _POSIX_FILE_LOCKING;
     934  #else
     935        return -1;
     936  #endif
     937      case _SC_FILE_SYSTEM:
     938  #if CONF_IS_DEFINED_SET (_POSIX_FILE_SYSTEM)
     939        return _POSIX_FILE_SYSTEM;
     940  #else
     941        return -1;
     942  #endif
     943  
     944      case _SC_MONOTONIC_CLOCK:
     945  #if CONF_IS_DEFINED_SET (_POSIX_MONOTONIC_CLOCK)
     946        return _POSIX_MONOTONIC_CLOCK;
     947  #else
     948        return -1;
     949  #endif
     950  
     951      case _SC_MULTI_PROCESS:
     952  #if CONF_IS_DEFINED_SET (_POSIX_MULTI_PROCESS)
     953        return _POSIX_MULTI_PROCESS;
     954  #else
     955        return -1;
     956  #endif
     957      case _SC_SINGLE_PROCESS:
     958  #if CONF_IS_DEFINED_SET (_POSIX_SINGLE_PROCESS)
     959        return _POSIX_SINGLE_PROCESS;
     960  #else
     961        return -1;
     962  #endif
     963  
     964      case _SC_NETWORKING:
     965  #if CONF_IS_DEFINED_SET (_POSIX_NETWORKING)
     966        return _POSIX_NETWORKING;
     967  #else
     968        return -1;
     969  #endif
     970  
     971      case _SC_READER_WRITER_LOCKS:
     972  #if CONF_IS_DEFINED_SET (_POSIX_READER_WRITER_LOCKS)
     973        return _POSIX_READER_WRITER_LOCKS;
     974  #else
     975        return -1;
     976  #endif
     977      case _SC_SPIN_LOCKS:
     978  #if CONF_IS_DEFINED_SET (_POSIX_SPIN_LOCKS)
     979        return _POSIX_SPIN_LOCKS;
     980  #else
     981        return -1;
     982  #endif
     983  
     984      case _SC_REGEXP:
     985  #if CONF_IS_DEFINED_SET (_POSIX_REGEXP)
     986        return _POSIX_REGEXP;
     987  #else
     988        return -1;
     989  #endif
     990      /* _REGEX_VERSION has been removed with IEEE Std 1003.1-2001/Cor 2-2004,
     991         item XSH/TC2/D6/137.  */
     992      case _SC_REGEX_VERSION:
     993        return -1;
     994  
     995      case _SC_SHELL:
     996  #if CONF_IS_DEFINED_SET (_POSIX_SHELL)
     997        return _POSIX_SHELL;
     998  #else
     999        return -1;
    1000  #endif
    1001  
    1002      case _SC_SIGNALS:
    1003  #if CONF_IS_DEFINED (_POSIX_SIGNALS)
    1004        return _POSIX_SIGNALS;
    1005  #else
    1006        return -1;
    1007  #endif
    1008  
    1009      case _SC_SPAWN:
    1010  #if CONF_IS_DEFINED_SET (_POSIX_SPAWN)
    1011        return _POSIX_SPAWN;
    1012  #else
    1013        return -1;
    1014  #endif
    1015  
    1016      case _SC_SPORADIC_SERVER:
    1017  #if CONF_IS_DEFINED_SET (_POSIX_SPORADIC_SERVER)
    1018        return _POSIX_SPORADIC_SERVER;
    1019  #else
    1020        return -1;
    1021  #endif
    1022      case _SC_THREAD_SPORADIC_SERVER:
    1023  #if CONF_IS_DEFINED_SET (_POSIX_THREAD_SPORADIC_SERVER)
    1024        return _POSIX_THREAD_SPORADIC_SERVER;
    1025  #else
    1026        return -1;
    1027  #endif
    1028  
    1029      case _SC_SYSTEM_DATABASE:
    1030  #if CONF_IS_DEFINED_SET (_POSIX_SYSTEM_DATABASE)
    1031        return _POSIX_SYSTEM_DATABASE;
    1032  #else
    1033        return -1;
    1034  #endif
    1035      case _SC_SYSTEM_DATABASE_R:
    1036  #if CONF_IS_DEFINED_SET (_POSIX_SYSTEM_DATABASE_R)
    1037        return _POSIX_SYSTEM_DATABASE_R;
    1038  #else
    1039        return -1;
    1040  #endif
    1041  
    1042      case _SC_THREAD_CPUTIME:
    1043  #if CONF_IS_DEFINED_SET (_POSIX_THREAD_CPUTIME)
    1044        return _POSIX_THREAD_CPUTIME;
    1045  #else
    1046        return -1;
    1047  #endif
    1048  
    1049      case _SC_TIMEOUTS:
    1050  #if CONF_IS_DEFINED_SET (_POSIX_TIMEOUTS)
    1051        return _POSIX_TIMEOUTS;
    1052  #else
    1053        return -1;
    1054  #endif
    1055  
    1056      case _SC_TYPED_MEMORY_OBJECTS:
    1057  #if CONF_IS_DEFINED_SET (_POSIX_TYPED_MEMORY_OBJECTS)
    1058        return _POSIX_TYPED_MEMORY_OBJECTS;
    1059  #else
    1060        return -1;
    1061  #endif
    1062  
    1063      case _SC_USER_GROUPS:
    1064  #if CONF_IS_DEFINED_SET (_POSIX_USER_GROUPS)
    1065        return _POSIX_USER_GROUPS;
    1066  #else
    1067        return -1;
    1068  #endif
    1069      case _SC_USER_GROUPS_R:
    1070  #if CONF_IS_DEFINED_SET (_POSIX_USER_GROUPS_R)
    1071        return _POSIX_USER_GROUPS_R;
    1072  #else
    1073        return -1;
    1074  #endif
    1075  
    1076      case _SC_2_PBS:
    1077  #ifdef _POSIX2_PBS
    1078        return _POSIX2_PBS;
    1079  #else
    1080        return -1;
    1081  #endif
    1082      case _SC_2_PBS_ACCOUNTING:
    1083  #ifdef _POSIX2_PBS_ACCOUNTING
    1084        return _POSIX2_PBS_ACCOUNTING;
    1085  #else
    1086        return -1;
    1087  #endif
    1088      case _SC_2_PBS_CHECKPOINT:
    1089  #ifdef _POSIX2_PBS_CHECKPOINT
    1090        return _POSIX2_PBS_CHECKPOINT;
    1091  #else
    1092        return -1;
    1093  #endif
    1094      case _SC_2_PBS_LOCATE:
    1095  #ifdef _POSIX2_PBS_LOCATE
    1096        return _POSIX2_PBS_LOCATE;
    1097  #else
    1098        return -1;
    1099  #endif
    1100      case _SC_2_PBS_MESSAGE:
    1101  #ifdef _POSIX2_PBS_MESSAGE
    1102        return _POSIX2_PBS_MESSAGE;
    1103  #else
    1104        return -1;
    1105  #endif
    1106      case _SC_2_PBS_TRACK:
    1107  #ifdef _POSIX2_PBS_TRACK
    1108        return _POSIX2_PBS_TRACK;
    1109  #else
    1110        return -1;
    1111  #endif
    1112  
    1113      case _SC_SYMLOOP_MAX:
    1114  #ifdef SYMLOOP_MAX
    1115        return SYMLOOP_MAX;
    1116  #else
    1117        return -1;
    1118  #endif
    1119  
    1120      case _SC_STREAMS:
    1121        return -1;
    1122  
    1123      case _SC_HOST_NAME_MAX:
    1124  #ifdef HOST_NAME_MAX
    1125        return HOST_NAME_MAX;
    1126  #else
    1127        return -1;
    1128  #endif
    1129  
    1130      case _SC_TRACE:
    1131  #if CONF_IS_DEFINED_SET (_POSIX_TRACE)
    1132        return _POSIX_TRACE;
    1133  #else
    1134        return -1;
    1135  #endif
    1136      case _SC_TRACE_EVENT_FILTER:
    1137  #if CONF_IS_DEFINED_SET (_POSIX_TRACE_EVENT_FILTER)
    1138        return _POSIX_TRACE_EVENT_FILTER;
    1139  #else
    1140        return -1;
    1141  #endif
    1142      case _SC_TRACE_INHERIT:
    1143  #if CONF_IS_DEFINED_SET (_POSIX_TRACE_INHERIT)
    1144        return _POSIX_TRACE_INHERIT;
    1145  #else
    1146        return -1;
    1147  #endif
    1148      case _SC_TRACE_LOG:
    1149  #if CONF_IS_DEFINED_SET (_POSIX_TRACE_LOG)
    1150        return _POSIX_TRACE_LOG;
    1151  #else
    1152        return -1;
    1153  #endif
    1154  
    1155      case _SC_TRACE_EVENT_NAME_MAX:
    1156      case _SC_TRACE_NAME_MAX:
    1157      case _SC_TRACE_SYS_MAX:
    1158      case _SC_TRACE_USER_EVENT_MAX:
    1159        /* No support for tracing.  */
    1160  
    1161      case _SC_XOPEN_STREAMS:
    1162        /* No support for STREAMS.  */
    1163        return -1;
    1164  
    1165      case _SC_LEVEL1_ICACHE_SIZE:
    1166      case _SC_LEVEL1_ICACHE_ASSOC:
    1167      case _SC_LEVEL1_ICACHE_LINESIZE:
    1168      case _SC_LEVEL1_DCACHE_SIZE:
    1169      case _SC_LEVEL1_DCACHE_ASSOC:
    1170      case _SC_LEVEL1_DCACHE_LINESIZE:
    1171      case _SC_LEVEL2_CACHE_SIZE:
    1172      case _SC_LEVEL2_CACHE_ASSOC:
    1173      case _SC_LEVEL2_CACHE_LINESIZE:
    1174      case _SC_LEVEL3_CACHE_SIZE:
    1175      case _SC_LEVEL3_CACHE_ASSOC:
    1176      case _SC_LEVEL3_CACHE_LINESIZE:
    1177      case _SC_LEVEL4_CACHE_SIZE:
    1178      case _SC_LEVEL4_CACHE_ASSOC:
    1179      case _SC_LEVEL4_CACHE_LINESIZE:
    1180        /* In general we cannot determine these values.  Therefore we
    1181  	 return zero which indicates that no information is
    1182  	 available.  */
    1183        return 0;
    1184  
    1185      case _SC_IPV6:
    1186  #if CONF_IS_DEFINED_SET (_POSIX_IPV6)
    1187        return _POSIX_IPV6;
    1188  #else
    1189        return -1;
    1190  #endif
    1191  
    1192      case _SC_RAW_SOCKETS:
    1193  #if CONF_IS_DEFINED_SET (_POSIX_RAW_SOCKETS)
    1194        return _POSIX_RAW_SOCKETS;
    1195  #else
    1196        return -1;
    1197  #endif
    1198  
    1199      case _SC_SIGSTKSZ:
    1200  #ifdef SIGSTKSZ
    1201        return SIGSTKSZ;
    1202  #else
    1203        return -1;
    1204  #endif
    1205  
    1206      case _SC_MINSIGSTKSZ:
    1207  #ifdef MINSIGSTKSZ
    1208        return MINSIGSTKSZ;
    1209  #else
    1210        return -1;
    1211  #endif
    1212      }
    1213  }
    1214  
    1215  #undef __sysconf
    1216  weak_alias (__sysconf, sysconf)
    1217  libc_hidden_def (__sysconf)
    1218  
    1219  #if NEED_CHECK_SPEC
    1220  static long int
    1221  __sysconf_check_spec (const char *spec)
    1222  {
    1223    int save_errno = errno;
    1224  
    1225    const char *getconf_dir = __libc_secure_getenv ("GETCONF_DIR") ?: GETCONF_DIR;
    1226    size_t getconf_dirlen = strlen (getconf_dir);
    1227    size_t speclen = strlen (spec);
    1228  
    1229    char name[getconf_dirlen + sizeof ("/POSIX_V6_") + speclen];
    1230    memcpy (mempcpy (mempcpy (name, getconf_dir, getconf_dirlen),
    1231  		   "/POSIX_V6_", sizeof ("/POSIX_V6_") - 1),
    1232  	  spec, speclen + 1);
    1233  
    1234    struct __stat64_t64 st;
    1235    long int ret = __stat64_time64 (name, &st) >= 0 ? 1 : -1;
    1236  
    1237    __set_errno (save_errno);
    1238    return ret;
    1239  }
    1240  #endif