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