]> git.ipfire.org Git - thirdparty/glibc.git/blob - io/bits/fcntl2.h
fbe85852cc469925996c8535b43a9c79c89c7e04
[thirdparty/glibc.git] / io / bits / fcntl2.h
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 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 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 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