Index: sys/compat/linux/linux.h =================================================================== --- sys/compat/linux/linux.h +++ sys/compat/linux/linux.h @@ -197,5 +197,7 @@ #define BITMAP_1t1_LINUX(_name) BITMAP_EASY_LINUX(_name, LINUX_##_name) int bsd_to_linux_errno(int error); +int linux_to_bsd_errno(int error); +void linux_check_errtbl(void); #endif /* _LINUX_MI_H_ */ Index: sys/compat/linux/linux_common.c =================================================================== --- sys/compat/linux/linux_common.c +++ sys/compat/linux/linux_common.c @@ -67,6 +67,9 @@ switch(type) { case MOD_LOAD: +#ifdef INVARIANTS + linux_check_errtbl(); +#endif linux_dev_shm_create(); linux_osd_jail_register(); linux_exit_tag = EVENTHANDLER_REGISTER(process_exit, Index: sys/compat/linux/linux_emul.h =================================================================== --- sys/compat/linux/linux_emul.h +++ sys/compat/linux/linux_emul.h @@ -81,5 +81,6 @@ struct linux_pemuldata *pem_find(struct proc *); extern const int linux_errtbl[]; +extern const int linux_to_bsd_errtbl[]; #endif /* !_LINUX_EMUL_H_ */ Index: sys/compat/linux/linux_errno.h =================================================================== --- /dev/null +++ sys/compat/linux/linux_errno.h @@ -0,0 +1,186 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2020 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Edward Tomasz Napierala under sponsorship + * from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _LINUX_ERRNO_H_ +#define _LINUX_ERRNO_H_ + +#define LINUX_EPERM 1 +#define LINUX_ENOENT 2 +#define LINUX_ESRCH 3 +#define LINUX_EINTR 4 +#define LINUX_EIO 5 +#define LINUX_ENXIO 6 +#define LINUX_E2BIG 7 +#define LINUX_ENOEXEC 8 +#define LINUX_EBADF 9 + +#define LINUX_ECHILD 10 +#define LINUX_EAGAIN 11 +#define LINUX_ENOMEM 12 +#define LINUX_EACCES 13 +#define LINUX_EFAULT 14 +#define LINUX_ENOTBLK 15 +#define LINUX_EBUSY 16 +#define LINUX_EEXIST 17 +#define LINUX_EXDEV 18 +#define LINUX_ENODEV 19 + +#define LINUX_ENOTDIR 20 +#define LINUX_EISDIR 21 +#define LINUX_EINVAL 22 +#define LINUX_ENFILE 23 +#define LINUX_EMFILE 24 +#define LINUX_ENOTTY 25 +#define LINUX_ETXTBSY 26 +#define LINUX_EFBIG 27 +#define LINUX_ENOSPC 28 +#define LINUX_ESPIPE 29 + +#define LINUX_EROFS 30 +#define LINUX_EMLINK 31 +#define LINUX_EPIPE 32 +#define LINUX_EDOM 33 +#define LINUX_ERANGE 34 +#define LINUX_EDEADLK 35 +#define LINUX_ENAMETOOLONG 36 +#define LINUX_ENOLCK 37 +#define LINUX_ENOSYS 38 +#define LINUX_ENOTEMPTY 39 + +#define LINUX_ELOOP 40 +#define LINUX_ESEEMSUNUSED 41 /* XXX */ +#define LINUX_ENOMSG 42 +#define LINUX_EIDRM 43 +#define LINUX_ECHRNG 44 +#define LINUX_EL2NSYNC 45 +#define LINUX_EL3HLT 46 +#define LINUX_EL3RST 47 +#define LINUX_ELNRNG 48 +#define LINUX_EUNATCH 49 + +#define LINUX_ENOCSI 50 +#define LINUX_EL2HLT 51 +#define LINUX_EBADE 52 +#define LINUX_EBADR 53 +#define LINUX_EXFULL 54 +#define LINUX_ENOANO 55 +#define LINUX_EBADRQC 56 +#define LINUX_EBADSLT 57 +#define LINUX_EALSOUNUSED 58 /* XXX */ +#define LINUX_EBFONT 59 + +#define LINUX_ENOSTR 60 +#define LINUX_ENODATA 61 +#define LINUX_ENOTIME 62 +#define LINUX_ENOSR 63 +#define LINUX_ENONET 64 +#define LINUX_ENOPKG 65 +#define LINUX_EREMOTE 66 +#define LINUX_ENOLINK 67 +#define LINUX_EADV 68 +#define LINUX_ESRMNT 69 + +#define LINUX_ECOMM 70 +#define LINUX_EPROTO 71 +#define LINUX_EMULTIHOP 72 +#define LINUX_EDOTDOT 73 +#define LINUX_EBADMSG 74 +#define LINUX_EOVERFLOW 75 +#define LINUX_ENOTUNIQ 76 +#define LINUX_EBADFD 77 +#define LINUX_EREMCHG 78 +#define LINUX_ELIBACC 79 + +#define LINUX_ELIBBAD 80 +#define LINUX_ELIBSCN 81 +#define LINUX_ELIBMAX 82 +#define LINUX_ELIBEXEC 83 +#define LINUX_EILSEQ 84 +#define LINUX_ERESTART 85 +#define LINUX_ESTRPIPE 86 +#define LINUX_EUSERS 87 +#define LINUX_ENOTSOCK 88 +#define LINUX_EDESTADDRREQ 89 + +#define LINUX_EMSGSIZE 90 +#define LINUX_EPROTOTYPE 91 +#define LINUX_ENOPROTOOPT 92 +#define LINUX_EPROTONOTSUPPORT 93 +#define LINUX_ESOCKNOTSUPPORT 94 +#define LINUX_EOPNOTSUPPORT 95 +#define LINUX_EPFNOTSUPPORT 96 +#define LINUX_EAFNOTSUPPORT 97 +#define LINUX_EADDRINUSE 98 +#define LINUX_EADDRNOTAVAIL 99 + +#define LINUX_ENETDOWN 100 +#define LINUX_ENETUNREACH 101 +#define LINUX_ENETRESET 102 +#define LINUX_ECONNABORTED 103 +#define LINUX_ECONNRESET 104 +#define LINUX_ENOBUFS 105 +#define LINUX_EISCONN 106 +#define LINUX_ENOTCONN 107 +#define LINUX_ESHUTDOWN 108 +#define LINUX_ETOOMANYREFS 109 + +#define LINUX_ETIMEDOUT 110 +#define LINUX_ECONNREFUSED 111 +#define LINUX_EHOSTDOWN 112 +#define LINUX_EHOSTUNREACH 113 +#define LINUX_EALREADY 114 +#define LINUX_EINPROGRESS 115 +#define LINUX_ESTALE 116 +#define LINUX_EUCLEAN 117 +#define LINUX_ENOTNAM 118 +#define LINUX_ENAVAIL 119 + +#define LINUX_EISNAM 120 +#define LINUX_EREMOTEIO 121 +#define LINUX_EDQUOT 122 +#define LINUX_ENOMEDIUM 123 +#define LINUX_EMEDIUMTYPE 124 +#define LINUX_ECANCELED 125 +#define LINUX_ENOKEY 126 +#define LINUX_EKEYEXPIRED 127 +#define LINUX_EKEYREVOKED 128 +#define LINUX_EKEYREJECTED 129 + +#define LINUX_EOWNERDEAD 130 +#define LINUX_ENOTRECOVERABLE 131 +#define LINUX_ERFKILL 132 +#define LINUX_EHWPOISON 133 + +#define LINUX_ELAST LINUX_EHWPOISON + +#endif /* _LINUX_ERRNO_H_ */ Index: sys/compat/linux/linux_errno.c =================================================================== --- sys/compat/linux/linux_errno.c +++ sys/compat/linux/linux_errno.c @@ -8,6 +8,7 @@ #include #include +#include #include int @@ -19,3 +20,32 @@ return (linux_errtbl[error]); } + +int +linux_to_bsd_errno(int error) +{ + + KASSERT(error >= 0 && error <= ELAST, + ("%s: bad error %d", __func__, error)); + + return (linux_to_bsd_errtbl[error]); +} + +#ifdef INVARIANTS +void +linux_check_errtbl(void) +{ + int i; + + for (i = 1; i < sizeof(linux_errtbl); i++) { + KASSERT(linux_errtbl[i] != 0, + ("%s: linux_errtbl[%d] == 0", __func__, i)); + } + + for (i = 1; i < sizeof(linux_to_bsd_errtbl); i++) { + KASSERT(linux_to_bsd_errtbl[i] != 0, + ("%s: linux_to_bsd_errtbl[%d] == 0", __func__, i)); + } + +} +#endif Index: sys/compat/linux/linux_errno.inc =================================================================== --- sys/compat/linux/linux_errno.inc +++ sys/compat/linux/linux_errno.inc @@ -36,114 +36,291 @@ * include/uapi/asm-generic/errno.h */ const int linux_errtbl[ELAST + 1] = { - -0, - -1, - -2, - -3, - -4, - -5, - -6, - -7, - -8, - -9, + /* [0, 9] */ + [0] = -0, + [EPERM] = -LINUX_EPERM, + [ENOENT] = -LINUX_ENOENT, + [ESRCH] = -LINUX_ESRCH, + [EINTR] = -LINUX_EINTR, + [EIO] = -LINUX_EIO, + [ENXIO] = -LINUX_ENXIO, + [E2BIG] = -LINUX_E2BIG, + [ENOEXEC] = -LINUX_ENOEXEC, + [EBADF] = -LINUX_EBADF, - -10, - -35, /* EDEADLK */ - -12, - -13, - -14, - -15, - -16, - -17, - -18, - -19, + /* [10, 19] */ + [ECHILD] = -LINUX_ECHILD, + [EDEADLK] = -LINUX_EDEADLK, + [ENOMEM] = -LINUX_ENOMEM, + [EACCES] = -LINUX_EACCES, + [EFAULT] = -LINUX_EFAULT, + [ENOTBLK] = -LINUX_ENOTBLK, + [EBUSY] = -LINUX_EBUSY, + [EEXIST] = -LINUX_EEXIST, + [EXDEV] = -LINUX_EXDEV, + [ENODEV] = -LINUX_ENODEV, - -20, - -21, - -22, - -23, - -24, - -25, - -26, - -27, - -28, - -29, + /* [20, 29] */ + [ENOTDIR] = -LINUX_ENOTDIR, + [EISDIR] = -LINUX_EISDIR, + [EINVAL] = -LINUX_EINVAL, + [ENFILE] = -LINUX_ENFILE, + [EMFILE] = -LINUX_EMFILE, + [ENOTTY] = -LINUX_ENOTTY, + [ETXTBSY] = -LINUX_ETXTBSY, + [EFBIG] = -LINUX_EFBIG, + [ENOSPC] = -LINUX_ENOSPC, + [ESPIPE] = -LINUX_ESPIPE, - -30, - -31, - -32, - -33, - -34, - -11, /* EAGAIN */ - -115, - -114, - -88, - -89, + /* [30, 39] */ + [EROFS] = -LINUX_EROFS, + [EMLINK] = -LINUX_EMLINK, + [EPIPE] = -LINUX_EPIPE, + [EDOM] = -LINUX_EDOM, + [ERANGE] = -LINUX_ERANGE, + [EAGAIN] = -LINUX_EAGAIN, + [EINPROGRESS] = -LINUX_EINPROGRESS, + [EALREADY] = -LINUX_EALREADY, + [ENOTSOCK] = -LINUX_ENOTSOCK, + [EDESTADDRREQ] = -LINUX_EDESTADDRREQ, - -90, - -91, - -92, - -93, - -94, - -95, - -96, - -97, - -98, - -99, + /* [40, 49] */ + [EMSGSIZE] = -LINUX_EMSGSIZE, + [EPROTOTYPE] = -LINUX_EPROTOTYPE, + [ENOPROTOOPT] = -LINUX_ENOPROTOOPT, + [EPROTONOSUPPORT] = -LINUX_EPROTONOTSUPPORT, + [ESOCKTNOSUPPORT] = -LINUX_ESOCKNOTSUPPORT, + [EOPNOTSUPP] = -LINUX_EOPNOTSUPPORT, + [EPFNOSUPPORT] = -LINUX_EPFNOTSUPPORT, + [EAFNOSUPPORT] = -LINUX_EAFNOTSUPPORT, + [EADDRINUSE] = -LINUX_EADDRINUSE, + [EADDRNOTAVAIL] = -LINUX_EADDRNOTAVAIL, - -100, - -101, - -102, - -103, - -104, - -105, - -106, - -107, - -108, - -109, + /* [50, 59] */ + [ENETDOWN] = -LINUX_ENETDOWN, + [ENETUNREACH] = -LINUX_ENETUNREACH, + [ENETRESET] = -LINUX_ENETRESET, + [ECONNABORTED] = -LINUX_ECONNABORTED, + [ECONNRESET] = -LINUX_ECONNRESET, + [ENOBUFS] = -LINUX_ENOBUFS, + [EISCONN] = -LINUX_EISCONN, + [ENOTCONN] = -LINUX_ENOTCONN, + [ESHUTDOWN] = -LINUX_ESHUTDOWN, + [ETOOMANYREFS] = -LINUX_ETOOMANYREFS, - -110, - -111, - -40, - -36, - -112, - -113, - -39, - -11, - -87, - -122, + /* [60, 69] */ + [ETIMEDOUT] = -LINUX_ETIMEDOUT, + [ECONNREFUSED] = -LINUX_ECONNREFUSED, + [ELOOP] = -LINUX_ELOOP, + [ENAMETOOLONG] = -LINUX_ENAMETOOLONG, + [EHOSTDOWN] = -LINUX_EHOSTDOWN, + [EHOSTUNREACH] = -LINUX_EHOSTUNREACH, + [ENOTEMPTY] = -LINUX_ENOTEMPTY, + [EPROCLIM] = -LINUX_EAGAIN, /* EPROCLIM -> EAGAIN, XXX */ + [EUSERS] = -LINUX_EUSERS, + [EDQUOT] = -LINUX_EDQUOT, - -116, - -66, - -6, /* EBADRPC -> ENXIO */ - -6, /* ERPCMISMATCH -> ENXIO */ - -6, /* EPROGUNAVAIL -> ENXIO */ - -6, /* EPROGMISMATCH -> ENXIO */ - -6, /* EPROCUNAVAIL -> ENXIO */ - -37, - -38, - -9, + /* [70, 79] */ + [ESTALE] = -LINUX_ESTALE, + [EREMOTE] = -LINUX_EREMOTE, + [EBADRPC] = -LINUX_ENXIO, /* EBADRPC -> ENXIO */ + [ERPCMISMATCH] = -LINUX_ENXIO, /* ERPCMISMATCH -> ENXIO */ + [EPROGUNAVAIL] = -LINUX_ENXIO, /* EPROGUNAVAIL -> ENXIO */ + [EPROGMISMATCH] = -LINUX_ENXIO, /* EPROGMISMATCH -> ENXIO */ + [EPROCUNAVAIL] = -LINUX_ENXIO, /* EPROCUNAVAIL -> ENXIO */ + [ENOLCK] = -LINUX_ENOLCK, + [ENOSYS] = -LINUX_ENOSYS, + [EFTYPE] = -LINUX_EBADF, /* EFTYPE -> EBADF */ - -6, /* EAUTH -> ENXIO */ - -6, /* ENEEDAUTH -> ENXIO */ - -43, - -42, - -75, - -125, - -84, - -61, - -22, /* EDOOFUS -> EINVAL */ - -74, + /* [80, 89] */ + [EAUTH] = -LINUX_ENXIO, /* EAUTH -> ENXIO */ + [ENEEDAUTH] = -LINUX_ENXIO, /* ENEEDAUTH -> ENXIO */ + [EIDRM] = -LINUX_EIDRM, + [ENOMSG] = -LINUX_ENOMSG, + [EOVERFLOW] = -LINUX_EOVERFLOW, + [ECANCELED] = -LINUX_ECANCELED, + [EILSEQ] = -LINUX_EILSEQ, + [ENOATTR] = -LINUX_ENODATA, /* ENOATTR -> ENODATA */ + [EDOOFUS] = -LINUX_EINVAL, /* EDOOFUS -> EINVAL */ + [EBADMSG] = -LINUX_EBADMSG, - -72, - -67, - -71, - -1, /* ENOTCAPABLE -> EPERM */ - -1, /* ECAPMODE -> EPERM */ - -131, /* ENOTRECOVERABLE */ - -130, /* EOWNERDEAD */ - -22, /* EINTEGRITY -> EINVAL */ + /* [90, 99] */ + [EMULTIHOP] = -LINUX_EMULTIHOP, + [ENOLINK] = -LINUX_ENOLINK, + [EPROTO] = -LINUX_EPROTO, + [ENOTCAPABLE] = -LINUX_EPERM, /* ENOTCAPABLE -> EPERM */ + [ECAPMODE] = -LINUX_EPERM, /* ECAPMODE -> EPERM */ + [ENOTRECOVERABLE] = -LINUX_ENOTRECOVERABLE, + [EOWNERDEAD] = -LINUX_EOWNERDEAD, + [EINTEGRITY] = -LINUX_EINVAL, /* EINTEGRITY -> EINVAL */ }; _Static_assert(ELAST == 97, "missing errno entries in linux_errtbl"); + +const int linux_to_bsd_errtbl[LINUX_ELAST + 1] = { + /* [0, 9] */ + [0] = -0, + [LINUX_EPERM] = EPERM, + [LINUX_ENOENT] = ENOENT, + [LINUX_ESRCH] = ESRCH, + [LINUX_EINTR] = EINTR, + [LINUX_EIO] = EIO, + [LINUX_ENXIO] = ENXIO, + [LINUX_E2BIG] = E2BIG, + [LINUX_ENOEXEC] = ENOENT, + [LINUX_EBADF] = EBADF, + + /* [10, 19] */ + [LINUX_ECHILD] = ECHILD, + [LINUX_EAGAIN] = EAGAIN, + [LINUX_ENOMEM] = ENOMEM, + [LINUX_EACCES] = EACCES, + [LINUX_EFAULT] = EFAULT, + [LINUX_ENOTBLK] = ENOTBLK, + [LINUX_EBUSY] = EBUSY, + [LINUX_EEXIST] = EEXIST, + [LINUX_EXDEV] = EXDEV, + [LINUX_ENODEV] = ENODEV, + + /* [20, 29] */ + [LINUX_ENOTDIR] = ENOTDIR, + [LINUX_EISDIR] = EISDIR, + [LINUX_EINVAL] = EINVAL, + [LINUX_ENFILE] = ENFILE, + [LINUX_EMFILE] = EMFILE, + [LINUX_ENOTTY] = ENOTTY, + [LINUX_ETXTBSY] = ETXTBSY, + [LINUX_EFBIG] = EFBIG, + [LINUX_ENOSPC] = ENOSPC, + [LINUX_ESPIPE] = ESPIPE, + + /* [30, 39] */ + [LINUX_EROFS] = EROFS, + [LINUX_EMLINK] = EMLINK, + [LINUX_EPIPE] = EPIPE, + [LINUX_EDOM] = EDOM, + [LINUX_ERANGE] = ERANGE, + [LINUX_EDEADLK] = EDEADLK, + [LINUX_ENAMETOOLONG] = ENAMETOOLONG, + [LINUX_ENOLCK] = ENOLCK, + [LINUX_ENOSYS] = ENOSYS, + [LINUX_ENOTEMPTY] = ENOTEMPTY, + + /* [40, 49] */ + [LINUX_ELOOP] = ELOOP, + [LINUX_ESEEMSUNUSED] = EINVAL, /* 41 -> EINVAL */ + [LINUX_ENOMSG] = ENOMSG, + [LINUX_EIDRM] = EIDRM, + [LINUX_ECHRNG] = EINVAL, /* ECHRNG -> EINVAL */ + [LINUX_EL2NSYNC] = EINVAL, /* EL2NSYNC -> EINVAL */ + [LINUX_EL3HLT] = EINVAL, /* EL3HLT -> EINVAL */ + [LINUX_EL3RST] = EINVAL, /* EL3RST -> EINVAL */ + [LINUX_ELNRNG] = EINVAL, /* ELNRNG -> EINVAL */ + [LINUX_EUNATCH] = EINVAL, /* EUNATCH -> EINVAL */ + + /* [50, 59] */ + [LINUX_ENOCSI] = EINVAL, /* ENOCSI -> EINVAL */ + [LINUX_EL2HLT] = EINVAL, /* EL2HLT -> EINVAL */ + [LINUX_EBADE] = EINVAL, /* EBADE -> EINVAL */ + [LINUX_EBADR] = EINVAL, /* EBADR -> EINVAL */ + [LINUX_EXFULL] = EINVAL, /* EXFULL -> EINVAL */ + [LINUX_ENOANO] = EINVAL, /* ENOANO -> EINVAL */ + [LINUX_EBADRQC] = EINVAL, /* EBADRQC -> EINVAL */ + [LINUX_EBADSLT] = EINVAL, /* EBADSLT -> EINVAL */ + [LINUX_EALSOUNUSED] = EINVAL, /* 58 -> EINVAL */ + [LINUX_EBFONT] = EINVAL, /* EBFONT -> EINVAL */ + + /* [60, 69] */ + [LINUX_ENOSTR] = EINVAL, /* ENOSTR -> EINVAL */ + [LINUX_ENODATA] = ENOATTR, /* ENODATA -> ENOATTR */ + [LINUX_ENOTIME] = EINVAL, /* ENOTIME -> EINVAL */ + [LINUX_ENOSR] = EINVAL, /* ENOSR -> EINVAL */ + [LINUX_ENONET] = EINVAL, /* ENONET -> EINVAL */ + [LINUX_ENOPKG] = EINVAL, /* ENOPKG -> EINVAL */ + [LINUX_EREMOTE] = EREMOTE, + [LINUX_ENOLINK] = ENOLINK, + [LINUX_EADV] = EINVAL, /* EADV -> EINVAL */ + [LINUX_ESRMNT] = EINVAL, /* ESRMNT -> EINVAL */ + + /* [70, 79] */ + [LINUX_ECOMM] = EINVAL, /* ECOMM -> EINVAL */ + [LINUX_EPROTO] = EPROTO, + [LINUX_EMULTIHOP] = EMULTIHOP, + [LINUX_EDOTDOT] = EINVAL, /* EDOTDOT -> EINVAL */ + [LINUX_EBADMSG] = EBADMSG, + [LINUX_EOVERFLOW] = EOVERFLOW, + [LINUX_ENOTUNIQ] = EINVAL, /* ENOTUNIQ -> EINVAL */ + [LINUX_EBADFD] = EBADF, /* EBADFD -> EBADF */ + [LINUX_EREMCHG] = EINVAL, /* EREMCHG -> EINVAL */ + [LINUX_ELIBACC] = EINVAL, /* ELIBACC -> EINVAL */ + + /* [80, 89] */ + [LINUX_ELIBBAD] = EINVAL, /* ELIBBAD -> EINVAL */ + [LINUX_ELIBSCN] = EINVAL, /* ELIBSCN -> EINVAL */ + [LINUX_ELIBMAX] = EINVAL, /* ELIBMAX -> EINVAL */ + [LINUX_ELIBEXEC] = EINVAL, /* ELIBEXEC -> EINVAL */ + [LINUX_EILSEQ] = EILSEQ, + [LINUX_ERESTART] = EAGAIN, /* ERESTART -> EAGAIN */ + [LINUX_ESTRPIPE] = EINVAL, /* ESTRPIPE -> EINVAL */ + [LINUX_EUSERS] = EUSERS, + [LINUX_ENOTSOCK] = ENOTSOCK, + [LINUX_EDESTADDRREQ] = EDESTADDRREQ, + + /* [90, 99] */ + [LINUX_EMSGSIZE] = EMSGSIZE, + [LINUX_EPROTOTYPE] = EPROTOTYPE, + [LINUX_ENOPROTOOPT] = ENOPROTOOPT, + [LINUX_EPROTONOTSUPPORT] = EPROTONOSUPPORT, + [LINUX_ESOCKNOTSUPPORT] = EPROTONOSUPPORT, /* ESOCKNOTSUPPORT -> EPROTONOTSUPPORT */ + [LINUX_EOPNOTSUPPORT] = EOPNOTSUPP, + [LINUX_EPFNOTSUPPORT] = EPFNOSUPPORT, + [LINUX_EAFNOTSUPPORT] = EAFNOSUPPORT, + [LINUX_EADDRINUSE] = EADDRINUSE, + [LINUX_EADDRNOTAVAIL] = EADDRNOTAVAIL, + + /* [100, 109] */ + [LINUX_ENETDOWN] = ENETDOWN, + [LINUX_ENETUNREACH] = ENETUNREACH, + [LINUX_ENETRESET] = ENETRESET, + [LINUX_ECONNABORTED] = ECONNABORTED, + [LINUX_ECONNRESET] = ECONNRESET, + [LINUX_ENOBUFS] = ENOBUFS, + [LINUX_EISCONN] = EISCONN, + [LINUX_ENOTCONN] = ENOTCONN, + [LINUX_ESHUTDOWN] = ESHUTDOWN, + [LINUX_ETOOMANYREFS] = ETOOMANYREFS, + + /* [110, 119] */ + [LINUX_ETIMEDOUT] = ETIMEDOUT, + [LINUX_ECONNREFUSED] = ECONNREFUSED, + [LINUX_EHOSTDOWN] = EHOSTDOWN, + [LINUX_EHOSTUNREACH] = EHOSTUNREACH, + [LINUX_EALREADY] = EALREADY, + [LINUX_EINPROGRESS] = EINPROGRESS, + [LINUX_ESTALE] = ESTALE, + [LINUX_EUCLEAN] = EINVAL, /* EUCLEAN -> EINVAL */ + [LINUX_ENOTNAM] = EINVAL, /* ENOTNAM -> EINVAL */ + [LINUX_ENAVAIL] = EINVAL, /* ENAVAIL -> EINVAL */ + + /* [120, 129] */ + [LINUX_EISNAM] = EINVAL, /* EISNAM -> EINVAL */ + [LINUX_EREMOTEIO] = EINVAL, /* EREMOTEIO -> EINVAL */ + [LINUX_EDQUOT] = EDQUOT, + [LINUX_ENOMEDIUM] = EIO, /* ENOMEDIUM -> EIO */ + [LINUX_EMEDIUMTYPE] = EIO, /* EMEDIUMTYPE -> EIO */ + [LINUX_ECANCELED] = ECANCELED, + [LINUX_ENOKEY] = EIO, /* ENOKEY -> EIO */ + [LINUX_EKEYEXPIRED] = EIO, /* EKEYEXPIRED -> EIO */ + [LINUX_EKEYREVOKED] = EIO, /* EKEYREVOKED -> EIO */ + [LINUX_EKEYREJECTED] = EIO, /* EKEYREJECTED -> EIO */ + + /* [130, 139] */ + [LINUX_EOWNERDEAD] = EOWNERDEAD, + [LINUX_ENOTRECOVERABLE] = ENOTRECOVERABLE, + [LINUX_ERFKILL] = ENETDOWN, /* ERFKILL -> ENETDOWN */ + [LINUX_EHWPOISON] = EINVAL, /* EHWPOISON -> EINVAL */ +}; + +_Static_assert(LINUX_ELAST == LINUX_EHWPOISON, + "missing errno entries in linux_to_bsd_errtbl");