1287b96ddSJohn Baldwin /*- 2287b96ddSJohn Baldwin * Copyright (c) 2015 John H. Baldwin <jhb@FreeBSD.org> 3287b96ddSJohn Baldwin * 4287b96ddSJohn Baldwin * Redistribution and use in source and binary forms, with or without 5287b96ddSJohn Baldwin * modification, are permitted provided that the following conditions 6287b96ddSJohn Baldwin * are met: 7287b96ddSJohn Baldwin * 1. Redistributions of source code must retain the above copyright 8287b96ddSJohn Baldwin * notice, this list of conditions and the following disclaimer. 9287b96ddSJohn Baldwin * 2. Redistributions in binary form must reproduce the above copyright 10287b96ddSJohn Baldwin * notice, this list of conditions and the following disclaimer in the 11287b96ddSJohn Baldwin * documentation and/or other materials provided with the distribution. 12287b96ddSJohn Baldwin * 13287b96ddSJohn Baldwin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14287b96ddSJohn Baldwin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15287b96ddSJohn Baldwin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16287b96ddSJohn Baldwin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17287b96ddSJohn Baldwin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18287b96ddSJohn Baldwin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19287b96ddSJohn Baldwin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20287b96ddSJohn Baldwin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21287b96ddSJohn Baldwin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22287b96ddSJohn Baldwin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23287b96ddSJohn Baldwin * SUCH DAMAGE. 24287b96ddSJohn Baldwin */ 25287b96ddSJohn Baldwin 26287b96ddSJohn Baldwin #include <sys/cdefs.h> 27287b96ddSJohn Baldwin __FBSDID("$FreeBSD$"); 28287b96ddSJohn Baldwin 29287b96ddSJohn Baldwin #include <sys/param.h> 309289f547SJohn Baldwin #include <sys/acl.h> 319289f547SJohn Baldwin #include <sys/wait.h> 32287b96ddSJohn Baldwin #include <errno.h> 33287b96ddSJohn Baldwin #include <limits.h> 349289f547SJohn Baldwin #include <stdbool.h> 35287b96ddSJohn Baldwin #include <stdio.h> 36287b96ddSJohn Baldwin #include <sysdecode.h> 37287b96ddSJohn Baldwin 389a16bd16SEd Maste #if defined(__aarch64__) || defined(__amd64__) || defined(__i386__) 39*1a8577faSEdward Tomasz Napierala #include <compat/linux/linux_errno.h> 401ac2776bSEd Maste static 411ac2776bSEd Maste #include <compat/linux/linux_errno.inc> 42287b96ddSJohn Baldwin #endif 43287b96ddSJohn Baldwin 441f3bbfd8SEd Schouten #include <contrib/cloudabi/cloudabi_types_common.h> 45287b96ddSJohn Baldwin 46287b96ddSJohn Baldwin static const int cloudabi_errno_table[] = { 47287b96ddSJohn Baldwin [CLOUDABI_E2BIG] = E2BIG, 48287b96ddSJohn Baldwin [CLOUDABI_EACCES] = EACCES, 49287b96ddSJohn Baldwin [CLOUDABI_EADDRINUSE] = EADDRINUSE, 50287b96ddSJohn Baldwin [CLOUDABI_EADDRNOTAVAIL] = EADDRNOTAVAIL, 51287b96ddSJohn Baldwin [CLOUDABI_EAFNOSUPPORT] = EAFNOSUPPORT, 52287b96ddSJohn Baldwin [CLOUDABI_EAGAIN] = EAGAIN, 53287b96ddSJohn Baldwin [CLOUDABI_EALREADY] = EALREADY, 54287b96ddSJohn Baldwin [CLOUDABI_EBADF] = EBADF, 55287b96ddSJohn Baldwin [CLOUDABI_EBADMSG] = EBADMSG, 56287b96ddSJohn Baldwin [CLOUDABI_EBUSY] = EBUSY, 57287b96ddSJohn Baldwin [CLOUDABI_ECANCELED] = ECANCELED, 58287b96ddSJohn Baldwin [CLOUDABI_ECHILD] = ECHILD, 59287b96ddSJohn Baldwin [CLOUDABI_ECONNABORTED] = ECONNABORTED, 60287b96ddSJohn Baldwin [CLOUDABI_ECONNREFUSED] = ECONNREFUSED, 61287b96ddSJohn Baldwin [CLOUDABI_ECONNRESET] = ECONNRESET, 62287b96ddSJohn Baldwin [CLOUDABI_EDEADLK] = EDEADLK, 63287b96ddSJohn Baldwin [CLOUDABI_EDESTADDRREQ] = EDESTADDRREQ, 64287b96ddSJohn Baldwin [CLOUDABI_EDOM] = EDOM, 65287b96ddSJohn Baldwin [CLOUDABI_EDQUOT] = EDQUOT, 66287b96ddSJohn Baldwin [CLOUDABI_EEXIST] = EEXIST, 67287b96ddSJohn Baldwin [CLOUDABI_EFAULT] = EFAULT, 68287b96ddSJohn Baldwin [CLOUDABI_EFBIG] = EFBIG, 69287b96ddSJohn Baldwin [CLOUDABI_EHOSTUNREACH] = EHOSTUNREACH, 70287b96ddSJohn Baldwin [CLOUDABI_EIDRM] = EIDRM, 71287b96ddSJohn Baldwin [CLOUDABI_EILSEQ] = EILSEQ, 72287b96ddSJohn Baldwin [CLOUDABI_EINPROGRESS] = EINPROGRESS, 73287b96ddSJohn Baldwin [CLOUDABI_EINTR] = EINTR, 74287b96ddSJohn Baldwin [CLOUDABI_EINVAL] = EINVAL, 75287b96ddSJohn Baldwin [CLOUDABI_EIO] = EIO, 76287b96ddSJohn Baldwin [CLOUDABI_EISCONN] = EISCONN, 77287b96ddSJohn Baldwin [CLOUDABI_EISDIR] = EISDIR, 78287b96ddSJohn Baldwin [CLOUDABI_ELOOP] = ELOOP, 79287b96ddSJohn Baldwin [CLOUDABI_EMFILE] = EMFILE, 80287b96ddSJohn Baldwin [CLOUDABI_EMLINK] = EMLINK, 81287b96ddSJohn Baldwin [CLOUDABI_EMSGSIZE] = EMSGSIZE, 82287b96ddSJohn Baldwin [CLOUDABI_EMULTIHOP] = EMULTIHOP, 83287b96ddSJohn Baldwin [CLOUDABI_ENAMETOOLONG] = ENAMETOOLONG, 84287b96ddSJohn Baldwin [CLOUDABI_ENETDOWN] = ENETDOWN, 85287b96ddSJohn Baldwin [CLOUDABI_ENETRESET] = ENETRESET, 86287b96ddSJohn Baldwin [CLOUDABI_ENETUNREACH] = ENETUNREACH, 87287b96ddSJohn Baldwin [CLOUDABI_ENFILE] = ENFILE, 88287b96ddSJohn Baldwin [CLOUDABI_ENOBUFS] = ENOBUFS, 89287b96ddSJohn Baldwin [CLOUDABI_ENODEV] = ENODEV, 90287b96ddSJohn Baldwin [CLOUDABI_ENOENT] = ENOENT, 91287b96ddSJohn Baldwin [CLOUDABI_ENOEXEC] = ENOEXEC, 92287b96ddSJohn Baldwin [CLOUDABI_ENOLCK] = ENOLCK, 93287b96ddSJohn Baldwin [CLOUDABI_ENOLINK] = ENOLINK, 94287b96ddSJohn Baldwin [CLOUDABI_ENOMEM] = ENOMEM, 95287b96ddSJohn Baldwin [CLOUDABI_ENOMSG] = ENOMSG, 96287b96ddSJohn Baldwin [CLOUDABI_ENOPROTOOPT] = ENOPROTOOPT, 97287b96ddSJohn Baldwin [CLOUDABI_ENOSPC] = ENOSPC, 98287b96ddSJohn Baldwin [CLOUDABI_ENOSYS] = ENOSYS, 99287b96ddSJohn Baldwin [CLOUDABI_ENOTCONN] = ENOTCONN, 100287b96ddSJohn Baldwin [CLOUDABI_ENOTDIR] = ENOTDIR, 101287b96ddSJohn Baldwin [CLOUDABI_ENOTEMPTY] = ENOTEMPTY, 102287b96ddSJohn Baldwin [CLOUDABI_ENOTRECOVERABLE] = ENOTRECOVERABLE, 103287b96ddSJohn Baldwin [CLOUDABI_ENOTSOCK] = ENOTSOCK, 104287b96ddSJohn Baldwin [CLOUDABI_ENOTSUP] = ENOTSUP, 105287b96ddSJohn Baldwin [CLOUDABI_ENOTTY] = ENOTTY, 106287b96ddSJohn Baldwin [CLOUDABI_ENXIO] = ENXIO, 107287b96ddSJohn Baldwin [CLOUDABI_EOVERFLOW] = EOVERFLOW, 108287b96ddSJohn Baldwin [CLOUDABI_EOWNERDEAD] = EOWNERDEAD, 109287b96ddSJohn Baldwin [CLOUDABI_EPERM] = EPERM, 110287b96ddSJohn Baldwin [CLOUDABI_EPIPE] = EPIPE, 111287b96ddSJohn Baldwin [CLOUDABI_EPROTO] = EPROTO, 112287b96ddSJohn Baldwin [CLOUDABI_EPROTONOSUPPORT] = EPROTONOSUPPORT, 113287b96ddSJohn Baldwin [CLOUDABI_EPROTOTYPE] = EPROTOTYPE, 114287b96ddSJohn Baldwin [CLOUDABI_ERANGE] = ERANGE, 115287b96ddSJohn Baldwin [CLOUDABI_EROFS] = EROFS, 116287b96ddSJohn Baldwin [CLOUDABI_ESPIPE] = ESPIPE, 117287b96ddSJohn Baldwin [CLOUDABI_ESRCH] = ESRCH, 118287b96ddSJohn Baldwin [CLOUDABI_ESTALE] = ESTALE, 119287b96ddSJohn Baldwin [CLOUDABI_ETIMEDOUT] = ETIMEDOUT, 120287b96ddSJohn Baldwin [CLOUDABI_ETXTBSY] = ETXTBSY, 121287b96ddSJohn Baldwin [CLOUDABI_EXDEV] = EXDEV, 122287b96ddSJohn Baldwin [CLOUDABI_ENOTCAPABLE] = ENOTCAPABLE, 123287b96ddSJohn Baldwin }; 124287b96ddSJohn Baldwin 125287b96ddSJohn Baldwin int 126287b96ddSJohn Baldwin sysdecode_abi_to_freebsd_errno(enum sysdecode_abi abi, int error) 127287b96ddSJohn Baldwin { 128287b96ddSJohn Baldwin 129287b96ddSJohn Baldwin switch (abi) { 130287b96ddSJohn Baldwin case SYSDECODE_ABI_FREEBSD: 131287b96ddSJohn Baldwin case SYSDECODE_ABI_FREEBSD32: 132287b96ddSJohn Baldwin return (error); 1339a16bd16SEd Maste #if defined(__aarch64__) || defined(__amd64__) || defined(__i386__) 134287b96ddSJohn Baldwin case SYSDECODE_ABI_LINUX: 135287b96ddSJohn Baldwin case SYSDECODE_ABI_LINUX32: { 136287b96ddSJohn Baldwin unsigned int i; 137287b96ddSJohn Baldwin 138287b96ddSJohn Baldwin /* 139287b96ddSJohn Baldwin * This is imprecise since it returns the first 140287b96ddSJohn Baldwin * matching errno. 141287b96ddSJohn Baldwin */ 1421ac2776bSEd Maste for (i = 0; i < nitems(linux_errtbl); i++) { 1431ac2776bSEd Maste if (error == linux_errtbl[i]) 144287b96ddSJohn Baldwin return (i); 145287b96ddSJohn Baldwin } 146287b96ddSJohn Baldwin break; 147287b96ddSJohn Baldwin } 148287b96ddSJohn Baldwin #endif 14987f69beeSEd Schouten case SYSDECODE_ABI_CLOUDABI32: 150287b96ddSJohn Baldwin case SYSDECODE_ABI_CLOUDABI64: 151287b96ddSJohn Baldwin if (error >= 0 && 152287b96ddSJohn Baldwin (unsigned int)error < nitems(cloudabi_errno_table)) 153287b96ddSJohn Baldwin return (cloudabi_errno_table[error]); 154287b96ddSJohn Baldwin break; 155287b96ddSJohn Baldwin default: 156287b96ddSJohn Baldwin break; 157287b96ddSJohn Baldwin } 158287b96ddSJohn Baldwin return (INT_MAX); 159287b96ddSJohn Baldwin } 160287b96ddSJohn Baldwin 161287b96ddSJohn Baldwin int 162287b96ddSJohn Baldwin sysdecode_freebsd_to_abi_errno(enum sysdecode_abi abi, int error) 163287b96ddSJohn Baldwin { 164287b96ddSJohn Baldwin 165287b96ddSJohn Baldwin switch (abi) { 166287b96ddSJohn Baldwin case SYSDECODE_ABI_FREEBSD: 167287b96ddSJohn Baldwin case SYSDECODE_ABI_FREEBSD32: 168287b96ddSJohn Baldwin return (error); 1699a16bd16SEd Maste #if defined(__aarch64__) || defined(__amd64__) || defined(__i386__) 170287b96ddSJohn Baldwin case SYSDECODE_ABI_LINUX: 171287b96ddSJohn Baldwin case SYSDECODE_ABI_LINUX32: 172287b96ddSJohn Baldwin if (error >= 0 && error <= ELAST) 1731ac2776bSEd Maste return (linux_errtbl[error]); 174287b96ddSJohn Baldwin break; 175287b96ddSJohn Baldwin #endif 17687f69beeSEd Schouten case SYSDECODE_ABI_CLOUDABI32: 177287b96ddSJohn Baldwin case SYSDECODE_ABI_CLOUDABI64: { 178287b96ddSJohn Baldwin unsigned int i; 179287b96ddSJohn Baldwin 180287b96ddSJohn Baldwin for (i = 0; i < nitems(cloudabi_errno_table); i++) { 181287b96ddSJohn Baldwin if (error == cloudabi_errno_table[i]) 182287b96ddSJohn Baldwin return (i); 183287b96ddSJohn Baldwin } 184287b96ddSJohn Baldwin break; 185287b96ddSJohn Baldwin } 186287b96ddSJohn Baldwin default: 187287b96ddSJohn Baldwin break; 188287b96ddSJohn Baldwin } 189287b96ddSJohn Baldwin return (INT_MAX); 190287b96ddSJohn Baldwin } 191287b96ddSJohn Baldwin 192