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