blob: d861f514b787ec40f62dcd6a9c3a776df47aa6bc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
/* Test of <fcntl.h> substitute.
Copyright (C) 2007, 2009-2018 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
#include <config.h>
#include <fcntl.h>
/* Check that the various O_* macros are defined. */
int o = (O_DIRECT | O_DIRECTORY | O_DSYNC | O_IGNORE_CTTY | O_NDELAY | O_NOATIME
| O_NONBLOCK | O_NOCTTY | O_NOFOLLOW | O_NOLINK | O_NOLINKS | O_NOTRANS
| O_RSYNC | O_SYNC | O_TTY_INIT | O_BINARY | O_TEXT);
/* Check that the various SEEK_* macros are defined. */
int sk[] = { SEEK_CUR, SEEK_END, SEEK_SET };
/* Check that the FD_* macros are defined. */
int i = FD_CLOEXEC;
/* Check that the types are all defined. */
pid_t t1;
off_t t2;
mode_t t3;
int
main (void)
{
/* Ensure no overlap in SEEK_*. */
switch (0)
{
case SEEK_CUR:
case SEEK_END:
case SEEK_SET:
;
}
/* Ensure no dangerous overlap in non-zero gnulib-defined replacements. */
switch (O_RDONLY)
{
/* Access modes */
case O_RDONLY:
case O_WRONLY:
case O_RDWR:
#if O_EXEC && O_EXEC != O_RDONLY
case O_EXEC:
#endif
#if O_SEARCH && O_EXEC != O_SEARCH && O_SEARCH != O_RDONLY
case O_SEARCH:
#endif
i = ! (~O_ACCMODE & (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH));
break;
/* Everyone should have these */
case O_CREAT:
case O_EXCL:
case O_TRUNC:
case O_APPEND:
break;
/* These might be 0 or O_RDONLY, only test non-zero versions. */
#if O_CLOEXEC
case O_CLOEXEC:
#endif
#if O_DIRECT
case O_DIRECT:
#endif
#if O_DIRECTORY
case O_DIRECTORY:
#endif
#if O_DSYNC
case O_DSYNC:
#endif
#if O_IGNORE_CTTY
case O_IGNORE_CTTY:
#endif
#if O_NOATIME
case O_NOATIME:
#endif
#if O_NONBLOCK
case O_NONBLOCK:
#endif
#if O_NOCTTY
case O_NOCTTY:
#endif
#if O_NOFOLLOW
case O_NOFOLLOW:
#endif
#if O_NOLINK
case O_NOLINK:
#endif
#if O_NOLINKS
case O_NOLINKS:
#endif
#if O_NOTRANS
case O_NOTRANS:
#endif
#if O_RSYNC && O_RSYNC != O_DSYNC
case O_RSYNC:
#endif
#if O_SYNC && O_SYNC != O_DSYNC && O_SYNC != O_RSYNC
case O_SYNC:
#endif
#if O_TTY_INIT
case O_TTY_INIT:
#endif
#if O_BINARY
case O_BINARY:
#endif
#if O_TEXT
case O_TEXT:
#endif
;
}
return !i;
}
|