|  | #include <stdbool.h> | 
|  | #include <stdio.h> | 
|  | #include <unistd.h> | 
|  |  | 
|  | static struct | 
|  | { | 
|  | long int _P_val; | 
|  | const char *name; | 
|  | int _SC_val; | 
|  | bool positive; | 
|  | bool posix2; | 
|  | } posix_options[] = | 
|  | { | 
|  | #define N_(name, pos) { _POSIX_##name, #name, _SC_##name, pos, false } | 
|  | #define NP(name) N_ (name, true) | 
|  | #define N(name) N_ (name, false) | 
|  | #define N2(name) { _POSIX2_##name, #name, _SC_2_##name, false, true } | 
|  | N (ADVISORY_INFO), | 
|  | N (ASYNCHRONOUS_IO), | 
|  | N (BARRIERS), | 
|  | N (CLOCK_SELECTION), | 
|  | N (CPUTIME), | 
|  | N (FSYNC), | 
|  | N (IPV6), | 
|  | NP (JOB_CONTROL), | 
|  | N (MAPPED_FILES), | 
|  | N (MEMLOCK), | 
|  | N (MEMLOCK_RANGE), | 
|  | N (MEMORY_PROTECTION), | 
|  | N (MESSAGE_PASSING), | 
|  | N (MONOTONIC_CLOCK), | 
|  | #ifdef _POSIX_PRIORITIZED_IO | 
|  | N (PRIORITIZED_IO), | 
|  | #endif | 
|  | #ifdef _POSIX_PRIORITY_SCHEDULING | 
|  | N (PRIORITY_SCHEDULING), | 
|  | #endif | 
|  | N (RAW_SOCKETS), | 
|  | N (READER_WRITER_LOCKS), | 
|  | N (REALTIME_SIGNALS), | 
|  | NP (REGEXP), | 
|  | NP (SAVED_IDS), | 
|  | N (SEMAPHORES), | 
|  | N (SHARED_MEMORY_OBJECTS), | 
|  | NP (SHELL), | 
|  | N (SPAWN), | 
|  | N (SPIN_LOCKS), | 
|  | N (SPORADIC_SERVER), | 
|  | #ifdef _POSIX_SYNCHRONIZED_IO | 
|  | N (SYNCHRONIZED_IO), | 
|  | #endif | 
|  | N (THREAD_ATTR_STACKADDR), | 
|  | N (THREAD_ATTR_STACKSIZE), | 
|  | N (THREAD_CPUTIME), | 
|  | N (THREAD_PRIO_INHERIT), | 
|  | N (THREAD_PRIO_PROTECT), | 
|  | N (THREAD_PRIORITY_SCHEDULING), | 
|  | N (THREAD_PROCESS_SHARED), | 
|  | N (THREAD_SAFE_FUNCTIONS), | 
|  | N (THREAD_SPORADIC_SERVER), | 
|  | N (THREADS), | 
|  | N (TIMEOUTS), | 
|  | N (TIMERS), | 
|  | N (TRACE), | 
|  | N (TRACE_EVENT_FILTER), | 
|  | N (TRACE_INHERIT), | 
|  | N (TRACE_LOG), | 
|  | N (TYPED_MEMORY_OBJECTS), | 
|  | N2 (C_BIND), | 
|  | N2 (C_DEV), | 
|  | N2 (CHAR_TERM) | 
|  | }; | 
|  | #define nposix_options (sizeof (posix_options) / sizeof (posix_options[0])) | 
|  |  | 
|  | static int | 
|  | do_test (void) | 
|  | { | 
|  | int result = 0; | 
|  |  | 
|  | for (int i = 0; i < nposix_options; ++i) | 
|  | { | 
|  | long int scret = sysconf (posix_options[i]._SC_val); | 
|  |  | 
|  | if (scret == 0) | 
|  | { | 
|  | printf ("sysconf(_SC_%s%s) returned zero\n", | 
|  | posix_options[i].posix2 ? "2_" : "", posix_options[i].name); | 
|  | result = 1; | 
|  | } | 
|  | if (posix_options[i]._P_val != 0 && posix_options[i]._P_val != scret) | 
|  | { | 
|  | printf ("sysconf(_SC_%s%s) = %ld does not match _POSIX%s_%s = %ld\n", | 
|  | posix_options[i].posix2 ? "2_" : "", posix_options[i].name, | 
|  | scret, | 
|  | posix_options[i].posix2 ? "2" : "", posix_options[i].name, | 
|  | posix_options[i]._P_val); | 
|  | result = 1; | 
|  | } | 
|  | else if (posix_options[i].positive && scret < 0) | 
|  | { | 
|  | printf ("sysconf(_SC_%s%s) must be > 0\n", | 
|  | posix_options[i].posix2 ? "2_" : "", posix_options[i].name); | 
|  | result = 1; | 
|  | } | 
|  |  | 
|  | #define STDVER 200809L | 
|  | if (scret > 0 && scret != STDVER && !posix_options[i].positive) | 
|  | { | 
|  | printf ("sysconf(_SC_%s%s) must be %ldL\n", | 
|  | posix_options[i].posix2 ? "2_" : "", posix_options[i].name, | 
|  | STDVER); | 
|  | result = 1; | 
|  | } | 
|  | } | 
|  |  | 
|  | return result; | 
|  | } | 
|  |  | 
|  | #define TEST_FUNCTION do_test () | 
|  | #include "../test-skeleton.c" |