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