/*- * Copyright (c) 2018 Conrad Meyer * All rights reserved. * * 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. */ #include __FBSDID("$FreeBSD$"); #define _WANT_KERNEL_ERRNO 1 #include #include #include "lauxlib.h" #include "lerrno.h" #ifndef nitems #define nitems(x) (sizeof((x)) / sizeof((x)[0])) #endif /* * Populated with: * $ egrep "^#define.E" sys/sys/errno.h | \ * awk '{ print "\tENTRY(" $2 ")," }' >> lerrno.c */ #define ENTRY(name) { #name, name } static const struct err_name_number { const char *err_name; int err_num; } errnoconstants[] = { ENTRY(EPERM), ENTRY(ENOENT), ENTRY(ESRCH), ENTRY(EINTR), ENTRY(EIO), ENTRY(ENXIO), ENTRY(E2BIG), ENTRY(ENOEXEC), ENTRY(EBADF), ENTRY(ECHILD), ENTRY(EDEADLK), ENTRY(ENOMEM), ENTRY(EACCES), ENTRY(EFAULT), ENTRY(ENOTBLK), ENTRY(EBUSY), ENTRY(EEXIST), ENTRY(EXDEV), ENTRY(ENODEV), ENTRY(ENOTDIR), ENTRY(EISDIR), ENTRY(EINVAL), ENTRY(ENFILE), ENTRY(EMFILE), ENTRY(ENOTTY), ENTRY(ETXTBSY), ENTRY(EFBIG), ENTRY(ENOSPC), ENTRY(ESPIPE), ENTRY(EROFS), ENTRY(EMLINK), ENTRY(EPIPE), ENTRY(EDOM), ENTRY(ERANGE), ENTRY(EAGAIN), ENTRY(EWOULDBLOCK), ENTRY(EINPROGRESS), ENTRY(EALREADY), ENTRY(ENOTSOCK), ENTRY(EDESTADDRREQ), ENTRY(EMSGSIZE), ENTRY(EPROTOTYPE), ENTRY(ENOPROTOOPT), ENTRY(EPROTONOSUPPORT), ENTRY(ESOCKTNOSUPPORT), ENTRY(EOPNOTSUPP), ENTRY(ENOTSUP), ENTRY(EPFNOSUPPORT), ENTRY(EAFNOSUPPORT), ENTRY(EADDRINUSE), ENTRY(EADDRNOTAVAIL), ENTRY(ENETDOWN), ENTRY(ENETUNREACH), ENTRY(ENETRESET), ENTRY(ECONNABORTED), ENTRY(ECONNRESET), ENTRY(ENOBUFS), ENTRY(EISCONN), ENTRY(ENOTCONN), ENTRY(ESHUTDOWN), ENTRY(ETOOMANYREFS), ENTRY(ETIMEDOUT), ENTRY(ECONNREFUSED), ENTRY(ELOOP), ENTRY(ENAMETOOLONG), ENTRY(EHOSTDOWN), ENTRY(EHOSTUNREACH), ENTRY(ENOTEMPTY), ENTRY(EPROCLIM), ENTRY(EUSERS), ENTRY(EDQUOT), ENTRY(ESTALE), ENTRY(EREMOTE), ENTRY(EBADRPC), ENTRY(ERPCMISMATCH), ENTRY(EPROGUNAVAIL), ENTRY(EPROGMISMATCH), ENTRY(EPROCUNAVAIL), ENTRY(ENOLCK), ENTRY(ENOSYS), ENTRY(EFTYPE), ENTRY(EAUTH), ENTRY(ENEEDAUTH), ENTRY(EIDRM), ENTRY(ENOMSG), ENTRY(EOVERFLOW), ENTRY(ECANCELED), ENTRY(EILSEQ), ENTRY(ENOATTR), ENTRY(EDOOFUS), ENTRY(EBADMSG), ENTRY(EMULTIHOP), ENTRY(ENOLINK), ENTRY(EPROTO), ENTRY(ENOTCAPABLE), ENTRY(ECAPMODE), ENTRY(ENOTRECOVERABLE), ENTRY(EOWNERDEAD), ENTRY(EINTEGRITY), ENTRY(ELAST), ENTRY(ERESTART), ENTRY(EJUSTRETURN), ENTRY(ENOIOCTL), ENTRY(EDIRIOCTL), ENTRY(ERELOOKUP), }; #undef ENTRY static void lerrno_register(lua_State *L) { size_t i; for (i = 0; i < nitems(errnoconstants); i++) { lua_pushinteger(L, errnoconstants[i].err_num); lua_setfield(L, -2, errnoconstants[i].err_name); } } static const struct luaL_Reg errnolib[] = { /* Extra bogus entry required by luaL_newlib API */ { NULL, NULL }, }; int luaopen_errno(lua_State *L) { luaL_newlib(L, errnolib); lerrno_register(L); return 1; }