Branch data Line data Source code
1 : : /* Checking macros for fcntl functions.
2 : : Copyright (C) 2007 Free Software Foundation, Inc.
3 : : This file is part of the GNU C Library.
4 : :
5 : : The GNU C Library is free software; you can redistribute it and/or
6 : : modify it under the terms of the GNU Lesser General Public
7 : : License as published by the Free Software Foundation; either
8 : : version 2.1 of the License, or (at your option) any later version.
9 : :
10 : : The GNU C Library is distributed in the hope that it will be useful,
11 : : but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 : : Lesser General Public License for more details.
14 : :
15 : : You should have received a copy of the GNU Lesser General Public
16 : : License along with the GNU C Library; if not, write to the Free
17 : : Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 : : 02111-1307 USA. */
19 : :
20 : : #ifndef _FCNTL_H
21 : : # error "Never include <bits/fcntl2.h> directly; use <fcntl.h> instead."
22 : : #endif
23 : :
24 : : /* Check that calls to open and openat with O_CREAT set have an
25 : : appropriate third/fourth parameter. */
26 : : #ifndef __USE_FILE_OFFSET64
27 : : extern int __open_2 (__const char *__path, int __oflag) __nonnull ((1));
28 : : extern int __REDIRECT (__open_alias, (__const char *__path, int __oflag, ...),
29 : : open) __nonnull ((1));
30 : : #else
31 : : extern int __REDIRECT (__open_2, (__const char *__path, int __oflag),
32 : : __open64_2) __nonnull ((1));
33 : : extern int __REDIRECT (__open_alias, (__const char *__path, int __oflag, ...),
34 : : open64) __nonnull ((1));
35 : : #endif
36 : : __errordecl (__open_too_many_args,
37 : : "open can be called either with 2 or 3 arguments, not more");
38 : : __errordecl (__open_missing_mode,
39 : : "open with O_CREAT in second argument needs 3 arguments");
40 : :
41 : : __extern_always_inline int
42 : : open (__const char *__path, int __oflag, ...)
43 : : {
44 : : if (__va_arg_pack_len () > 1)
45 : : __open_too_many_args ();
46 : :
47 [ - + ][ # # ]: 4 : if (__builtin_constant_p (__oflag))
48 : : {
49 : : if ((__oflag & O_CREAT) != 0 && __va_arg_pack_len () < 1)
50 : : {
51 : : __open_missing_mode ();
52 : : return __open_2 (__path, __oflag);
53 : : }
54 : 4 : return __open_alias (__path, __oflag, __va_arg_pack ());
55 : : }
56 : :
57 : : if (__va_arg_pack_len () < 1)
58 : : return __open_2 (__path, __oflag);
59 : :
60 : 4 : return __open_alias (__path, __oflag, __va_arg_pack ());
61 : : }
62 : :
63 : :
64 : : #ifdef __USE_LARGEFILE64
65 : : extern int __open64_2 (__const char *__path, int __oflag) __nonnull ((1));
66 : : extern int __REDIRECT (__open64_alias, (__const char *__path, int __oflag,
67 : : ...), open64) __nonnull ((1));
68 : : __errordecl (__open64_too_many_args,
69 : : "open64 can be called either with 2 or 3 arguments, not more");
70 : : __errordecl (__open64_missing_mode,
71 : : "open64 with O_CREAT in second argument needs 3 arguments");
72 : :
73 : : __extern_always_inline int
74 : : open64 (__const char *__path, int __oflag, ...)
75 : : {
76 : : if (__va_arg_pack_len () > 1)
77 : : __open64_too_many_args ();
78 : :
79 : : if (__builtin_constant_p (__oflag))
80 : : {
81 : : if ((__oflag & O_CREAT) != 0 && __va_arg_pack_len () < 1)
82 : : {
83 : : __open64_missing_mode ();
84 : : return __open64_2 (__path, __oflag);
85 : : }
86 : : return __open64_alias (__path, __oflag, __va_arg_pack ());
87 : : }
88 : :
89 : : if (__va_arg_pack_len () < 1)
90 : : return __open64_2 (__path, __oflag);
91 : :
92 : : return __open64_alias (__path, __oflag, __va_arg_pack ());
93 : : }
94 : : #endif
95 : :
96 : :
97 : : #ifdef __USE_ATFILE
98 : : # ifndef __USE_FILE_OFFSET64
99 : : extern int __openat_2 (int __fd, __const char *__path, int __oflag)
100 : : __nonnull ((2));
101 : : extern int __REDIRECT (__openat_alias, (int __fd, __const char *__path,
102 : : int __oflag, ...), openat)
103 : : __nonnull ((2));
104 : : # else
105 : : extern int __REDIRECT (__openat_2, (int __fd, __const char *__path,
106 : : int __oflag), __openat64_2)
107 : : __nonnull ((2));
108 : : extern int __REDIRECT (__openat_alias, (int __fd, __const char *__path,
109 : : int __oflag, ...), openat64)
110 : : __nonnull ((2));
111 : : # endif
112 : : __errordecl (__openat_too_many_args,
113 : : "openat can be called either with 3 or 4 arguments, not more");
114 : : __errordecl (__openat_missing_mode,
115 : : "openat with O_CREAT in third argument needs 4 arguments");
116 : :
117 : : __extern_always_inline int
118 : : openat (int __fd, __const char *__path, int __oflag, ...)
119 : : {
120 : : if (__va_arg_pack_len () > 1)
121 : : __openat_too_many_args ();
122 : :
123 : : if (__builtin_constant_p (__oflag))
124 : : {
125 : : if ((__oflag & O_CREAT) != 0 && __va_arg_pack_len () < 1)
126 : : {
127 : : __openat_missing_mode ();
128 : : return __openat_2 (__fd, __path, __oflag);
129 : : }
130 : : return __openat_alias (__fd, __path, __oflag, __va_arg_pack ());
131 : : }
132 : :
133 : : if (__va_arg_pack_len () < 1)
134 : : return __openat_2 (__fd, __path, __oflag);
135 : :
136 : : return __openat_alias (__fd, __path, __oflag, __va_arg_pack ());
137 : : }
138 : :
139 : :
140 : : # ifdef __USE_LARGEFILE64
141 : : extern int __openat64_2 (int __fd, __const char *__path, int __oflag)
142 : : __nonnull ((2));
143 : : extern int __REDIRECT (__openat64_alias, (int __fd, __const char *__path,
144 : : int __oflag, ...), openat64)
145 : : __nonnull ((2));
146 : : __errordecl (__openat64_too_many_args,
147 : : "openat64 can be called either with 3 or 4 arguments, not more");
148 : : __errordecl (__openat64_missing_mode,
149 : : "openat64 with O_CREAT in third argument needs 4 arguments");
150 : :
151 : : __extern_always_inline int
152 : : openat64 (int __fd, __const char *__path, int __oflag, ...)
153 : : {
154 : : if (__va_arg_pack_len () > 1)
155 : : __openat64_too_many_args ();
156 : :
157 : : if (__builtin_constant_p (__oflag))
158 : : {
159 : : if ((__oflag & O_CREAT) != 0 && __va_arg_pack_len () < 1)
160 : : {
161 : : __openat64_missing_mode ();
162 : : return __openat64_2 (__fd, __path, __oflag);
163 : : }
164 : : return __openat64_alias (__fd, __path, __oflag, __va_arg_pack ());
165 : : }
166 : :
167 : : if (__va_arg_pack_len () < 1)
168 : : return __openat64_2 (__fd, __path, __oflag);
169 : :
170 : : return __openat64_alias (__fd, __path, __oflag, __va_arg_pack ());
171 : : }
172 : : # endif
173 : : #endif
|