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