1 /*-
2 * Copyright (c) 2018 Conrad Meyer <cem@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 #define _WANT_KERNEL_ERRNO 1
28 #include <errno.h>
29
30 #include <lua.h>
31 #include "lauxlib.h"
32 #include "lerrno.h"
33
34 #ifndef nitems
35 #define nitems(x) (sizeof((x)) / sizeof((x)[0]))
36 #endif
37
38 /*
39 * Populated with:
40 * $ egrep "^#define.E" sys/sys/errno.h | \
41 * awk '{ print "\tENTRY(" $2 ")," }' >> lerrno.c
42 */
43 #define ENTRY(name) { #name, name }
44 static const struct err_name_number {
45 const char *err_name;
46 int err_num;
47 } errnoconstants[] = {
48 ENTRY(EPERM),
49 ENTRY(ENOENT),
50 ENTRY(ESRCH),
51 ENTRY(EINTR),
52 ENTRY(EIO),
53 ENTRY(ENXIO),
54 ENTRY(E2BIG),
55 ENTRY(ENOEXEC),
56 ENTRY(EBADF),
57 ENTRY(ECHILD),
58 ENTRY(EDEADLK),
59 ENTRY(ENOMEM),
60 ENTRY(EACCES),
61 ENTRY(EFAULT),
62 ENTRY(ENOTBLK),
63 ENTRY(EBUSY),
64 ENTRY(EEXIST),
65 ENTRY(EXDEV),
66 ENTRY(ENODEV),
67 ENTRY(ENOTDIR),
68 ENTRY(EISDIR),
69 ENTRY(EINVAL),
70 ENTRY(ENFILE),
71 ENTRY(EMFILE),
72 ENTRY(ENOTTY),
73 ENTRY(ETXTBSY),
74 ENTRY(EFBIG),
75 ENTRY(ENOSPC),
76 ENTRY(ESPIPE),
77 ENTRY(EROFS),
78 ENTRY(EMLINK),
79 ENTRY(EPIPE),
80 ENTRY(EDOM),
81 ENTRY(ERANGE),
82 ENTRY(EAGAIN),
83 ENTRY(EWOULDBLOCK),
84 ENTRY(EINPROGRESS),
85 ENTRY(EALREADY),
86 ENTRY(ENOTSOCK),
87 ENTRY(EDESTADDRREQ),
88 ENTRY(EMSGSIZE),
89 ENTRY(EPROTOTYPE),
90 ENTRY(ENOPROTOOPT),
91 ENTRY(EPROTONOSUPPORT),
92 ENTRY(ESOCKTNOSUPPORT),
93 ENTRY(EOPNOTSUPP),
94 ENTRY(ENOTSUP),
95 ENTRY(EPFNOSUPPORT),
96 ENTRY(EAFNOSUPPORT),
97 ENTRY(EADDRINUSE),
98 ENTRY(EADDRNOTAVAIL),
99 ENTRY(ENETDOWN),
100 ENTRY(ENETUNREACH),
101 ENTRY(ENETRESET),
102 ENTRY(ECONNABORTED),
103 ENTRY(ECONNRESET),
104 ENTRY(ENOBUFS),
105 ENTRY(EISCONN),
106 ENTRY(ENOTCONN),
107 ENTRY(ESHUTDOWN),
108 ENTRY(ETOOMANYREFS),
109 ENTRY(ETIMEDOUT),
110 ENTRY(ECONNREFUSED),
111 ENTRY(ELOOP),
112 ENTRY(ENAMETOOLONG),
113 ENTRY(EHOSTDOWN),
114 ENTRY(EHOSTUNREACH),
115 ENTRY(ENOTEMPTY),
116 ENTRY(EPROCLIM),
117 ENTRY(EUSERS),
118 ENTRY(EDQUOT),
119 ENTRY(ESTALE),
120 ENTRY(EREMOTE),
121 ENTRY(EBADRPC),
122 ENTRY(ERPCMISMATCH),
123 ENTRY(EPROGUNAVAIL),
124 ENTRY(EPROGMISMATCH),
125 ENTRY(EPROCUNAVAIL),
126 ENTRY(ENOLCK),
127 ENTRY(ENOSYS),
128 ENTRY(EFTYPE),
129 ENTRY(EAUTH),
130 ENTRY(ENEEDAUTH),
131 ENTRY(EIDRM),
132 ENTRY(ENOMSG),
133 ENTRY(EOVERFLOW),
134 ENTRY(ECANCELED),
135 ENTRY(EILSEQ),
136 ENTRY(ENOATTR),
137 ENTRY(EDOOFUS),
138 ENTRY(EBADMSG),
139 ENTRY(EMULTIHOP),
140 ENTRY(ENOLINK),
141 ENTRY(EPROTO),
142 ENTRY(ENOTCAPABLE),
143 ENTRY(ECAPMODE),
144 ENTRY(ENOTRECOVERABLE),
145 ENTRY(EOWNERDEAD),
146 ENTRY(EINTEGRITY),
147 ENTRY(ELAST),
148 ENTRY(ERESTART),
149 ENTRY(EJUSTRETURN),
150 ENTRY(ENOIOCTL),
151 ENTRY(EDIRIOCTL),
152 ENTRY(ERELOOKUP),
153 };
154 #undef ENTRY
155
156 static void
lerrno_register(lua_State * L)157 lerrno_register(lua_State *L)
158 {
159 size_t i;
160
161 for (i = 0; i < nitems(errnoconstants); i++) {
162 lua_pushinteger(L, errnoconstants[i].err_num);
163 lua_setfield(L, -2, errnoconstants[i].err_name);
164 }
165 }
166
167 static const struct luaL_Reg errnolib[] = {
168 /* Extra bogus entry required by luaL_newlib API */
169 { NULL, NULL },
170 };
171
172 int
luaopen_errno(lua_State * L)173 luaopen_errno(lua_State *L)
174 {
175 luaL_newlib(L, errnolib);
176 lerrno_register(L);
177 return 1;
178 }
179