1 /*- 2 * Copyright (c) 2015 John H. Baldwin <jhb@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 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. 13 * 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 24 * SUCH DAMAGE. 25 */ 26 27 #include <sys/cdefs.h> 28 __FBSDID("$FreeBSD$"); 29 30 #include <sys/param.h> 31 #include <sys/acl.h> 32 #include <sys/wait.h> 33 #include <errno.h> 34 #include <limits.h> 35 #include <stdbool.h> 36 #include <stdio.h> 37 #include <sysdecode.h> 38 39 #if defined(__i386__) || defined(__amd64__) 40 /* 41 * Linux syscalls return negative errno's, we do positive and map them 42 * Reference: 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 46 */ 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, 57 -72, -67, -71 58 }; 59 #endif 60 61 #include <contrib/cloudabi/cloudabi_types_common.h> 62 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, 92 [CLOUDABI_EIO] = EIO, 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, 140 }; 141 142 int 143 sysdecode_abi_to_freebsd_errno(enum sysdecode_abi abi, int error) 144 { 145 146 switch (abi) { 147 case SYSDECODE_ABI_FREEBSD: 148 case SYSDECODE_ABI_FREEBSD32: 149 return (error); 150 #if defined(__i386__) || defined(__amd64__) 151 case SYSDECODE_ABI_LINUX: 152 case SYSDECODE_ABI_LINUX32: { 153 unsigned int i; 154 155 /* 156 * This is imprecise since it returns the first 157 * matching errno. 158 */ 159 for (i = 0; i < nitems(bsd_to_linux_errno); i++) { 160 if (error == bsd_to_linux_errno[i]) 161 return (i); 162 } 163 break; 164 } 165 #endif 166 case SYSDECODE_ABI_CLOUDABI32: 167 case SYSDECODE_ABI_CLOUDABI64: 168 if (error >= 0 && 169 (unsigned int)error < nitems(cloudabi_errno_table)) 170 return (cloudabi_errno_table[error]); 171 break; 172 default: 173 break; 174 } 175 return (INT_MAX); 176 } 177 178 int 179 sysdecode_freebsd_to_abi_errno(enum sysdecode_abi abi, int error) 180 { 181 182 switch (abi) { 183 case SYSDECODE_ABI_FREEBSD: 184 case SYSDECODE_ABI_FREEBSD32: 185 return (error); 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]); 191 break; 192 #endif 193 case SYSDECODE_ABI_CLOUDABI32: 194 case SYSDECODE_ABI_CLOUDABI64: { 195 unsigned int i; 196 197 for (i = 0; i < nitems(cloudabi_errno_table); i++) { 198 if (error == cloudabi_errno_table[i]) 199 return (i); 200 } 201 break; 202 } 203 default: 204 break; 205 } 206 return (INT_MAX); 207 } 208 209