1 | #include <stdbool.h>
|
---|
2 | #include <stdio.h>
|
---|
3 | #include <unistd.h>
|
---|
4 |
|
---|
5 | static struct
|
---|
6 | {
|
---|
7 | long int _P_val;
|
---|
8 | const char *name;
|
---|
9 | int _SC_val;
|
---|
10 | bool positive;
|
---|
11 | bool posix2;
|
---|
12 | } posix_options[] =
|
---|
13 | {
|
---|
14 | #define N_(name, pos) { _POSIX_##name, #name, _SC_##name, pos, false }
|
---|
15 | #define NP(name) N_ (name, true)
|
---|
16 | #define N(name) N_ (name, false)
|
---|
17 | #define N2(name) { _POSIX2_##name, #name, _SC_2_##name, false, true }
|
---|
18 | N (ADVISORY_INFO),
|
---|
19 | N (ASYNCHRONOUS_IO),
|
---|
20 | N (BARRIERS),
|
---|
21 | N (CLOCK_SELECTION),
|
---|
22 | N (CPUTIME),
|
---|
23 | N (FSYNC),
|
---|
24 | N (IPV6),
|
---|
25 | NP (JOB_CONTROL),
|
---|
26 | N (MAPPED_FILES),
|
---|
27 | N (MEMLOCK),
|
---|
28 | N (MEMLOCK_RANGE),
|
---|
29 | N (MEMORY_PROTECTION),
|
---|
30 | N (MESSAGE_PASSING),
|
---|
31 | N (MONOTONIC_CLOCK),
|
---|
32 | N (PRIORITIZED_IO),
|
---|
33 | N (PRIORITY_SCHEDULING),
|
---|
34 | N (RAW_SOCKETS),
|
---|
35 | N (READER_WRITER_LOCKS),
|
---|
36 | N (REALTIME_SIGNALS),
|
---|
37 | NP (REGEXP),
|
---|
38 | NP (SAVED_IDS),
|
---|
39 | N (SEMAPHORES),
|
---|
40 | N (SHARED_MEMORY_OBJECTS),
|
---|
41 | NP (SHELL),
|
---|
42 | N (SPAWN),
|
---|
43 | N (SPIN_LOCKS),
|
---|
44 | N (SPORADIC_SERVER),
|
---|
45 | N (SYNCHRONIZED_IO),
|
---|
46 | N (THREAD_ATTR_STACKADDR),
|
---|
47 | N (THREAD_ATTR_STACKSIZE),
|
---|
48 | N (THREAD_CPUTIME),
|
---|
49 | N (THREAD_PRIO_INHERIT),
|
---|
50 | N (THREAD_PRIO_PROTECT),
|
---|
51 | N (THREAD_PRIORITY_SCHEDULING),
|
---|
52 | N (THREAD_PROCESS_SHARED),
|
---|
53 | N (THREAD_SAFE_FUNCTIONS),
|
---|
54 | N (THREAD_SPORADIC_SERVER),
|
---|
55 | N (THREADS),
|
---|
56 | N (TIMEOUTS),
|
---|
57 | N (TIMERS),
|
---|
58 | N (TRACE),
|
---|
59 | N (TRACE_EVENT_FILTER),
|
---|
60 | N (TRACE_INHERIT),
|
---|
61 | N (TRACE_LOG),
|
---|
62 | N (TYPED_MEMORY_OBJECTS),
|
---|
63 | N2 (C_BIND),
|
---|
64 | N2 (C_DEV),
|
---|
65 | N2 (CHAR_TERM)
|
---|
66 | };
|
---|
67 | #define nposix_options (sizeof (posix_options) / sizeof (posix_options[0]))
|
---|
68 |
|
---|
69 | static int
|
---|
70 | do_test (void)
|
---|
71 | {
|
---|
72 | int result = 0;
|
---|
73 |
|
---|
74 | for (int i = 0; i < nposix_options; ++i)
|
---|
75 | {
|
---|
76 | long int scret = sysconf (posix_options[i]._SC_val);
|
---|
77 |
|
---|
78 | if (scret == 0)
|
---|
79 | {
|
---|
80 | printf ("sysconf(_SC_%s%s) returned zero\n",
|
---|
81 | posix_options[i].posix2 ? "2_" : "", posix_options[i].name);
|
---|
82 | result = 1;
|
---|
83 | }
|
---|
84 | if (posix_options[i]._P_val != 0 && posix_options[i]._P_val != scret)
|
---|
85 | {
|
---|
86 | printf ("sysconf(_SC_%s%s) = %ld does not match _POSIX%s_%s = %ld\n",
|
---|
87 | posix_options[i].posix2 ? "2_" : "", posix_options[i].name,
|
---|
88 | scret,
|
---|
89 | posix_options[i].posix2 ? "2" : "", posix_options[i].name,
|
---|
90 | posix_options[i]._P_val);
|
---|
91 | result = 1;
|
---|
92 | }
|
---|
93 | else if (posix_options[i].positive && scret < 0)
|
---|
94 | {
|
---|
95 | printf ("sysconf(_SC_%s%s) must be > 0\n",
|
---|
96 | posix_options[i].posix2 ? "2_" : "", posix_options[i].name);
|
---|
97 | result = 1;
|
---|
98 | }
|
---|
99 |
|
---|
100 | #define STDVER 200112L
|
---|
101 | if (scret > 0 && scret != STDVER && !posix_options[i].positive)
|
---|
102 | {
|
---|
103 | printf ("sysconf(_SC_%s%s) must be %ldL\n",
|
---|
104 | posix_options[i].posix2 ? "2_" : "", posix_options[i].name,
|
---|
105 | STDVER);
|
---|
106 | result = 1;
|
---|
107 | }
|
---|
108 | }
|
---|
109 |
|
---|
110 | return result;
|
---|
111 | }
|
---|
112 |
|
---|
113 | #define TEST_FUNCTION do_test ()
|
---|
114 | #include "../test-skeleton.c"
|
---|