packaing: switch off build_html
[platform/upstream/glibc.git] / sysdeps / posix / sysconf.c
1 /* Copyright (C) 1991-2024 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