#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"