1f91f3926SConrad Meyer /*-
2f91f3926SConrad Meyer * Copyright (c) 2018 Conrad Meyer <cem@FreeBSD.org>
3f91f3926SConrad Meyer * All rights reserved.
4f91f3926SConrad Meyer *
5f91f3926SConrad Meyer * Redistribution and use in source and binary forms, with or without
6f91f3926SConrad Meyer * modification, are permitted provided that the following conditions
7f91f3926SConrad Meyer * are met:
8f91f3926SConrad Meyer * 1. Redistributions of source code must retain the above copyright
9f91f3926SConrad Meyer * notice, this list of conditions and the following disclaimer.
10f91f3926SConrad Meyer * 2. Redistributions in binary form must reproduce the above copyright
11f91f3926SConrad Meyer * notice, this list of conditions and the following disclaimer in the
12f91f3926SConrad Meyer * documentation and/or other materials provided with the distribution.
13f91f3926SConrad Meyer *
14f91f3926SConrad Meyer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15f91f3926SConrad Meyer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16f91f3926SConrad Meyer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17f91f3926SConrad Meyer * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18f91f3926SConrad Meyer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19f91f3926SConrad Meyer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20f91f3926SConrad Meyer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21f91f3926SConrad Meyer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22f91f3926SConrad Meyer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23f91f3926SConrad Meyer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24f91f3926SConrad Meyer * SUCH DAMAGE.
25f91f3926SConrad Meyer */
26f91f3926SConrad Meyer
27f91f3926SConrad Meyer #define _WANT_KERNEL_ERRNO 1
28f91f3926SConrad Meyer #include <errno.h>
29f91f3926SConrad Meyer
30f91f3926SConrad Meyer #include <lua.h>
31f91f3926SConrad Meyer #include "lauxlib.h"
32f91f3926SConrad Meyer #include "lerrno.h"
33f91f3926SConrad Meyer
34f91f3926SConrad Meyer #ifndef nitems
35f91f3926SConrad Meyer #define nitems(x) (sizeof((x)) / sizeof((x)[0]))
36f91f3926SConrad Meyer #endif
37f91f3926SConrad Meyer
38f91f3926SConrad Meyer /*
39f91f3926SConrad Meyer * Populated with:
40f91f3926SConrad Meyer * $ egrep "^#define.E" sys/sys/errno.h | \
41f91f3926SConrad Meyer * awk '{ print "\tENTRY(" $2 ")," }' >> lerrno.c
42f91f3926SConrad Meyer */
43f91f3926SConrad Meyer #define ENTRY(name) { #name, name }
44f91f3926SConrad Meyer static const struct err_name_number {
45f91f3926SConrad Meyer const char *err_name;
46f91f3926SConrad Meyer int err_num;
47f91f3926SConrad Meyer } errnoconstants[] = {
48f91f3926SConrad Meyer ENTRY(EPERM),
49f91f3926SConrad Meyer ENTRY(ENOENT),
50f91f3926SConrad Meyer ENTRY(ESRCH),
51f91f3926SConrad Meyer ENTRY(EINTR),
52f91f3926SConrad Meyer ENTRY(EIO),
53f91f3926SConrad Meyer ENTRY(ENXIO),
54f91f3926SConrad Meyer ENTRY(E2BIG),
55f91f3926SConrad Meyer ENTRY(ENOEXEC),
56f91f3926SConrad Meyer ENTRY(EBADF),
57f91f3926SConrad Meyer ENTRY(ECHILD),
58f91f3926SConrad Meyer ENTRY(EDEADLK),
59f91f3926SConrad Meyer ENTRY(ENOMEM),
60f91f3926SConrad Meyer ENTRY(EACCES),
61f91f3926SConrad Meyer ENTRY(EFAULT),
62f91f3926SConrad Meyer ENTRY(ENOTBLK),
63f91f3926SConrad Meyer ENTRY(EBUSY),
64f91f3926SConrad Meyer ENTRY(EEXIST),
65f91f3926SConrad Meyer ENTRY(EXDEV),
66f91f3926SConrad Meyer ENTRY(ENODEV),
67f91f3926SConrad Meyer ENTRY(ENOTDIR),
68f91f3926SConrad Meyer ENTRY(EISDIR),
69f91f3926SConrad Meyer ENTRY(EINVAL),
70f91f3926SConrad Meyer ENTRY(ENFILE),
71f91f3926SConrad Meyer ENTRY(EMFILE),
72f91f3926SConrad Meyer ENTRY(ENOTTY),
73f91f3926SConrad Meyer ENTRY(ETXTBSY),
74f91f3926SConrad Meyer ENTRY(EFBIG),
75f91f3926SConrad Meyer ENTRY(ENOSPC),
76f91f3926SConrad Meyer ENTRY(ESPIPE),
77f91f3926SConrad Meyer ENTRY(EROFS),
78f91f3926SConrad Meyer ENTRY(EMLINK),
79f91f3926SConrad Meyer ENTRY(EPIPE),
80f91f3926SConrad Meyer ENTRY(EDOM),
81f91f3926SConrad Meyer ENTRY(ERANGE),
82f91f3926SConrad Meyer ENTRY(EAGAIN),
83f91f3926SConrad Meyer ENTRY(EWOULDBLOCK),
84f91f3926SConrad Meyer ENTRY(EINPROGRESS),
85f91f3926SConrad Meyer ENTRY(EALREADY),
86f91f3926SConrad Meyer ENTRY(ENOTSOCK),
87f91f3926SConrad Meyer ENTRY(EDESTADDRREQ),
88f91f3926SConrad Meyer ENTRY(EMSGSIZE),
89f91f3926SConrad Meyer ENTRY(EPROTOTYPE),
90f91f3926SConrad Meyer ENTRY(ENOPROTOOPT),
91f91f3926SConrad Meyer ENTRY(EPROTONOSUPPORT),
92f91f3926SConrad Meyer ENTRY(ESOCKTNOSUPPORT),
93f91f3926SConrad Meyer ENTRY(EOPNOTSUPP),
94f91f3926SConrad Meyer ENTRY(ENOTSUP),
95f91f3926SConrad Meyer ENTRY(EPFNOSUPPORT),
96f91f3926SConrad Meyer ENTRY(EAFNOSUPPORT),
97f91f3926SConrad Meyer ENTRY(EADDRINUSE),
98f91f3926SConrad Meyer ENTRY(EADDRNOTAVAIL),
99f91f3926SConrad Meyer ENTRY(ENETDOWN),
100f91f3926SConrad Meyer ENTRY(ENETUNREACH),
101f91f3926SConrad Meyer ENTRY(ENETRESET),
102f91f3926SConrad Meyer ENTRY(ECONNABORTED),
103f91f3926SConrad Meyer ENTRY(ECONNRESET),
104f91f3926SConrad Meyer ENTRY(ENOBUFS),
105f91f3926SConrad Meyer ENTRY(EISCONN),
106f91f3926SConrad Meyer ENTRY(ENOTCONN),
107f91f3926SConrad Meyer ENTRY(ESHUTDOWN),
108f91f3926SConrad Meyer ENTRY(ETOOMANYREFS),
109f91f3926SConrad Meyer ENTRY(ETIMEDOUT),
110f91f3926SConrad Meyer ENTRY(ECONNREFUSED),
111f91f3926SConrad Meyer ENTRY(ELOOP),
112f91f3926SConrad Meyer ENTRY(ENAMETOOLONG),
113f91f3926SConrad Meyer ENTRY(EHOSTDOWN),
114f91f3926SConrad Meyer ENTRY(EHOSTUNREACH),
115f91f3926SConrad Meyer ENTRY(ENOTEMPTY),
116f91f3926SConrad Meyer ENTRY(EPROCLIM),
117f91f3926SConrad Meyer ENTRY(EUSERS),
118f91f3926SConrad Meyer ENTRY(EDQUOT),
119f91f3926SConrad Meyer ENTRY(ESTALE),
120f91f3926SConrad Meyer ENTRY(EREMOTE),
121f91f3926SConrad Meyer ENTRY(EBADRPC),
122f91f3926SConrad Meyer ENTRY(ERPCMISMATCH),
123f91f3926SConrad Meyer ENTRY(EPROGUNAVAIL),
124f91f3926SConrad Meyer ENTRY(EPROGMISMATCH),
125f91f3926SConrad Meyer ENTRY(EPROCUNAVAIL),
126f91f3926SConrad Meyer ENTRY(ENOLCK),
127f91f3926SConrad Meyer ENTRY(ENOSYS),
128f91f3926SConrad Meyer ENTRY(EFTYPE),
129f91f3926SConrad Meyer ENTRY(EAUTH),
130f91f3926SConrad Meyer ENTRY(ENEEDAUTH),
131f91f3926SConrad Meyer ENTRY(EIDRM),
132f91f3926SConrad Meyer ENTRY(ENOMSG),
133f91f3926SConrad Meyer ENTRY(EOVERFLOW),
134f91f3926SConrad Meyer ENTRY(ECANCELED),
135f91f3926SConrad Meyer ENTRY(EILSEQ),
136f91f3926SConrad Meyer ENTRY(ENOATTR),
137f91f3926SConrad Meyer ENTRY(EDOOFUS),
138f91f3926SConrad Meyer ENTRY(EBADMSG),
139f91f3926SConrad Meyer ENTRY(EMULTIHOP),
140f91f3926SConrad Meyer ENTRY(ENOLINK),
141f91f3926SConrad Meyer ENTRY(EPROTO),
142f91f3926SConrad Meyer ENTRY(ENOTCAPABLE),
143f91f3926SConrad Meyer ENTRY(ECAPMODE),
144f91f3926SConrad Meyer ENTRY(ENOTRECOVERABLE),
145f91f3926SConrad Meyer ENTRY(EOWNERDEAD),
146*88640c0eSKirk McKusick ENTRY(EINTEGRITY),
147f91f3926SConrad Meyer ENTRY(ELAST),
148f91f3926SConrad Meyer ENTRY(ERESTART),
149f91f3926SConrad Meyer ENTRY(EJUSTRETURN),
150f91f3926SConrad Meyer ENTRY(ENOIOCTL),
151f91f3926SConrad Meyer ENTRY(EDIRIOCTL),
152f91f3926SConrad Meyer ENTRY(ERELOOKUP),
153f91f3926SConrad Meyer };
154f91f3926SConrad Meyer #undef ENTRY
155f91f3926SConrad Meyer
156f91f3926SConrad Meyer static void
lerrno_register(lua_State * L)157f91f3926SConrad Meyer lerrno_register(lua_State *L)
158f91f3926SConrad Meyer {
159f91f3926SConrad Meyer size_t i;
160f91f3926SConrad Meyer
161f91f3926SConrad Meyer for (i = 0; i < nitems(errnoconstants); i++) {
162f91f3926SConrad Meyer lua_pushinteger(L, errnoconstants[i].err_num);
163f91f3926SConrad Meyer lua_setfield(L, -2, errnoconstants[i].err_name);
164f91f3926SConrad Meyer }
165f91f3926SConrad Meyer }
166f91f3926SConrad Meyer
167f91f3926SConrad Meyer static const struct luaL_Reg errnolib[] = {
168f91f3926SConrad Meyer /* Extra bogus entry required by luaL_newlib API */
169f91f3926SConrad Meyer { NULL, NULL },
170f91f3926SConrad Meyer };
171f91f3926SConrad Meyer
172f91f3926SConrad Meyer int
luaopen_errno(lua_State * L)173f91f3926SConrad Meyer luaopen_errno(lua_State *L)
174f91f3926SConrad Meyer {
175f91f3926SConrad Meyer luaL_newlib(L, errnolib);
176f91f3926SConrad Meyer lerrno_register(L);
177f91f3926SConrad Meyer return 1;
178f91f3926SConrad Meyer }
179