xref: /netbsd-src/libexec/httpd/lua/glue.c (revision 658d9240b5164975217a8440a49fad6fa5210b45)
1390458faSmrg /*-
2390458faSmrg  * Copyright (c) 2009 The NetBSD Foundation, Inc.
3390458faSmrg  * All rights reserved.
4390458faSmrg  *
5390458faSmrg  * This code is derived from software contributed to The NetBSD Foundation
6390458faSmrg  * by Alistair Crooks (agc@netbsd.org)
7390458faSmrg  *
8390458faSmrg  * Redistribution and use in source and binary forms, with or without
9390458faSmrg  * modification, are permitted provided that the following conditions
10390458faSmrg  * are met:
11390458faSmrg  * 1. Redistributions of source code must retain the above copyright
12390458faSmrg  *    notice, this list of conditions and the following disclaimer.
13390458faSmrg  * 2. Redistributions in binary form must reproduce the above copyright
14390458faSmrg  *    notice, this list of conditions and the following disclaimer in the
15390458faSmrg  *    documentation and/or other materials provided with the distribution.
16390458faSmrg  *
17390458faSmrg  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18390458faSmrg  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19390458faSmrg  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20390458faSmrg  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21390458faSmrg  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22390458faSmrg  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23390458faSmrg  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24390458faSmrg  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25390458faSmrg  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26390458faSmrg  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27390458faSmrg  * POSSIBILITY OF SUCH DAMAGE.
28390458faSmrg  */
29390458faSmrg #include <sys/types.h>
30390458faSmrg #include <sys/param.h>
31390458faSmrg #include <sys/stat.h>
32390458faSmrg 
33390458faSmrg #include <bozohttpd.h>
34390458faSmrg #include <inttypes.h>
35390458faSmrg #include <string.h>
36390458faSmrg #include <stdio.h>
37390458faSmrg #include <stdlib.h>
38390458faSmrg #include <unistd.h>
39390458faSmrg 
40390458faSmrg #define LUA_LIB
41390458faSmrg #include <lua.h>
42390458faSmrg #include <lauxlib.h>
43390458faSmrg #include <lualib.h>
44390458faSmrg 
45390458faSmrg #ifndef __UNCONST
46390458faSmrg #define __UNCONST(a) ((void *)(unsigned long)(const void *)(a))
47390458faSmrg #endif /* !__UNCONST */
48390458faSmrg 
49390458faSmrg int luaopen_bozohttpd(lua_State *);
50390458faSmrg 
51390458faSmrg /* init() */
52390458faSmrg static int
l_new(lua_State * L)53390458faSmrg l_new(lua_State *L)
54390458faSmrg {
55390458faSmrg 	bozohttpd_t	*httpd;
56390458faSmrg 
57390458faSmrg 	httpd = lua_newuserdata(L, sizeof(*httpd));
58390458faSmrg 	(void) memset(httpd, 0x0, sizeof(*httpd));
59390458faSmrg 	return 1;
60390458faSmrg }
61390458faSmrg 
62390458faSmrg /* initialise(httpd) */
63390458faSmrg static int
l_init_httpd(lua_State * L)64390458faSmrg l_init_httpd(lua_State *L)
65390458faSmrg {
66390458faSmrg 	bozohttpd_t	*httpd;
67390458faSmrg 
68390458faSmrg 	httpd = lua_touserdata(L, 1);
69390458faSmrg 	lua_pushnumber(L, bozo_init_httpd(httpd));
70390458faSmrg 	return 1;
71390458faSmrg }
72390458faSmrg 
73390458faSmrg /* initialise(prefs) */
74390458faSmrg static int
l_init_prefs(lua_State * L)75390458faSmrg l_init_prefs(lua_State *L)
76390458faSmrg {
77cff2d956Smrg 	bozohttpd_t	*httpd;
78390458faSmrg 	bozoprefs_t	*prefs;
79390458faSmrg 
80390458faSmrg 	prefs = lua_newuserdata(L, sizeof(*prefs));
81390458faSmrg 	(void) memset(prefs, 0x0, sizeof(*prefs));
82cff2d956Smrg 	httpd = lua_touserdata(L, 1);
83cff2d956Smrg 	(void) bozo_init_prefs(httpd, prefs);
84390458faSmrg 	return 1;
85390458faSmrg }
86390458faSmrg 
87babdc61aSsevan /* bozo_set_pref(httpd, prefs, name, value) */
88390458faSmrg static int
l_bozo_set_pref(lua_State * L)89390458faSmrg l_bozo_set_pref(lua_State *L)
90390458faSmrg {
91babdc61aSsevan 	bozohttpd_t	*httpd;
92390458faSmrg 	bozoprefs_t	*prefs;
93390458faSmrg 	const char	*name;
94390458faSmrg 	const char	*value;
95390458faSmrg 
96babdc61aSsevan 	httpd = lua_touserdata(L, 1);
97babdc61aSsevan 	prefs = lua_touserdata(L, 2);
98babdc61aSsevan 	name = luaL_checkstring(L, 3);
99babdc61aSsevan 	value = luaL_checkstring(L, 4);
100babdc61aSsevan 	lua_pushnumber(L, bozo_set_pref(httpd, prefs, name, value));
101390458faSmrg 	return 1;
102390458faSmrg }
103390458faSmrg 
104390458faSmrg /* bozo_get_pref(prefs, name) */
105390458faSmrg static int
l_bozo_get_pref(lua_State * L)106390458faSmrg l_bozo_get_pref(lua_State *L)
107390458faSmrg {
108390458faSmrg 	bozoprefs_t	*prefs;
109390458faSmrg 	const char	*name;
110390458faSmrg 
111390458faSmrg 	prefs = lua_touserdata(L, 1);
112390458faSmrg 	name = luaL_checkstring(L, 2);
113390458faSmrg 	lua_pushstring(L, bozo_get_pref(prefs, name));
114390458faSmrg 	return 1;
115390458faSmrg }
116390458faSmrg 
117390458faSmrg /* bozo_setup(httpd, prefs, host, root) */
118390458faSmrg static int
l_bozo_setup(lua_State * L)119390458faSmrg l_bozo_setup(lua_State *L)
120390458faSmrg {
121390458faSmrg 	bozohttpd_t	*httpd;
122390458faSmrg 	bozoprefs_t	*prefs;
123390458faSmrg 	const char	*vhost;
124390458faSmrg 	const char	*root;
125390458faSmrg 
126390458faSmrg 	httpd = lua_touserdata(L, 1);
127390458faSmrg 	prefs = lua_touserdata(L, 2);
128390458faSmrg 	vhost = luaL_checkstring(L, 3);
129390458faSmrg 	if (vhost && *vhost == 0x0) {
130390458faSmrg 		vhost = NULL;
131390458faSmrg 	}
132390458faSmrg 	root = luaL_checkstring(L, 4);
133390458faSmrg 	lua_pushnumber(L, bozo_setup(httpd, prefs, vhost, root));
134390458faSmrg 	return 1;
135390458faSmrg }
136390458faSmrg 
137390458faSmrg /* bozo_read_request(httpd) */
138390458faSmrg static int
l_bozo_read_request(lua_State * L)139390458faSmrg l_bozo_read_request(lua_State *L)
140390458faSmrg {
141390458faSmrg 	bozo_httpreq_t	*req;
142390458faSmrg 	bozohttpd_t	*httpd;
143390458faSmrg 
144390458faSmrg 	httpd = lua_touserdata(L, 1);
145390458faSmrg 	req = bozo_read_request(httpd);
146390458faSmrg 	lua_pushlightuserdata(L, req);
147390458faSmrg 	return 1;
148390458faSmrg }
149390458faSmrg 
150babdc61aSsevan /* bozo_process_request(req) */
151390458faSmrg static int
l_bozo_process_request(lua_State * L)152390458faSmrg l_bozo_process_request(lua_State *L)
153390458faSmrg {
154390458faSmrg 	bozo_httpreq_t	*req;
155390458faSmrg 
156babdc61aSsevan 	req = lua_touserdata(L, 1);
157*3186d74cSsevan 	if (req == NULL) {
158*3186d74cSsevan 		return 0;
159*3186d74cSsevan 	}
160babdc61aSsevan 	bozo_process_request(req);
161390458faSmrg 	lua_pushnumber(L, 1);
162390458faSmrg 	return 1;
163390458faSmrg }
164390458faSmrg 
165390458faSmrg /* bozo_clean_request(req) */
166390458faSmrg static int
l_bozo_clean_request(lua_State * L)167390458faSmrg l_bozo_clean_request(lua_State *L)
168390458faSmrg {
169390458faSmrg 	bozo_httpreq_t	*req;
170390458faSmrg 
171390458faSmrg 	req = lua_touserdata(L, 1);
172*3186d74cSsevan 	if (req == NULL) {
173*3186d74cSsevan 		return 0;
174*3186d74cSsevan 	}
175390458faSmrg 	bozo_clean_request(req);
176390458faSmrg 	lua_pushnumber(L, 1);
177390458faSmrg 	return 1;
178390458faSmrg }
179390458faSmrg 
180390458faSmrg /* dynamic_mime(httpd, one, two, three, four) */
181390458faSmrg static int
l_bozo_dynamic_mime(lua_State * L)182390458faSmrg l_bozo_dynamic_mime(lua_State *L)
183390458faSmrg {
184390458faSmrg 	bozohttpd_t	*httpd;
185390458faSmrg 	const char	*s[4];
186390458faSmrg 
187390458faSmrg 	httpd = lua_touserdata(L, 1);
188390458faSmrg 	s[0] = luaL_checkstring(L, 2);
189390458faSmrg 	s[1] = luaL_checkstring(L, 3);
190390458faSmrg 	s[2] = luaL_checkstring(L, 4);
191390458faSmrg 	s[3] = luaL_checkstring(L, 5);
192390458faSmrg 	bozo_add_content_map_mime(httpd, s[0], s[1], s[2], s[3]);
193390458faSmrg 	lua_pushnumber(L, 1);
194390458faSmrg 	return 1;
195390458faSmrg }
196390458faSmrg 
197390458faSmrg /* ssl_set_opts(httpd, one, two) */
198390458faSmrg static int
l_bozo_ssl_set_opts(lua_State * L)199390458faSmrg l_bozo_ssl_set_opts(lua_State *L)
200390458faSmrg {
201390458faSmrg 	bozohttpd_t	*httpd;
202390458faSmrg 	const char	*s[2];
203390458faSmrg 
204390458faSmrg 	httpd = lua_touserdata(L, 1);
205390458faSmrg 	s[0] = luaL_checkstring(L, 2);
206390458faSmrg 	s[1] = luaL_checkstring(L, 3);
207390458faSmrg 	bozo_ssl_set_opts(httpd, s[0], s[1]);
208390458faSmrg 	lua_pushnumber(L, 1);
209390458faSmrg 	return 1;
210390458faSmrg }
211390458faSmrg 
212390458faSmrg /* cgi_setbin(httpd, bin) */
213390458faSmrg static int
l_bozo_cgi_setbin(lua_State * L)214390458faSmrg l_bozo_cgi_setbin(lua_State *L)
215390458faSmrg {
216390458faSmrg 	bozohttpd_t	*httpd;
217390458faSmrg 	const char	*bin;
218390458faSmrg 
219390458faSmrg 	httpd = lua_touserdata(L, 1);
220390458faSmrg 	bin = luaL_checkstring(L, 2);
221390458faSmrg 	bozo_cgi_setbin(httpd, bin);
222390458faSmrg 	lua_pushnumber(L, 1);
223390458faSmrg 	return 1;
224390458faSmrg }
225390458faSmrg 
226390458faSmrg /* cgi_map(httpd, 1, 2) */
227390458faSmrg static int
l_bozo_cgi_map(lua_State * L)228390458faSmrg l_bozo_cgi_map(lua_State *L)
229390458faSmrg {
230390458faSmrg 	bozohttpd_t	*httpd;
231390458faSmrg 	const char	*s[2];
232390458faSmrg 
233390458faSmrg 	httpd = lua_touserdata(L, 1);
234390458faSmrg 	s[0] = luaL_checkstring(L, 2);
235390458faSmrg 	s[1] = luaL_checkstring(L, 3);
236390458faSmrg 	bozo_add_content_map_cgi(httpd, s[0], s[1]);
237390458faSmrg 	lua_pushnumber(L, 1);
238390458faSmrg 	return 1;
239390458faSmrg }
240390458faSmrg 
241babdc61aSsevan const struct luaL_Reg libluabozohttpd[] = {
242390458faSmrg 	{ "new",		l_new },
243390458faSmrg 	{ "init_httpd",		l_init_httpd },
244390458faSmrg 	{ "init_prefs",		l_init_prefs },
245390458faSmrg 
246390458faSmrg 	{ "set_pref",		l_bozo_set_pref },
247390458faSmrg 	{ "get_pref",		l_bozo_get_pref },
248390458faSmrg 	{ "setup",		l_bozo_setup },
249390458faSmrg 	{ "dynamic_mime",	l_bozo_dynamic_mime },
250390458faSmrg 	{ "ssl_set_opts",	l_bozo_ssl_set_opts },
251390458faSmrg 	{ "cgi_setbin",		l_bozo_cgi_setbin },
252390458faSmrg 	{ "cgi_map",		l_bozo_cgi_map },
253390458faSmrg 
254390458faSmrg 	{ "read_request",	l_bozo_read_request },
255390458faSmrg 	{ "process_request",	l_bozo_process_request },
256390458faSmrg 	{ "clean_request",	l_bozo_clean_request },
257390458faSmrg 
258390458faSmrg 	{ NULL,			NULL }
259390458faSmrg };
260390458faSmrg 
261390458faSmrg int
luaopen_bozohttpd(lua_State * L)262390458faSmrg luaopen_bozohttpd(lua_State *L)
263390458faSmrg {
264babdc61aSsevan #if LUA_VERSION_NUM >= 502
265babdc61aSsevan         luaL_newlib(L, libluabozohttpd);
266babdc61aSsevan #else
267babdc61aSsevan         luaL_register(L, "bozohttpd", libluabozohttpd);
268babdc61aSsevan #endif
269390458faSmrg 	return 1;
270390458faSmrg }
271