2 * Copyright (c) 2011 Jiri Zarevucky
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 /** @addtogroup libposix
32 /** @file System error numbers.
35 #ifndef POSIX_ERRNO_H_
36 #define POSIX_ERRNO_H_
38 #include "libc/errno.h"
41 * Since libc uses negative errorcodes, some sort of conversion is necessary to
42 * keep POSIX programs and libraries from breaking. This file maps POSIX error
43 * codes to absolute values of corresponding libc codes where available, and
44 * assigns new code where there is no prior definition in libc.
46 * A new errno variable is defined. When accessed, the function first looks at
47 * libc errno and iff it is != 0, sets the POSIX errno to absolute value of
48 * libc errno. Given that no library function sets errno to 0 and that all
49 * POSIX libraries will be used solely by POSIX programs (thus, there only needs
50 * to be one way correspondence between errno and posix_errno), this approach
51 * should work as expected in most cases and does not require any wrappers for
52 * libc routines that would just change errno values.
54 * There is no conditioning by LIBPOSIX_INTERNAL for redefinitions of macros.
55 * If there is a need to check errno for a value not defined by POSIX, it's
56 * necessary to compare errno against abs(ECODE), because there is no
57 * redefinition for such error codes.
59 * XXX: maybe all HOS error codes should be redefined
61 * NOTE: This redefinition is slightly POSIX incompatible, since the
62 * specification requires the macro values to be usable in preprocessing
63 * directives. I don't think that's very important, though.
67 #define errno (*__posix_errno())
71 extern int *__posix_errno(void);
73 #define __TOP_ERRNO (-NO_DATA)
76 POSIX_E2BIG
= __TOP_ERRNO
+ 1,
77 POSIX_EACCES
= __TOP_ERRNO
+ 2,
78 POSIX_EADDRINUSE
= -EADDRINUSE
,
79 POSIX_EADDRNOTAVAIL
= -EADDRNOTAVAIL
,
80 POSIX_EAFNOSUPPORT
= -EAFNOSUPPORT
,
81 POSIX_EAGAIN
= -EAGAIN
,
82 POSIX_EALREADY
= __TOP_ERRNO
+ 3,
84 POSIX_EBADMSG
= __TOP_ERRNO
+ 4,
86 POSIX_ECANCELED
= __TOP_ERRNO
+ 5,
87 POSIX_ECHILD
= __TOP_ERRNO
+ 6,
88 POSIX_ECONNABORTED
= __TOP_ERRNO
+ 7,
89 POSIX_ECONNREFUSED
= __TOP_ERRNO
+ 8,
90 POSIX_ECONNRESET
= __TOP_ERRNO
+ 9,
91 POSIX_EDEADLK
= __TOP_ERRNO
+ 10,
92 POSIX_EDESTADDRREQ
= -EDESTADDRREQ
,
93 POSIX_EDOM
= __TOP_ERRNO
+ 11,
94 POSIX_EDQUOT
= __TOP_ERRNO
+ 12,
95 POSIX_EEXIST
= -EEXIST
,
96 POSIX_EFAULT
= __TOP_ERRNO
+ 13,
97 POSIX_EFBIG
= __TOP_ERRNO
+ 14,
98 POSIX_EHOSTUNREACH
= __TOP_ERRNO
+ 15,
99 POSIX_EIDRM
= __TOP_ERRNO
+ 16,
100 POSIX_EILSEQ
= __TOP_ERRNO
+ 17,
101 POSIX_EINPROGRESS
= -EINPROGRESS
,
102 POSIX_EINTR
= -EINTR
,
103 POSIX_EINVAL
= -EINVAL
,
105 POSIX_EISCONN
= __TOP_ERRNO
+ 18,
106 POSIX_EISDIR
= -EISDIR
,
107 POSIX_ELOOP
= __TOP_ERRNO
+ 19,
108 POSIX_EMFILE
= -EMFILE
,
109 POSIX_EMLINK
= -EMLINK
,
110 POSIX_EMSGSIZE
= __TOP_ERRNO
+ 20,
111 POSIX_EMULTIHOP
= __TOP_ERRNO
+ 21,
112 POSIX_ENAMETOOLONG
= -ENAMETOOLONG
,
113 POSIX_ENETDOWN
= __TOP_ERRNO
+ 22,
114 POSIX_ENETRESET
= __TOP_ERRNO
+ 23,
115 POSIX_ENETUNREACH
= __TOP_ERRNO
+ 24,
116 POSIX_ENFILE
= __TOP_ERRNO
+ 25,
117 POSIX_ENOBUFS
= __TOP_ERRNO
+ 26,
118 POSIX_ENODATA
= -NO_DATA
,
119 POSIX_ENODEV
= __TOP_ERRNO
+ 27,
120 POSIX_ENOENT
= -ENOENT
,
121 POSIX_ENOEXEC
= __TOP_ERRNO
+ 28,
122 POSIX_ENOLCK
= __TOP_ERRNO
+ 29,
123 POSIX_ENOLINK
= __TOP_ERRNO
+ 30,
124 POSIX_ENOMEM
= -ENOMEM
,
125 POSIX_ENOMSG
= __TOP_ERRNO
+ 31,
126 POSIX_ENOPROTOOPT
= __TOP_ERRNO
+ 32,
127 POSIX_ENOSPC
= -ENOSPC
,
128 POSIX_ENOSR
= __TOP_ERRNO
+ 33,
129 POSIX_ENOSTR
= __TOP_ERRNO
+ 34,
130 POSIX_ENOSYS
= __TOP_ERRNO
+ 35,
131 POSIX_ENOTCONN
= -ENOTCONN
,
132 POSIX_ENOTDIR
= -ENOTDIR
,
133 POSIX_ENOTEMPTY
= -ENOTEMPTY
,
134 POSIX_ENOTRECOVERABLE
= __TOP_ERRNO
+ 36,
135 POSIX_ENOTSOCK
= -ENOTSOCK
,
136 POSIX_ENOTSUP
= -ENOTSUP
,
137 POSIX_ENOTTY
= __TOP_ERRNO
+ 37,
138 POSIX_ENXIO
= __TOP_ERRNO
+ 38,
139 POSIX_EOPNOTSUPP
= __TOP_ERRNO
+ 39,
140 POSIX_EOVERFLOW
= -EOVERFLOW
,
141 POSIX_EOWNERDEAD
= __TOP_ERRNO
+ 40,
142 POSIX_EPERM
= -EPERM
,
143 POSIX_EPIPE
= __TOP_ERRNO
+ 41,
144 POSIX_EPROTO
= __TOP_ERRNO
+ 42,
145 POSIX_EPROTONOSUPPORT
= -EPROTONOSUPPORT
,
146 POSIX_EPROTOTYPE
= __TOP_ERRNO
+ 43,
147 POSIX_ERANGE
= -ERANGE
,
148 POSIX_EROFS
= __TOP_ERRNO
+ 44,
149 POSIX_ESPIPE
= __TOP_ERRNO
+ 45,
150 POSIX_ESRCH
= __TOP_ERRNO
+ 46,
151 POSIX_ESTALE
= __TOP_ERRNO
+ 47,
152 POSIX_ETIME
= __TOP_ERRNO
+ 48,
153 POSIX_ETIMEDOUT
= __TOP_ERRNO
+ 49,
154 POSIX_ETXTBSY
= __TOP_ERRNO
+ 50,
155 POSIX_EWOULDBLOCK
= __TOP_ERRNO
+ 51,
156 POSIX_EXDEV
= -EXDEV
,
219 #undef ENOTRECOVERABLE
230 #undef EPROTONOSUPPORT
243 #define E2BIG POSIX_E2BIG
244 #define EACCES POSIX_EACCES
245 #define EADDRINUSE POSIX_EADDRINUSE
246 #define EADDRNOTAVAIL POSIX_EADDRNOTAVAIL
247 #define EAFNOSUPPORT POSIX_EAFNOSUPPORT
248 #define EAGAIN POSIX_EAGAIN
249 #define EALREADY POSIX_EALREADY
250 #define EBADF POSIX_EBADF
251 #define EBADMSG POSIX_EBADMSG
252 #define EBUSY POSIX_EBUSY
253 #define ECANCELED POSIX_ECANCELED
254 #define ECHILD POSIX_ECHILD
255 #define ECONNABORTED POSIX_ECONNABORTED
256 #define ECONNREFUSED POSIX_ECONNREFUSED
257 #define ECONNRESET POSIX_ECONNRESET
258 #define EDEADLK POSIX_EDEADLK
259 #define EDESTADDRREQ POSIX_EDESTADDRREQ
260 #define EDOM POSIX_EDOM
261 #define EDQUOT POSIX_EDQUOT
262 #define EEXIST POSIX_EEXIST
263 #define EFAULT POSIX_EFAULT
264 #define EFBIG POSIX_EFBIG
265 #define EHOSTUNREACH POSIX_EHOSTUNREACH
266 #define EIDRM POSIX_EIDRM
267 #define EILSEQ POSIX_EILSEQ
268 #define EINPROGRESS POSIX_EINPROGRESS
269 #define EINTR POSIX_EINTR
270 #define EINVAL POSIX_EINVAL
271 #define EIO POSIX_EIO
272 #define EISCONN POSIX_EISCONN
273 #define EISDIR POSIX_EISDIR
274 #define ELOOP POSIX_ELOOP
275 #define EMFILE POSIX_EMFILE
276 #define EMLINK POSIX_EMLINK
277 #define EMSGSIZE POSIX_EMSGSIZE
278 #define EMULTIHOP POSIX_EMULTIHOP
279 #define ENAMETOOLONG POSIX_ENAMETOOLONG
280 #define ENETDOWN POSIX_ENETDOWN
281 #define ENETRESET POSIX_ENETRESET
282 #define ENETUNREACH POSIX_ENETUNREACH
283 #define ENFILE POSIX_ENFILE
284 #define ENOBUFS POSIX_ENOBUFS
285 #define ENODATA POSIX_ENODATA
286 #define ENODEV POSIX_ENODEV
287 #define ENOENT POSIX_ENOENT
288 #define ENOEXEC POSIX_ENOEXEC
289 #define ENOLCK POSIX_ENOLCK
290 #define ENOLINK POSIX_ENOLINK
291 #define ENOMEM POSIX_ENOMEM
292 #define ENOMSG POSIX_ENOMSG
293 #define ENOPROTOOPT POSIX_ENOPROTOOPT
294 #define ENOSPC POSIX_ENOSPC
295 #define ENOSR POSIX_ENOSR
296 #define ENOSTR POSIX_ENOSTR
297 #define ENOSYS POSIX_ENOSYS
298 #define ENOTCONN POSIX_ENOTCONN
299 #define ENOTDIR POSIX_ENOTDIR
300 #define ENOTEMPTY POSIX_ENOTEMPTY
301 #define ENOTRECOVERABLE POSIX_ENOTRECOVERABLE
302 #define ENOTSOCK POSIX_ENOTSOCK
303 #define ENOTSUP POSIX_ENOTSUP
304 #define ENOTTY POSIX_ENOTTY
305 #define ENXIO POSIX_ENXIO
306 #define EOPNOTSUPP POSIX_EOPNOTSUPP
307 #define EOVERFLOW POSIX_EOVERFLOW
308 #define EOWNERDEAD POSIX_EOWNERDEAD
309 #define EPERM POSIX_EPERM
310 #define EPIPE POSIX_EPIPE
311 #define EPROTO POSIX_EPROTO
312 #define EPROTONOSUPPORT POSIX_EPROTONOSUPPORT
313 #define EPROTOTYPE POSIX_EPROTOTYPE
314 #define ERANGE POSIX_ERANGE
315 #define EROFS POSIX_EROFS
316 #define ESPIPE POSIX_ESPIPE
317 #define ESRCH POSIX_ESRCH
318 #define ESTALE POSIX_ESTALE
319 #define ETIME POSIX_ETIME
320 #define ETIMEDOUT POSIX_ETIMEDOUT
321 #define ETXTBSY POSIX_ETXTBSY
322 #define EWOULDBLOCK POSIX_EWOULDBLOCK
323 #define EXDEV POSIX_EXDEV
325 #endif /* POSIX_ERRNO_H_ */