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