2 * Copyright (c) 2015 John H. Baldwin <jhb@FreeBSD.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
30 #include <sys/param.h>
37 #include <sysdecode.h>
39 #if defined(__i386__) || defined(__amd64__)
41 * Linux syscalls return negative errno's, we do positive and map them
43 * FreeBSD: src/sys/sys/errno.h
44 * Linux: linux-2.6.17.8/include/asm-generic/errno-base.h
45 * linux-2.6.17.8/include/asm-generic/errno.h
47 static int bsd_to_linux_errno[ELAST + 1] = {
48 -0, -1, -2, -3, -4, -5, -6, -7, -8, -9,
49 -10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
50 -20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
51 -30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
52 -90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
53 -100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
54 -110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
55 -116, -66, -6, -6, -6, -6, -6, -37, -38, -9,
56 -6, -6, -43, -42, -75,-125, -84, -61, -16, -74,
61 #include <contrib/cloudabi/cloudabi_types_common.h>
63 static const int cloudabi_errno_table[] = {
64 [CLOUDABI_E2BIG] = E2BIG,
65 [CLOUDABI_EACCES] = EACCES,
66 [CLOUDABI_EADDRINUSE] = EADDRINUSE,
67 [CLOUDABI_EADDRNOTAVAIL] = EADDRNOTAVAIL,
68 [CLOUDABI_EAFNOSUPPORT] = EAFNOSUPPORT,
69 [CLOUDABI_EAGAIN] = EAGAIN,
70 [CLOUDABI_EALREADY] = EALREADY,
71 [CLOUDABI_EBADF] = EBADF,
72 [CLOUDABI_EBADMSG] = EBADMSG,
73 [CLOUDABI_EBUSY] = EBUSY,
74 [CLOUDABI_ECANCELED] = ECANCELED,
75 [CLOUDABI_ECHILD] = ECHILD,
76 [CLOUDABI_ECONNABORTED] = ECONNABORTED,
77 [CLOUDABI_ECONNREFUSED] = ECONNREFUSED,
78 [CLOUDABI_ECONNRESET] = ECONNRESET,
79 [CLOUDABI_EDEADLK] = EDEADLK,
80 [CLOUDABI_EDESTADDRREQ] = EDESTADDRREQ,
81 [CLOUDABI_EDOM] = EDOM,
82 [CLOUDABI_EDQUOT] = EDQUOT,
83 [CLOUDABI_EEXIST] = EEXIST,
84 [CLOUDABI_EFAULT] = EFAULT,
85 [CLOUDABI_EFBIG] = EFBIG,
86 [CLOUDABI_EHOSTUNREACH] = EHOSTUNREACH,
87 [CLOUDABI_EIDRM] = EIDRM,
88 [CLOUDABI_EILSEQ] = EILSEQ,
89 [CLOUDABI_EINPROGRESS] = EINPROGRESS,
90 [CLOUDABI_EINTR] = EINTR,
91 [CLOUDABI_EINVAL] = EINVAL,
93 [CLOUDABI_EISCONN] = EISCONN,
94 [CLOUDABI_EISDIR] = EISDIR,
95 [CLOUDABI_ELOOP] = ELOOP,
96 [CLOUDABI_EMFILE] = EMFILE,
97 [CLOUDABI_EMLINK] = EMLINK,
98 [CLOUDABI_EMSGSIZE] = EMSGSIZE,
99 [CLOUDABI_EMULTIHOP] = EMULTIHOP,
100 [CLOUDABI_ENAMETOOLONG] = ENAMETOOLONG,
101 [CLOUDABI_ENETDOWN] = ENETDOWN,
102 [CLOUDABI_ENETRESET] = ENETRESET,
103 [CLOUDABI_ENETUNREACH] = ENETUNREACH,
104 [CLOUDABI_ENFILE] = ENFILE,
105 [CLOUDABI_ENOBUFS] = ENOBUFS,
106 [CLOUDABI_ENODEV] = ENODEV,
107 [CLOUDABI_ENOENT] = ENOENT,
108 [CLOUDABI_ENOEXEC] = ENOEXEC,
109 [CLOUDABI_ENOLCK] = ENOLCK,
110 [CLOUDABI_ENOLINK] = ENOLINK,
111 [CLOUDABI_ENOMEM] = ENOMEM,
112 [CLOUDABI_ENOMSG] = ENOMSG,
113 [CLOUDABI_ENOPROTOOPT] = ENOPROTOOPT,
114 [CLOUDABI_ENOSPC] = ENOSPC,
115 [CLOUDABI_ENOSYS] = ENOSYS,
116 [CLOUDABI_ENOTCONN] = ENOTCONN,
117 [CLOUDABI_ENOTDIR] = ENOTDIR,
118 [CLOUDABI_ENOTEMPTY] = ENOTEMPTY,
119 [CLOUDABI_ENOTRECOVERABLE] = ENOTRECOVERABLE,
120 [CLOUDABI_ENOTSOCK] = ENOTSOCK,
121 [CLOUDABI_ENOTSUP] = ENOTSUP,
122 [CLOUDABI_ENOTTY] = ENOTTY,
123 [CLOUDABI_ENXIO] = ENXIO,
124 [CLOUDABI_EOVERFLOW] = EOVERFLOW,
125 [CLOUDABI_EOWNERDEAD] = EOWNERDEAD,
126 [CLOUDABI_EPERM] = EPERM,
127 [CLOUDABI_EPIPE] = EPIPE,
128 [CLOUDABI_EPROTO] = EPROTO,
129 [CLOUDABI_EPROTONOSUPPORT] = EPROTONOSUPPORT,
130 [CLOUDABI_EPROTOTYPE] = EPROTOTYPE,
131 [CLOUDABI_ERANGE] = ERANGE,
132 [CLOUDABI_EROFS] = EROFS,
133 [CLOUDABI_ESPIPE] = ESPIPE,
134 [CLOUDABI_ESRCH] = ESRCH,
135 [CLOUDABI_ESTALE] = ESTALE,
136 [CLOUDABI_ETIMEDOUT] = ETIMEDOUT,
137 [CLOUDABI_ETXTBSY] = ETXTBSY,
138 [CLOUDABI_EXDEV] = EXDEV,
139 [CLOUDABI_ENOTCAPABLE] = ENOTCAPABLE,
143 sysdecode_abi_to_freebsd_errno(enum sysdecode_abi abi, int error)
147 case SYSDECODE_ABI_FREEBSD:
148 case SYSDECODE_ABI_FREEBSD32:
150 #if defined(__i386__) || defined(__amd64__)
151 case SYSDECODE_ABI_LINUX:
152 case SYSDECODE_ABI_LINUX32: {
156 * This is imprecise since it returns the first
159 for (i = 0; i < nitems(bsd_to_linux_errno); i++) {
160 if (error == bsd_to_linux_errno[i])
166 case SYSDECODE_ABI_CLOUDABI32:
167 case SYSDECODE_ABI_CLOUDABI64:
169 (unsigned int)error < nitems(cloudabi_errno_table))
170 return (cloudabi_errno_table[error]);
179 sysdecode_freebsd_to_abi_errno(enum sysdecode_abi abi, int error)
183 case SYSDECODE_ABI_FREEBSD:
184 case SYSDECODE_ABI_FREEBSD32:
186 #if defined(__i386__) || defined(__amd64__)
187 case SYSDECODE_ABI_LINUX:
188 case SYSDECODE_ABI_LINUX32:
189 if (error >= 0 && error <= ELAST)
190 return (bsd_to_linux_errno[error]);
193 case SYSDECODE_ABI_CLOUDABI32:
194 case SYSDECODE_ABI_CLOUDABI64: {
197 for (i = 0; i < nitems(cloudabi_errno_table); i++) {
198 if (error == cloudabi_errno_table[i])