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
52static long int __sysconf_check_spec (const char *spec);
53#endif
54
55
56/* Get the value of the system variable NAME. */
57long 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
1216weak_alias (__sysconf, sysconf)
1217libc_hidden_def (__sysconf)
1218
1219#if NEED_CHECK_SPEC
1220static 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
1241