Replace FSF snail mail address with URLs.
[glibc.git] / sysdeps / posix / sysconf.c
blob1f988d547af3f36b4e0772d1a9820bd00bcb6e09
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/>. */
19 #include <errno.h>
20 #include <limits.h>
21 #include <grp.h>
22 #include <pwd.h>
23 #include <stddef.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <time.h>
28 #include <unistd.h>
29 #include <sys/param.h>
30 #include <sys/stat.h>
31 #include <sys/sysinfo.h>
32 #include <sys/types.h>
33 #include <regex.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)
43 #if NEED_CHECK_SPEC
44 static long int __sysconf_check_spec (const char *spec);
45 #endif
48 /* Get the value of the system variable NAME. */
49 long int
50 __sysconf (name)
51 int name;
53 switch (name)
55 /* Also add obsolete or unnecessarily added constants here. */
56 case _SC_EQUIV_CLASS_MAX:
57 default:
58 __set_errno (EINVAL);
59 return -1;
61 case _SC_ARG_MAX:
62 #ifdef ARG_MAX
63 return ARG_MAX;
64 #else
65 return -1;
66 #endif
68 case _SC_CHILD_MAX:
69 #ifdef CHILD_MAX
70 return CHILD_MAX;
71 #else
72 return __get_child_max ();
73 #endif
75 case _SC_CLK_TCK:
76 return __getclktck ();
78 case _SC_NGROUPS_MAX:
79 #ifdef NGROUPS_MAX
80 return NGROUPS_MAX;
81 #else
82 return -1;
83 #endif
85 case _SC_OPEN_MAX:
86 return __getdtablesize ();
88 case _SC_STREAM_MAX:
89 #ifdef STREAM_MAX
90 return STREAM_MAX;
91 #else
92 return FOPEN_MAX;
93 #endif
95 case _SC_TZNAME_MAX:
96 return MAX (__tzname_max (), _POSIX_TZNAME_MAX);
98 case _SC_JOB_CONTROL:
99 #if _POSIX_JOB_CONTROL > 0
100 return _POSIX_JOB_CONTROL;
101 #else
102 return -1;
103 #endif
105 case _SC_SAVED_IDS:
106 #if _POSIX_SAVED_IDS > 0
107 return 1;
108 #else
109 return -1;
110 #endif
112 case _SC_REALTIME_SIGNALS:
113 #if _POSIX_REALTIME_SIGNALS > 0
114 return _POSIX_REALTIME_SIGNALS;
115 #else
116 return -1;
117 #endif
119 case _SC_PRIORITY_SCHEDULING:
120 #if _POSIX_PRIORITY_SCHEDULING > 0
121 return _POSIX_PRIORITY_SCHEDULING;
122 #else
123 return -1;
124 #endif
126 case _SC_TIMERS:
127 #if _POSIX_TIMERS > 0
128 return _POSIX_TIMERS;
129 #else
130 return -1;
131 #endif
133 case _SC_ASYNCHRONOUS_IO:
134 #if _POSIX_ASYNCHRONOUS_IO > 0
135 return _POSIX_ASYNCHRONOUS_IO;
136 #else
137 return -1;
138 #endif
140 case _SC_PRIORITIZED_IO:
141 #if _POSIX_PRIORITIZED_IO > 0
142 return _POSIX_PRIORITIZED_IO;
143 #else
144 return -1;
145 #endif
147 case _SC_SYNCHRONIZED_IO:
148 #if _POSIX_SYNCHRONIZED_IO > 0
149 return _POSIX_SYNCHRONIZED_IO;
150 #else
151 return -1;
152 #endif
154 case _SC_FSYNC:
155 #if _POSIX_FSYNC > 0
156 return _POSIX_FSYNC;
157 #else
158 return -1;
159 #endif
161 case _SC_MAPPED_FILES:
162 #if _POSIX_MAPPED_FILES > 0
163 return _POSIX_MAPPED_FILES;
164 #else
165 return -1;
166 #endif
168 case _SC_MEMLOCK:
169 #if _POSIX_MEMLOCK > 0
170 return _POSIX_MEMLOCK;
171 #else
172 return -1;
173 #endif
175 case _SC_MEMLOCK_RANGE:
176 #if _POSIX_MEMLOCK_RANGE > 0
177 return _POSIX_MEMLOCK_RANGE;
178 #else
179 return -1;
180 #endif
182 case _SC_MEMORY_PROTECTION:
183 #if _POSIX_MEMORY_PROTECTION > 0
184 return _POSIX_MEMORY_PROTECTION;
185 #else
186 return -1;
187 #endif
189 case _SC_MESSAGE_PASSING:
190 #if _POSIX_MESSAGE_PASSING > 0
191 return _POSIX_MESSAGE_PASSING;
192 #else
193 return -1;
194 #endif
196 case _SC_SEMAPHORES:
197 #if _POSIX_SEMAPHORES > 0
198 return _POSIX_SEMAPHORES;
199 #else
200 return -1;
201 #endif
203 case _SC_SHARED_MEMORY_OBJECTS:
204 #if _POSIX_SHARED_MEMORY_OBJECTS > 0
205 return _POSIX_SHARED_MEMORY_OBJECTS;
206 #else
207 return -1;
208 #endif
210 case _SC_VERSION:
211 return _POSIX_VERSION;
213 case _SC_PAGESIZE:
214 return __getpagesize ();
216 case _SC_AIO_LISTIO_MAX:
217 #ifdef AIO_LISTIO_MAX
218 return AIO_LISTIO_MAX;
219 #else
220 return -1;
221 #endif
223 case _SC_AIO_MAX:
224 #ifdef AIO_MAX
225 return AIO_MAX;
226 #else
227 return -1;
228 #endif
230 case _SC_AIO_PRIO_DELTA_MAX:
231 #ifdef AIO_PRIO_DELTA_MAX
232 return AIO_PRIO_DELTA_MAX;
233 #else
234 return -1;
235 #endif
237 case _SC_DELAYTIMER_MAX:
238 #ifdef DELAYTIMER_MAX
239 return DELAYTIMER_MAX;
240 #else
241 return -1;
242 #endif
244 case _SC_MQ_OPEN_MAX:
245 #ifdef MQ_OPEN_MAX
246 return MQ_OPEN_MAX;
247 #else
248 return -1;
249 #endif
251 case _SC_MQ_PRIO_MAX:
252 #ifdef MQ_PRIO_MAX
253 return MQ_PRIO_MAX;
254 #else
255 return -1;
256 #endif
258 case _SC_RTSIG_MAX:
259 #ifdef RTSIG_MAX
260 return RTSIG_MAX;
261 #else
262 return -1;
263 #endif
265 case _SC_SEM_NSEMS_MAX:
266 #ifdef SEM_NSEMS_MAX
267 return SEM_NSEMS_MAX;
268 #else
269 return -1;
270 #endif
272 case _SC_SEM_VALUE_MAX:
273 #ifdef SEM_VALUE_MAX
274 return SEM_VALUE_MAX;
275 #else
276 return -1;
277 #endif
279 case _SC_SIGQUEUE_MAX:
280 #ifdef SIGQUEUE_MAX
281 return SIGQUEUE_MAX;
282 #else
283 return -1;
284 #endif
286 case _SC_TIMER_MAX:
287 #ifdef TIMER_MAX
288 return TIMER_MAX;
289 #else
290 return -1;
291 #endif
293 case _SC_BC_BASE_MAX:
294 #ifdef BC_BASE_MAX
295 return BC_BASE_MAX;
296 #else
297 return -1;
298 #endif
300 case _SC_BC_DIM_MAX:
301 #ifdef BC_DIM_MAX
302 return BC_DIM_MAX;
303 #else
304 return -1;
305 #endif
307 case _SC_BC_SCALE_MAX:
308 #ifdef BC_SCALE_MAX
309 return BC_SCALE_MAX;
310 #else
311 return -1;
312 #endif
314 case _SC_BC_STRING_MAX:
315 #ifdef BC_STRING_MAX
316 return BC_STRING_MAX;
317 #else
318 return -1;
319 #endif
321 case _SC_COLL_WEIGHTS_MAX:
322 #ifdef COLL_WEIGHTS_MAX
323 return COLL_WEIGHTS_MAX;
324 #else
325 return -1;
326 #endif
328 case _SC_EXPR_NEST_MAX:
329 #ifdef EXPR_NEST_MAX
330 return EXPR_NEST_MAX;
331 #else
332 return -1;
333 #endif
335 case _SC_LINE_MAX:
336 #ifdef LINE_MAX
337 return LINE_MAX;
338 #else
339 return -1;
340 #endif
342 case _SC_RE_DUP_MAX:
343 #ifdef RE_DUP_MAX
344 return RE_DUP_MAX;
345 #else
346 return -1;
347 #endif
349 case _SC_CHARCLASS_NAME_MAX:
350 #ifdef CHARCLASS_NAME_MAX
351 return CHARCLASS_NAME_MAX;
352 #else
353 return -1;
354 #endif
356 case _SC_PII:
357 #if _POSIX_PII > 0
358 return 1;
359 #else
360 return -1;
361 #endif
363 case _SC_PII_XTI:
364 #if _POSIX_PII_XTI > 0
365 return 1;
366 #else
367 return -1;
368 #endif
370 case _SC_PII_SOCKET:
371 #if _POSIX_PII_SOCKET > 0
372 return 1;
373 #else
374 return -1;
375 #endif
377 case _SC_PII_INTERNET:
378 #if _POSIX_PII_INTERNET > 0
379 return 1;
380 #else
381 return -1;
382 #endif
384 case _SC_PII_OSI:
385 #if _POSIX_PII_OSI > 0
386 return 1;
387 #else
388 return -1;
389 #endif
391 case _SC_POLL:
392 #if _POSIX_POLL > 0
393 return 1;
394 #else
395 return -1;
396 #endif
398 case _SC_SELECT:
399 #if _POSIX_SELECT > 0
400 return 1;
401 #else
402 return -1;
403 #endif
405 /* The same as _SC_IOV_MAX. */
406 case _SC_UIO_MAXIOV:
407 #ifdef UIO_MAXIOV
408 return UIO_MAXIOV;
409 #else
410 return -1;
411 #endif
413 case _SC_PII_INTERNET_STREAM:
414 #if _POSIX_PII_INTERNET_STREAM > 0
415 return 1;
416 #else
417 return -1;
418 #endif
420 case _SC_PII_INTERNET_DGRAM:
421 #if _POSIX_PII_INTERNET_DGRAM > 0
422 return 1;
423 #else
424 return -1;
425 #endif
427 case _SC_PII_OSI_COTS:
428 #if _POSIX_PII_OSI_COTS > 0
429 return 1;
430 #else
431 return -1;
432 #endif
434 case _SC_PII_OSI_CLTS:
435 #if _POSIX_PII_OSI_CLTS > 0
436 return 1;
437 #else
438 return -1;
439 #endif
441 case _SC_PII_OSI_M:
442 #if _POSIX_PII_OSI_M > 0
443 return 1;
444 #else
445 return -1;
446 #endif
448 case _SC_T_IOV_MAX:
449 #ifdef _T_IOV_MAX
450 return _T_IOV_MAX;
451 #else
452 return -1;
453 #endif
455 case _SC_2_VERSION:
456 return _POSIX2_VERSION;
458 case _SC_2_C_BIND:
459 #ifdef _POSIX2_C_BIND
460 return _POSIX2_C_BIND;
461 #else
462 return -1;
463 #endif
465 case _SC_2_C_DEV:
466 #ifdef _POSIX2_C_DEV
467 return _POSIX2_C_DEV;
468 #else
469 return -1;
470 #endif
472 case _SC_2_C_VERSION:
473 #ifdef _POSIX2_C_VERSION
474 return _POSIX2_C_VERSION;
475 #else
476 return -1;
477 #endif
479 case _SC_2_FORT_DEV:
480 #ifdef _POSIX2_FORT_DEV
481 return _POSIX2_FORT_DEV;
482 #else
483 return -1;
484 #endif
486 case _SC_2_FORT_RUN:
487 #ifdef _POSIX2_FORT_RUN
488 return _POSIX2_FORT_RUN;
489 #else
490 return -1;
491 #endif
493 case _SC_2_LOCALEDEF:
494 #ifdef _POSIX2_LOCALEDEF
495 return _POSIX2_LOCALEDEF;
496 #else
497 return -1;
498 #endif
500 case _SC_2_SW_DEV:
501 #ifdef _POSIX2_SW_DEV
502 return _POSIX2_SW_DEV;
503 #else
504 return -1;
505 #endif
507 case _SC_2_CHAR_TERM:
508 #ifdef _POSIX2_CHAR_TERM
509 return _POSIX2_CHAR_TERM;
510 #else
511 return -1;
512 #endif
514 case _SC_2_UPE:
515 #ifdef _POSIX2_UPE
516 return _POSIX2_UPE;
517 #else
518 return -1;
519 #endif
521 /* POSIX 1003.1c (POSIX Threads). */
522 case _SC_THREADS:
523 #if _POSIX_THREADS > 0
524 return _POSIX_THREADS;
525 #else
526 return -1;
527 #endif
529 case _SC_THREAD_SAFE_FUNCTIONS:
530 #if _POSIX_THREAD_SAFE_FUNCTIONS > 0
531 return _POSIX_THREAD_SAFE_FUNCTIONS;
532 #else
533 return -1;
534 #endif
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;
545 #else
546 return -1;
547 #endif
549 case _SC_TTY_NAME_MAX:
550 #ifdef TTY_NAME_MAX
551 return TTY_NAME_MAX;
552 #else
553 return -1;
554 #endif
556 case _SC_THREAD_DESTRUCTOR_ITERATIONS:
557 #if _POSIX_THREAD_DESTRUCTOR_ITERATIONS > 0
558 return _POSIX_THREAD_DESTRUCTOR_ITERATIONS;
559 #else
560 return -1;
561 #endif
563 case _SC_THREAD_KEYS_MAX:
564 #ifdef PTHREAD_KEYS_MAX
565 return PTHREAD_KEYS_MAX;
566 #else
567 return -1;
568 #endif
570 case _SC_THREAD_STACK_MIN:
571 #ifdef PTHREAD_STACK_MIN
572 return PTHREAD_STACK_MIN;
573 #else
574 return -1;
575 #endif
577 case _SC_THREAD_THREADS_MAX:
578 #ifdef PTHREAD_THREADS_MAX
579 return PTHREAD_THREADS_MAX;
580 #else
581 return -1;
582 #endif
584 case _SC_THREAD_ATTR_STACKADDR:
585 #if _POSIX_THREAD_ATTR_STACKADDR > 0
586 return _POSIX_THREAD_ATTR_STACKADDR;
587 #else
588 return -1;
589 #endif
591 case _SC_THREAD_ATTR_STACKSIZE:
592 #if _POSIX_THREAD_ATTR_STACKSIZE > 0
593 return _POSIX_THREAD_ATTR_STACKSIZE;
594 #else
595 return -1;
596 #endif
598 case _SC_THREAD_PRIORITY_SCHEDULING:
599 #if _POSIX_THREAD_PRIORITY_SCHEDULING > 0
600 return _POSIX_THREAD_PRIORITY_SCHEDULING;
601 #else
602 return -1;
603 #endif
605 case _SC_THREAD_PRIO_INHERIT:
606 #if _POSIX_THREAD_PRIO_INHERIT > 0
607 return _POSIX_THREAD_PRIO_INHERIT;
608 #else
609 return -1;
610 #endif
612 case _SC_THREAD_PRIO_PROTECT:
613 #if _POSIX_THREAD_PRIO_PROTECT > 0
614 return _POSIX_THREAD_PRIO_PROTECT;
615 #else
616 return -1;
617 #endif
619 case _SC_THREAD_PROCESS_SHARED:
620 #if _POSIX_THREAD_PROCESS_SHARED > 0
621 return _POSIX_THREAD_PROCESS_SHARED;
622 #else
623 return -1;
624 #endif
626 case _SC_NPROCESSORS_CONF:
627 return __get_nprocs_conf ();
629 case _SC_NPROCESSORS_ONLN:
630 return __get_nprocs ();
632 case _SC_PHYS_PAGES:
633 return __get_phys_pages ();
635 case _SC_AVPHYS_PAGES:
636 return __get_avphys_pages ();
638 case _SC_ATEXIT_MAX:
639 /* We have no limit since we use lists. */
640 return INT_MAX;
642 case _SC_PASS_MAX:
643 /* We have no limit but since the return value might be used to
644 allocate a buffer we restrict the value. */
645 return BUFSIZ;
647 case _SC_XOPEN_VERSION:
648 return _XOPEN_VERSION;
650 case _SC_XOPEN_XCU_VERSION:
651 return _XOPEN_XCU_VERSION;
653 case _SC_XOPEN_UNIX:
654 return _XOPEN_UNIX;
656 case _SC_XOPEN_CRYPT:
657 #ifdef _XOPEN_CRYPT
658 return _XOPEN_CRYPT;
659 #else
660 return -1;
661 #endif
663 case _SC_XOPEN_ENH_I18N:
664 #ifdef _XOPEN_ENH_I18N
665 return _XOPEN_ENH_I18N;
666 #else
667 return -1;
668 #endif
670 case _SC_XOPEN_SHM:
671 #ifdef _XOPEN_SHM
672 return _XOPEN_SHM;
673 #else
674 return -1;
675 #endif
677 case _SC_XOPEN_XPG2:
678 #ifdef _XOPEN_XPG2
679 return _XOPEN_XPG2;
680 #else
681 return -1;
682 #endif
684 case _SC_XOPEN_XPG3:
685 #ifdef _XOPEN_XPG3
686 return _XOPEN_XPG3;
687 #else
688 return -1;
689 #endif
691 case _SC_XOPEN_XPG4:
692 #ifdef _XOPEN_XPG4
693 return _XOPEN_XPG4;
694 #else
695 return -1;
696 #endif
698 case _SC_CHAR_BIT:
699 return CHAR_BIT;
701 case _SC_CHAR_MAX:
702 return CHAR_MAX;
704 case _SC_CHAR_MIN:
705 return CHAR_MIN;
707 case _SC_INT_MAX:
708 return INT_MAX;
710 case _SC_INT_MIN:
711 return INT_MIN;
713 case _SC_LONG_BIT:
714 return sizeof (long int) * CHAR_BIT;
716 case _SC_WORD_BIT:
717 return sizeof (int) * CHAR_BIT;
719 case _SC_MB_LEN_MAX:
720 return MB_LEN_MAX;
722 case _SC_NZERO:
723 return NZERO;
725 case _SC_SSIZE_MAX:
726 return _POSIX_SSIZE_MAX;
728 case _SC_SCHAR_MAX:
729 return SCHAR_MAX;
731 case _SC_SCHAR_MIN:
732 return SCHAR_MIN;
734 case _SC_SHRT_MAX:
735 return SHRT_MAX;
737 case _SC_SHRT_MIN:
738 return SHRT_MIN;
740 case _SC_UCHAR_MAX:
741 return UCHAR_MAX;
743 case _SC_UINT_MAX:
744 return UINT_MAX;
746 case _SC_ULONG_MAX:
747 return ULONG_MAX;
749 case _SC_USHRT_MAX:
750 return USHRT_MAX;
752 case _SC_NL_ARGMAX:
753 #ifdef NL_ARGMAX
754 return NL_ARGMAX;
755 #else
756 return -1;
757 #endif
759 case _SC_NL_LANGMAX:
760 #ifdef NL_LANGMAX
761 return NL_LANGMAX;
762 #else
763 return -1;
764 #endif
766 case _SC_NL_MSGMAX:
767 #ifdef NL_MSGMAX
768 return NL_MSGMAX;
769 #else
770 return -1;
771 #endif
773 case _SC_NL_NMAX:
774 #ifdef NL_NMAX
775 return NL_NMAX;
776 #else
777 return -1;
778 #endif
780 case _SC_NL_SETMAX:
781 #ifdef NL_SETMAX
782 return NL_SETMAX;
783 #else
784 return -1;
785 #endif
787 case _SC_NL_TEXTMAX:
788 #ifdef NL_TEXTMAX
789 return NL_TEXTMAX;
790 #else
791 return -1;
792 #endif
794 case _SC_XBS5_ILP32_OFF32:
795 #ifdef _XBS5_ILP32_OFF32
796 return _XBS5_ILP32_OFF32;
797 #else
798 return __sysconf_check_spec ("ILP32_OFF32");
799 #endif
800 case _SC_XBS5_ILP32_OFFBIG:
801 #ifdef _XBS5_ILP32_OFFBIG
802 return _XBS5_ILP32_OFFBIG;
803 #else
804 return __sysconf_check_spec ("ILP32_OFFBIG");
805 #endif
806 case _SC_XBS5_LP64_OFF64:
807 #ifdef _XBS5_LP64_OFF64
808 return _XBS5_LP64_OFF64;
809 #else
810 return __sysconf_check_spec ("LP64_OFF64");
811 #endif
812 case _SC_XBS5_LPBIG_OFFBIG:
813 #ifdef _XBS5_LPBIG_OFFBIG
814 return _XBS5_LPBIG_OFFBIG;
815 #else
816 return __sysconf_check_spec ("LPBIG_OFFBIG");
817 #endif
819 case _SC_V6_ILP32_OFF32:
820 #ifdef _POSIX_V6_ILP32_OFF32
821 return _POSIX_V6_ILP32_OFF32;
822 #else
823 return __sysconf_check_spec ("ILP32_OFF32");
824 #endif
825 case _SC_V6_ILP32_OFFBIG:
826 #ifdef _POSIX_V6_ILP32_OFFBIG
827 return _POSIX_V6_ILP32_OFFBIG;
828 #else
829 return __sysconf_check_spec ("ILP32_OFFBIG");
830 #endif
831 case _SC_V6_LP64_OFF64:
832 #ifdef _POSIX_V6_LP64_OFF64
833 return _POSIX_V6_LP64_OFF64;
834 #else
835 return __sysconf_check_spec ("LP64_OFF64");
836 #endif
837 case _SC_V6_LPBIG_OFFBIG:
838 #ifdef _POSIX_V6_LPBIG_OFFBIG
839 return _POSIX_V6_LPBIG_OFFBIG;
840 #else
841 return __sysconf_check_spec ("LPBIG_OFFBIG");
842 #endif
844 case _SC_V7_ILP32_OFF32:
845 #ifdef _POSIX_V7_ILP32_OFF32
846 return _POSIX_V7_ILP32_OFF32;
847 #else
848 return __sysconf_check_spec ("ILP32_OFF32");
849 #endif
850 case _SC_V7_ILP32_OFFBIG:
851 #ifdef _POSIX_V7_ILP32_OFFBIG
852 return _POSIX_V7_ILP32_OFFBIG;
853 #else
854 return __sysconf_check_spec ("ILP32_OFFBIG");
855 #endif
856 case _SC_V7_LP64_OFF64:
857 #ifdef _POSIX_V7_LP64_OFF64
858 return _POSIX_V7_LP64_OFF64;
859 #else
860 return __sysconf_check_spec ("LP64_OFF64");
861 #endif
862 case _SC_V7_LPBIG_OFFBIG:
863 #ifdef _POSIX_V7_LPBIG_OFFBIG
864 return _POSIX_V7_LPBIG_OFFBIG;
865 #else
866 return __sysconf_check_spec ("LPBIG_OFFBIG");
867 #endif
869 case _SC_XOPEN_LEGACY:
870 return _XOPEN_LEGACY;
872 case _SC_XOPEN_REALTIME:
873 #ifdef _XOPEN_REALTIME
874 return _XOPEN_REALTIME;
875 #else
876 return -1;
877 #endif
878 case _SC_XOPEN_REALTIME_THREADS:
879 #ifdef _XOPEN_REALTIME_THREADS
880 return _XOPEN_REALTIME_THREADS;
881 #else
882 return -1;
883 #endif
885 case _SC_ADVISORY_INFO:
886 #if _POSIX_ADVISORY_INFO > 0
887 return _POSIX_ADVISORY_INFO;
888 #else
889 return -1;
890 #endif
892 case _SC_BARRIERS:
893 #if _POSIX_BARRIERS > 0
894 return _POSIX_BARRIERS;
895 #else
896 return -1;
897 #endif
899 case _SC_BASE:
900 #if _POSIX_BASE > 0
901 return _POSIX_BASE;
902 #else
903 return -1;
904 #endif
905 case _SC_C_LANG_SUPPORT:
906 #if _POSIX_C_LANG_SUPPORT > 0
907 return _POSIX_C_LANG_SUPPORT;
908 #else
909 return -1;
910 #endif
911 case _SC_C_LANG_SUPPORT_R:
912 #if _POSIX_C_LANG_SUPPORT_R > 0
913 return _POSIX_C_LANG_SUPPORT_R;
914 #else
915 return -1;
916 #endif
918 case _SC_CLOCK_SELECTION:
919 #if _POSIX_CLOCK_SELECTION > 0
920 return _POSIX_CLOCK_SELECTION;
921 #else
922 return -1;
923 #endif
925 case _SC_CPUTIME:
926 #if _POSIX_CPUTIME > 0
927 return _POSIX_CPUTIME;
928 #else
929 return -1;
930 #endif
932 case _SC_DEVICE_IO:
933 #if _POSIX_DEVICE_IO > 0
934 return _POSIX_DEVICE_IO;
935 #else
936 return -1;
937 #endif
938 case _SC_DEVICE_SPECIFIC:
939 #if _POSIX_DEVICE_SPCIFIC > 0
940 return _POSIX_DEVICE_SPECIFIC;
941 #else
942 return -1;
943 #endif
944 case _SC_DEVICE_SPECIFIC_R:
945 #if _POSIX_DEVICE_SPCIFIC_R > 0
946 return _POSIX_DEVICE_SPECIFIC_R;
947 #else
948 return -1;
949 #endif
951 case _SC_FD_MGMT:
952 #if _POSIX_FD_MGMT > 0
953 return _POSIX_FD_MGMT;
954 #else
955 return -1;
956 #endif
958 case _SC_FIFO:
959 #if _POSIX_FIFO > 0
960 return _POSIX_FIFO;
961 #else
962 return -1;
963 #endif
964 case _SC_PIPE:
965 #if _POSIX_PIPE > 0
966 return _POSIX_PIPE;
967 #else
968 return -1;
969 #endif
971 case _SC_FILE_ATTRIBUTES:
972 #if _POSIX_FILE_ATTRIBUTES > 0
973 return _POSIX_FILE_ATTRIBUTES;
974 #else
975 return -1;
976 #endif
977 case _SC_FILE_LOCKING:
978 #if _POSIX_FILE_LOCKING > 0
979 return _POSIX_FILE_LOCKING;
980 #else
981 return -1;
982 #endif
983 case _SC_FILE_SYSTEM:
984 #if _POSIX_FILE_SYSTEM > 0
985 return _POSIX_FILE_SYSTEM;
986 #else
987 return -1;
988 #endif
990 case _SC_MONOTONIC_CLOCK:
991 #if _POSIX_MONOTONIC_CLOCK
992 return _POSIX_MONOTONIC_CLOCK;
993 #else
994 return -1;
995 #endif
997 case _SC_MULTI_PROCESS:
998 #if _POSIX_MULTI_PROCESS > 0
999 return _POSIX_MULTI_PROCESS;
1000 #else
1001 return -1;
1002 #endif
1003 case _SC_SINGLE_PROCESS:
1004 #if _POSIX_SINGLE_PROCESS > 0
1005 return _POSIX_SINGLE_PROCESS;
1006 #else
1007 return -1;
1008 #endif
1010 case _SC_NETWORKING:
1011 #if _POSIX_NETWORKING > 0
1012 return _POSIX_NETWORKING;
1013 #else
1014 return -1;
1015 #endif
1017 case _SC_READER_WRITER_LOCKS:
1018 #if _POSIX_READER_WRITER_LOCKS > 0
1019 return _POSIX_READER_WRITER_LOCKS;
1020 #else
1021 return -1;
1022 #endif
1023 case _SC_SPIN_LOCKS:
1024 #if _POSIX_SPIN_LOCKS > 0
1025 return _POSIX_SPIN_LOCKS;
1026 #else
1027 return -1;
1028 #endif
1030 case _SC_REGEXP:
1031 #if _POSIX_REGEXP > 0
1032 return _POSIX_REGEXP;
1033 #else
1034 return -1;
1035 #endif
1036 case _SC_REGEX_VERSION:
1037 #if _POSIX_REGEX_VERSION > 0
1038 return _POSIX_REGEX_VERSION;
1039 #else
1040 return -1;
1041 #endif
1043 case _SC_SHELL:
1044 #if _POSIX_SHELL > 0
1045 return _POSIX_SHELL;
1046 #else
1047 return -1;
1048 #endif
1050 case _SC_SIGNALS:
1051 #ifdef _POSUX_SIGNALS
1052 return _POSIX_SIGNALS;
1053 #else
1054 return -1;
1055 #endif
1057 case _SC_SPAWN:
1058 #if _POSIX_SPAWN > 0
1059 return _POSIX_SPAWN;
1060 #else
1061 return -1;
1062 #endif
1064 case _SC_SPORADIC_SERVER:
1065 #if _POSIX_SPORADIC_SERVER > 0
1066 return _POSIX_SPORADIC_SERVER;
1067 #else
1068 return -1;
1069 #endif
1070 case _SC_THREAD_SPORADIC_SERVER:
1071 #if _POSIX_THREAD_SPORADIC_SERVER > 0
1072 return _POSIX_THREAD_SPORADIC_SERVER;
1073 #else
1074 return -1;
1075 #endif
1077 case _SC_SYSTEM_DATABASE:
1078 #if _POSIX_SYSTEM_DATABASE > 0
1079 return _POSIX_SYSTEM_DATABASE;
1080 #else
1081 return -1;
1082 #endif
1083 case _SC_SYSTEM_DATABASE_R:
1084 #if _POSIX_SYSTEM_DATABASE_R > 0
1085 return _POSIX_SYSTEM_DATABASE_R;
1086 #else
1087 return -1;
1088 #endif
1090 case _SC_THREAD_CPUTIME:
1091 #if _POSIX_THREAD_CPUTIME > 0
1092 return _POSIX_THREAD_CPUTIME;
1093 #else
1094 return -1;
1095 #endif
1097 case _SC_TIMEOUTS:
1098 #if _POSIX_TIMEOUTS > 0
1099 return _POSIX_TIMEOUTS;
1100 #else
1101 return -1;
1102 #endif
1104 case _SC_TYPED_MEMORY_OBJECTS:
1105 #if _POSIX_TYPED_MEMORY_OBJECTS > 0
1106 return _POSIX_TYPED_MEMORY_OBJECTS;
1107 #else
1108 return -1;
1109 #endif
1111 case _SC_USER_GROUPS:
1112 #if _POSIX_USER_GROUPS > 0
1113 return _POSIX_USER_GROUPS;
1114 #else
1115 return -1;
1116 #endif
1117 case _SC_USER_GROUPS_R:
1118 #if _POSIX_USER_GROUPS_R > 0
1119 return _POSIX_USER_GROUPS_R;
1120 #else
1121 return -1;
1122 #endif
1124 case _SC_2_PBS:
1125 #ifdef _POSIX2_PBS
1126 return _POSIX2_PBS;
1127 #else
1128 return -1;
1129 #endif
1130 case _SC_2_PBS_ACCOUNTING:
1131 #ifdef _POSIX2_PBS_ACCOUNTING
1132 return _POSIX2_PBS_ACCOUNTING;
1133 #else
1134 return -1;
1135 #endif
1136 case _SC_2_PBS_CHECKPOINT:
1137 #ifdef _POSIX2_PBS_CHECKPOINT
1138 return _POSIX2_PBS_CHECKPOINT;
1139 #else
1140 return -1;
1141 #endif
1142 case _SC_2_PBS_LOCATE:
1143 #ifdef _POSIX2_PBS_LOCATE
1144 return _POSIX2_PBS_LOCATE;
1145 #else
1146 return -1;
1147 #endif
1148 case _SC_2_PBS_MESSAGE:
1149 #ifdef _POSIX2_PBS_MESSAGE
1150 return _POSIX2_PBS_MESSAGE;
1151 #else
1152 return -1;
1153 #endif
1154 case _SC_2_PBS_TRACK:
1155 #ifdef _POSIX2_PBS_TRACK
1156 return _POSIX2_PBS_TRACK;
1157 #else
1158 return -1;
1159 #endif
1161 case _SC_SYMLOOP_MAX:
1162 #ifdef SYMLOOP_MAX
1163 return SYMLOOP_MAX;
1164 #else
1165 return -1;
1166 #endif
1168 case _SC_STREAMS:
1169 #ifdef _XOPEN_STREAMS
1170 return _XOPEN_STREAMS;
1171 #else
1172 return -1;
1173 #endif
1175 case _SC_HOST_NAME_MAX:
1176 #ifdef HOST_NAME_MAX
1177 return HOST_NAME_MAX;
1178 #else
1179 return -1;
1180 #endif
1182 case _SC_TRACE:
1183 #if _POSIX_TRACE > 0
1184 return _POSIX_TRACE;
1185 #else
1186 return -1;
1187 #endif
1188 case _SC_TRACE_EVENT_FILTER:
1189 #if _POSIX_TRACE_EVENT_FILTER > 0
1190 return _POSIX_TRACE_EVENT_FILTER;
1191 #else
1192 return -1;
1193 #endif
1194 case _SC_TRACE_INHERIT:
1195 #if _POSIX_TRACE_INHERIT > 0
1196 return _POSIX_TRACE_INHERIT;
1197 #else
1198 return -1;
1199 #endif
1200 case _SC_TRACE_LOG:
1201 #if _POSIX_TRACE_LOG > 0
1202 return _POSIX_TRACE_LOG;
1203 #else
1204 return -1;
1205 #endif
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. */
1215 return -1;
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
1233 available. */
1234 return 0;
1236 case _SC_IPV6:
1237 #if _POSIX_IPV6 > 0
1238 return _POSIX_IPV6;
1239 #else
1240 return -1;
1241 #endif
1243 case _SC_RAW_SOCKETS:
1244 #if _POSIX_RAW_SOCKETS > 0
1245 return _POSIX_RAW_SOCKETS;
1246 #else
1247 return -1;
1248 #endif
1252 #undef __sysconf
1253 weak_alias (__sysconf, sysconf)
1254 libc_hidden_def (__sysconf)
1256 #if NEED_CHECK_SPEC
1257 static long int
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),
1269 spec, speclen + 1);
1271 struct stat64 st;
1272 long int ret = __xstat64 (_STAT_VER, name, &st) >= 0 ? 1 : -1;
1274 __set_errno (save_errno);
1275 return ret;
1277 #endif