1 /* Copyright (C) 1991,1993,1995-1997,1999-2003,2004,2006,2009
2 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
29 #include <sys/param.h>
31 #include <sys/sysinfo.h>
32 #include <sys/types.h>
36 #define NEED_CHECK_SPEC \
37 (!defined _XBS5_ILP32_OFF32 || !defined _XBS5_ILP32_OFFBIG \
38 || !defined _XBS5_LP64_OFF64 || !defined _XBS5_LPBIG_OFFBIG \
39 || !defined _POSIX_V6_ILP32_OFF32 || !defined _POSIX_V6_ILP32_OFFBIG \
40 || !defined _POSIX_V6_LP64_OFF64 || !defined _POSIX_V6_LPBIG_OFFBIG \
41 || !defined _POSIX_V7_ILP32_OFF32 || !defined _POSIX_V7_ILP32_OFFBIG \
42 || !defined _POSIX_V7_LP64_OFF64 || !defined _POSIX_V7_LPBIG_OFFBIG)
44 static long int __sysconf_check_spec (const char *spec
);
48 /* Get the value of the system variable NAME. */
55 /* Also add obsolete or unnecessarily added constants here. */
56 case _SC_EQUIV_CLASS_MAX
:
72 return __get_child_max ();
76 return __getclktck ();
86 return __getdtablesize ();
96 return MAX (__tzname_max (), _POSIX_TZNAME_MAX
);
99 #if _POSIX_JOB_CONTROL > 0
100 return _POSIX_JOB_CONTROL
;
106 #if _POSIX_SAVED_IDS > 0
112 case _SC_REALTIME_SIGNALS
:
113 #if _POSIX_REALTIME_SIGNALS > 0
114 return _POSIX_REALTIME_SIGNALS
;
119 case _SC_PRIORITY_SCHEDULING
:
120 #if _POSIX_PRIORITY_SCHEDULING > 0
121 return _POSIX_PRIORITY_SCHEDULING
;
127 #if _POSIX_TIMERS > 0
128 return _POSIX_TIMERS
;
133 case _SC_ASYNCHRONOUS_IO
:
134 #if _POSIX_ASYNCHRONOUS_IO > 0
135 return _POSIX_ASYNCHRONOUS_IO
;
140 case _SC_PRIORITIZED_IO
:
141 #if _POSIX_PRIORITIZED_IO > 0
142 return _POSIX_PRIORITIZED_IO
;
147 case _SC_SYNCHRONIZED_IO
:
148 #if _POSIX_SYNCHRONIZED_IO > 0
149 return _POSIX_SYNCHRONIZED_IO
;
161 case _SC_MAPPED_FILES
:
162 #if _POSIX_MAPPED_FILES > 0
163 return _POSIX_MAPPED_FILES
;
169 #if _POSIX_MEMLOCK > 0
170 return _POSIX_MEMLOCK
;
175 case _SC_MEMLOCK_RANGE
:
176 #if _POSIX_MEMLOCK_RANGE > 0
177 return _POSIX_MEMLOCK_RANGE
;
182 case _SC_MEMORY_PROTECTION
:
183 #if _POSIX_MEMORY_PROTECTION > 0
184 return _POSIX_MEMORY_PROTECTION
;
189 case _SC_MESSAGE_PASSING
:
190 #if _POSIX_MESSAGE_PASSING > 0
191 return _POSIX_MESSAGE_PASSING
;
197 #if _POSIX_SEMAPHORES > 0
198 return _POSIX_SEMAPHORES
;
203 case _SC_SHARED_MEMORY_OBJECTS
:
204 #if _POSIX_SHARED_MEMORY_OBJECTS > 0
205 return _POSIX_SHARED_MEMORY_OBJECTS
;
211 return _POSIX_VERSION
;
214 return __getpagesize ();
216 case _SC_AIO_LISTIO_MAX
:
217 #ifdef AIO_LISTIO_MAX
218 return AIO_LISTIO_MAX
;
230 case _SC_AIO_PRIO_DELTA_MAX
:
231 #ifdef AIO_PRIO_DELTA_MAX
232 return AIO_PRIO_DELTA_MAX
;
237 case _SC_DELAYTIMER_MAX
:
238 #ifdef DELAYTIMER_MAX
239 return DELAYTIMER_MAX
;
244 case _SC_MQ_OPEN_MAX
:
251 case _SC_MQ_PRIO_MAX
:
265 case _SC_SEM_NSEMS_MAX
:
267 return SEM_NSEMS_MAX
;
272 case _SC_SEM_VALUE_MAX
:
274 return SEM_VALUE_MAX
;
279 case _SC_SIGQUEUE_MAX
:
293 case _SC_BC_BASE_MAX
:
307 case _SC_BC_SCALE_MAX
:
314 case _SC_BC_STRING_MAX
:
316 return BC_STRING_MAX
;
321 case _SC_COLL_WEIGHTS_MAX
:
322 #ifdef COLL_WEIGHTS_MAX
323 return COLL_WEIGHTS_MAX
;
328 case _SC_EXPR_NEST_MAX
:
330 return EXPR_NEST_MAX
;
349 case _SC_CHARCLASS_NAME_MAX
:
350 #ifdef CHARCLASS_NAME_MAX
351 return CHARCLASS_NAME_MAX
;
364 #if _POSIX_PII_XTI > 0
371 #if _POSIX_PII_SOCKET > 0
377 case _SC_PII_INTERNET
:
378 #if _POSIX_PII_INTERNET > 0
385 #if _POSIX_PII_OSI > 0
399 #if _POSIX_SELECT > 0
405 /* The same as _SC_IOV_MAX. */
413 case _SC_PII_INTERNET_STREAM
:
414 #if _POSIX_PII_INTERNET_STREAM > 0
420 case _SC_PII_INTERNET_DGRAM
:
421 #if _POSIX_PII_INTERNET_DGRAM > 0
427 case _SC_PII_OSI_COTS
:
428 #if _POSIX_PII_OSI_COTS > 0
434 case _SC_PII_OSI_CLTS
:
435 #if _POSIX_PII_OSI_CLTS > 0
442 #if _POSIX_PII_OSI_M > 0
456 return _POSIX2_VERSION
;
459 #ifdef _POSIX2_C_BIND
460 return _POSIX2_C_BIND
;
467 return _POSIX2_C_DEV
;
472 case _SC_2_C_VERSION
:
473 #ifdef _POSIX2_C_VERSION
474 return _POSIX2_C_VERSION
;
480 #ifdef _POSIX2_FORT_DEV
481 return _POSIX2_FORT_DEV
;
487 #ifdef _POSIX2_FORT_RUN
488 return _POSIX2_FORT_RUN
;
493 case _SC_2_LOCALEDEF
:
494 #ifdef _POSIX2_LOCALEDEF
495 return _POSIX2_LOCALEDEF
;
501 #ifdef _POSIX2_SW_DEV
502 return _POSIX2_SW_DEV
;
507 case _SC_2_CHAR_TERM
:
508 #ifdef _POSIX2_CHAR_TERM
509 return _POSIX2_CHAR_TERM
;
521 /* POSIX 1003.1c (POSIX Threads). */
523 #if _POSIX_THREADS > 0
524 return _POSIX_THREADS
;
529 case _SC_THREAD_SAFE_FUNCTIONS
:
530 #if _POSIX_THREAD_SAFE_FUNCTIONS > 0
531 return _POSIX_THREAD_SAFE_FUNCTIONS
;
536 case _SC_GETGR_R_SIZE_MAX
:
537 return NSS_BUFLEN_GROUP
;
539 case _SC_GETPW_R_SIZE_MAX
:
540 return NSS_BUFLEN_PASSWD
;
542 case _SC_LOGIN_NAME_MAX
:
543 #ifdef LOGIN_NAME_MAX
544 return LOGIN_NAME_MAX
;
549 case _SC_TTY_NAME_MAX
:
556 case _SC_THREAD_DESTRUCTOR_ITERATIONS
:
557 #if _POSIX_THREAD_DESTRUCTOR_ITERATIONS > 0
558 return _POSIX_THREAD_DESTRUCTOR_ITERATIONS
;
563 case _SC_THREAD_KEYS_MAX
:
564 #ifdef PTHREAD_KEYS_MAX
565 return PTHREAD_KEYS_MAX
;
570 case _SC_THREAD_STACK_MIN
:
571 #ifdef PTHREAD_STACK_MIN
572 return PTHREAD_STACK_MIN
;
577 case _SC_THREAD_THREADS_MAX
:
578 #ifdef PTHREAD_THREADS_MAX
579 return PTHREAD_THREADS_MAX
;
584 case _SC_THREAD_ATTR_STACKADDR
:
585 #if _POSIX_THREAD_ATTR_STACKADDR > 0
586 return _POSIX_THREAD_ATTR_STACKADDR
;
591 case _SC_THREAD_ATTR_STACKSIZE
:
592 #if _POSIX_THREAD_ATTR_STACKSIZE > 0
593 return _POSIX_THREAD_ATTR_STACKSIZE
;
598 case _SC_THREAD_PRIORITY_SCHEDULING
:
599 #if _POSIX_THREAD_PRIORITY_SCHEDULING > 0
600 return _POSIX_THREAD_PRIORITY_SCHEDULING
;
605 case _SC_THREAD_PRIO_INHERIT
:
606 #if _POSIX_THREAD_PRIO_INHERIT > 0
607 return _POSIX_THREAD_PRIO_INHERIT
;
612 case _SC_THREAD_PRIO_PROTECT
:
613 #if _POSIX_THREAD_PRIO_PROTECT > 0
614 return _POSIX_THREAD_PRIO_PROTECT
;
619 case _SC_THREAD_PROCESS_SHARED
:
620 #if _POSIX_THREAD_PROCESS_SHARED > 0
621 return _POSIX_THREAD_PROCESS_SHARED
;
626 case _SC_NPROCESSORS_CONF
:
627 return __get_nprocs_conf ();
629 case _SC_NPROCESSORS_ONLN
:
630 return __get_nprocs ();
633 return __get_phys_pages ();
635 case _SC_AVPHYS_PAGES
:
636 return __get_avphys_pages ();
639 /* We have no limit since we use lists. */
643 /* We have no limit but since the return value might be used to
644 allocate a buffer we restrict the value. */
647 case _SC_XOPEN_VERSION
:
648 return _XOPEN_VERSION
;
650 case _SC_XOPEN_XCU_VERSION
:
651 return _XOPEN_XCU_VERSION
;
656 case _SC_XOPEN_CRYPT
:
663 case _SC_XOPEN_ENH_I18N
:
664 #ifdef _XOPEN_ENH_I18N
665 return _XOPEN_ENH_I18N
;
714 return sizeof (long int) * CHAR_BIT
;
717 return sizeof (int) * CHAR_BIT
;
726 return _POSIX_SSIZE_MAX
;
794 case _SC_XBS5_ILP32_OFF32
:
795 #ifdef _XBS5_ILP32_OFF32
796 return _XBS5_ILP32_OFF32
;
798 return __sysconf_check_spec ("ILP32_OFF32");
800 case _SC_XBS5_ILP32_OFFBIG
:
801 #ifdef _XBS5_ILP32_OFFBIG
802 return _XBS5_ILP32_OFFBIG
;
804 return __sysconf_check_spec ("ILP32_OFFBIG");
806 case _SC_XBS5_LP64_OFF64
:
807 #ifdef _XBS5_LP64_OFF64
808 return _XBS5_LP64_OFF64
;
810 return __sysconf_check_spec ("LP64_OFF64");
812 case _SC_XBS5_LPBIG_OFFBIG
:
813 #ifdef _XBS5_LPBIG_OFFBIG
814 return _XBS5_LPBIG_OFFBIG
;
816 return __sysconf_check_spec ("LPBIG_OFFBIG");
819 case _SC_V6_ILP32_OFF32
:
820 #ifdef _POSIX_V6_ILP32_OFF32
821 return _POSIX_V6_ILP32_OFF32
;
823 return __sysconf_check_spec ("ILP32_OFF32");
825 case _SC_V6_ILP32_OFFBIG
:
826 #ifdef _POSIX_V6_ILP32_OFFBIG
827 return _POSIX_V6_ILP32_OFFBIG
;
829 return __sysconf_check_spec ("ILP32_OFFBIG");
831 case _SC_V6_LP64_OFF64
:
832 #ifdef _POSIX_V6_LP64_OFF64
833 return _POSIX_V6_LP64_OFF64
;
835 return __sysconf_check_spec ("LP64_OFF64");
837 case _SC_V6_LPBIG_OFFBIG
:
838 #ifdef _POSIX_V6_LPBIG_OFFBIG
839 return _POSIX_V6_LPBIG_OFFBIG
;
841 return __sysconf_check_spec ("LPBIG_OFFBIG");
844 case _SC_V7_ILP32_OFF32
:
845 #ifdef _POSIX_V7_ILP32_OFF32
846 return _POSIX_V7_ILP32_OFF32
;
848 return __sysconf_check_spec ("ILP32_OFF32");
850 case _SC_V7_ILP32_OFFBIG
:
851 #ifdef _POSIX_V7_ILP32_OFFBIG
852 return _POSIX_V7_ILP32_OFFBIG
;
854 return __sysconf_check_spec ("ILP32_OFFBIG");
856 case _SC_V7_LP64_OFF64
:
857 #ifdef _POSIX_V7_LP64_OFF64
858 return _POSIX_V7_LP64_OFF64
;
860 return __sysconf_check_spec ("LP64_OFF64");
862 case _SC_V7_LPBIG_OFFBIG
:
863 #ifdef _POSIX_V7_LPBIG_OFFBIG
864 return _POSIX_V7_LPBIG_OFFBIG
;
866 return __sysconf_check_spec ("LPBIG_OFFBIG");
869 case _SC_XOPEN_LEGACY
:
870 return _XOPEN_LEGACY
;
872 case _SC_XOPEN_REALTIME
:
873 #ifdef _XOPEN_REALTIME
874 return _XOPEN_REALTIME
;
878 case _SC_XOPEN_REALTIME_THREADS
:
879 #ifdef _XOPEN_REALTIME_THREADS
880 return _XOPEN_REALTIME_THREADS
;
885 case _SC_ADVISORY_INFO
:
886 #if _POSIX_ADVISORY_INFO > 0
887 return _POSIX_ADVISORY_INFO
;
893 #if _POSIX_BARRIERS > 0
894 return _POSIX_BARRIERS
;
905 case _SC_C_LANG_SUPPORT
:
906 #if _POSIX_C_LANG_SUPPORT > 0
907 return _POSIX_C_LANG_SUPPORT
;
911 case _SC_C_LANG_SUPPORT_R
:
912 #if _POSIX_C_LANG_SUPPORT_R > 0
913 return _POSIX_C_LANG_SUPPORT_R
;
918 case _SC_CLOCK_SELECTION
:
919 #if _POSIX_CLOCK_SELECTION > 0
920 return _POSIX_CLOCK_SELECTION
;
926 #if _POSIX_CPUTIME > 0
927 return _POSIX_CPUTIME
;
933 #if _POSIX_DEVICE_IO > 0
934 return _POSIX_DEVICE_IO
;
938 case _SC_DEVICE_SPECIFIC
:
939 #if _POSIX_DEVICE_SPCIFIC > 0
940 return _POSIX_DEVICE_SPECIFIC
;
944 case _SC_DEVICE_SPECIFIC_R
:
945 #if _POSIX_DEVICE_SPCIFIC_R > 0
946 return _POSIX_DEVICE_SPECIFIC_R
;
952 #if _POSIX_FD_MGMT > 0
953 return _POSIX_FD_MGMT
;
971 case _SC_FILE_ATTRIBUTES
:
972 #if _POSIX_FILE_ATTRIBUTES > 0
973 return _POSIX_FILE_ATTRIBUTES
;
977 case _SC_FILE_LOCKING
:
978 #if _POSIX_FILE_LOCKING > 0
979 return _POSIX_FILE_LOCKING
;
983 case _SC_FILE_SYSTEM
:
984 #if _POSIX_FILE_SYSTEM > 0
985 return _POSIX_FILE_SYSTEM
;
990 case _SC_MONOTONIC_CLOCK
:
991 #if _POSIX_MONOTONIC_CLOCK
992 return _POSIX_MONOTONIC_CLOCK
;
997 case _SC_MULTI_PROCESS
:
998 #if _POSIX_MULTI_PROCESS > 0
999 return _POSIX_MULTI_PROCESS
;
1003 case _SC_SINGLE_PROCESS
:
1004 #if _POSIX_SINGLE_PROCESS > 0
1005 return _POSIX_SINGLE_PROCESS
;
1010 case _SC_NETWORKING
:
1011 #if _POSIX_NETWORKING > 0
1012 return _POSIX_NETWORKING
;
1017 case _SC_READER_WRITER_LOCKS
:
1018 #if _POSIX_READER_WRITER_LOCKS > 0
1019 return _POSIX_READER_WRITER_LOCKS
;
1023 case _SC_SPIN_LOCKS
:
1024 #if _POSIX_SPIN_LOCKS > 0
1025 return _POSIX_SPIN_LOCKS
;
1031 #if _POSIX_REGEXP > 0
1032 return _POSIX_REGEXP
;
1036 case _SC_REGEX_VERSION
:
1037 #if _POSIX_REGEX_VERSION > 0
1038 return _POSIX_REGEX_VERSION
;
1044 #if _POSIX_SHELL > 0
1045 return _POSIX_SHELL
;
1051 #ifdef _POSUX_SIGNALS
1052 return _POSIX_SIGNALS
;
1058 #if _POSIX_SPAWN > 0
1059 return _POSIX_SPAWN
;
1064 case _SC_SPORADIC_SERVER
:
1065 #if _POSIX_SPORADIC_SERVER > 0
1066 return _POSIX_SPORADIC_SERVER
;
1070 case _SC_THREAD_SPORADIC_SERVER
:
1071 #if _POSIX_THREAD_SPORADIC_SERVER > 0
1072 return _POSIX_THREAD_SPORADIC_SERVER
;
1077 case _SC_SYSTEM_DATABASE
:
1078 #if _POSIX_SYSTEM_DATABASE > 0
1079 return _POSIX_SYSTEM_DATABASE
;
1083 case _SC_SYSTEM_DATABASE_R
:
1084 #if _POSIX_SYSTEM_DATABASE_R > 0
1085 return _POSIX_SYSTEM_DATABASE_R
;
1090 case _SC_THREAD_CPUTIME
:
1091 #if _POSIX_THREAD_CPUTIME > 0
1092 return _POSIX_THREAD_CPUTIME
;
1098 #if _POSIX_TIMEOUTS > 0
1099 return _POSIX_TIMEOUTS
;
1104 case _SC_TYPED_MEMORY_OBJECTS
:
1105 #if _POSIX_TYPED_MEMORY_OBJECTS > 0
1106 return _POSIX_TYPED_MEMORY_OBJECTS
;
1111 case _SC_USER_GROUPS
:
1112 #if _POSIX_USER_GROUPS > 0
1113 return _POSIX_USER_GROUPS
;
1117 case _SC_USER_GROUPS_R
:
1118 #if _POSIX_USER_GROUPS_R > 0
1119 return _POSIX_USER_GROUPS_R
;
1130 case _SC_2_PBS_ACCOUNTING
:
1131 #ifdef _POSIX2_PBS_ACCOUNTING
1132 return _POSIX2_PBS_ACCOUNTING
;
1136 case _SC_2_PBS_CHECKPOINT
:
1137 #ifdef _POSIX2_PBS_CHECKPOINT
1138 return _POSIX2_PBS_CHECKPOINT
;
1142 case _SC_2_PBS_LOCATE
:
1143 #ifdef _POSIX2_PBS_LOCATE
1144 return _POSIX2_PBS_LOCATE
;
1148 case _SC_2_PBS_MESSAGE
:
1149 #ifdef _POSIX2_PBS_MESSAGE
1150 return _POSIX2_PBS_MESSAGE
;
1154 case _SC_2_PBS_TRACK
:
1155 #ifdef _POSIX2_PBS_TRACK
1156 return _POSIX2_PBS_TRACK
;
1161 case _SC_SYMLOOP_MAX
:
1169 #ifdef _XOPEN_STREAMS
1170 return _XOPEN_STREAMS
;
1175 case _SC_HOST_NAME_MAX
:
1176 #ifdef HOST_NAME_MAX
1177 return HOST_NAME_MAX
;
1183 #if _POSIX_TRACE > 0
1184 return _POSIX_TRACE
;
1188 case _SC_TRACE_EVENT_FILTER
:
1189 #if _POSIX_TRACE_EVENT_FILTER > 0
1190 return _POSIX_TRACE_EVENT_FILTER
;
1194 case _SC_TRACE_INHERIT
:
1195 #if _POSIX_TRACE_INHERIT > 0
1196 return _POSIX_TRACE_INHERIT
;
1201 #if _POSIX_TRACE_LOG > 0
1202 return _POSIX_TRACE_LOG
;
1207 case _SC_TRACE_EVENT_NAME_MAX
:
1208 case _SC_TRACE_NAME_MAX
:
1209 case _SC_TRACE_SYS_MAX
:
1210 case _SC_TRACE_USER_EVENT_MAX
:
1211 /* No support for tracing. */
1213 case _SC_XOPEN_STREAMS
:
1214 /* No support for STREAMS. */
1217 case _SC_LEVEL1_ICACHE_SIZE
:
1218 case _SC_LEVEL1_ICACHE_ASSOC
:
1219 case _SC_LEVEL1_ICACHE_LINESIZE
:
1220 case _SC_LEVEL1_DCACHE_SIZE
:
1221 case _SC_LEVEL1_DCACHE_ASSOC
:
1222 case _SC_LEVEL1_DCACHE_LINESIZE
:
1223 case _SC_LEVEL2_CACHE_SIZE
:
1224 case _SC_LEVEL2_CACHE_ASSOC
:
1225 case _SC_LEVEL2_CACHE_LINESIZE
:
1226 case _SC_LEVEL3_CACHE_SIZE
:
1227 case _SC_LEVEL3_CACHE_ASSOC
:
1228 case _SC_LEVEL3_CACHE_LINESIZE
:
1229 case _SC_LEVEL4_CACHE_SIZE
:
1230 case _SC_LEVEL4_CACHE_ASSOC
:
1231 /* In general we cannot determine these values. Therefore we
1232 return zero which indicates that no information is
1243 case _SC_RAW_SOCKETS
:
1244 #if _POSIX_RAW_SOCKETS > 0
1245 return _POSIX_RAW_SOCKETS
;
1253 weak_alias (__sysconf
, sysconf
)
1254 libc_hidden_def (__sysconf
)
1258 __sysconf_check_spec (const char *spec
)
1260 int save_errno
= errno
;
1262 const char *getconf_dir
= __secure_getenv ("GETCONF_DIR") ?: GETCONF_DIR
;
1263 size_t getconf_dirlen
= strlen (getconf_dir
);
1264 size_t speclen
= strlen (spec
);
1266 char name
[getconf_dirlen
+ sizeof ("/POSIX_V6_") + speclen
];
1267 memcpy (mempcpy (mempcpy (name
, getconf_dir
, getconf_dirlen
),
1268 "/POSIX_V6_", sizeof ("/POSIX_V6_") - 1),
1272 long int ret
= __xstat64 (_STAT_VER
, name
, &st
) >= 0 ? 1 : -1;
1274 __set_errno (save_errno
);