1*340f5e56SDavid van Moolenbroek /*-
2*340f5e56SDavid van Moolenbroek * Copyright (c) 2009 The NetBSD Foundation, Inc.
3*340f5e56SDavid van Moolenbroek * All rights reserved.
4*340f5e56SDavid van Moolenbroek *
5*340f5e56SDavid van Moolenbroek * This code is derived from software contributed to The NetBSD Foundation
6*340f5e56SDavid van Moolenbroek * by Alistair Crooks (agc@netbsd.org)
7*340f5e56SDavid van Moolenbroek *
8*340f5e56SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
9*340f5e56SDavid van Moolenbroek * modification, are permitted provided that the following conditions
10*340f5e56SDavid van Moolenbroek * are met:
11*340f5e56SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
12*340f5e56SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer.
13*340f5e56SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright
14*340f5e56SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the
15*340f5e56SDavid van Moolenbroek * documentation and/or other materials provided with the distribution.
16*340f5e56SDavid van Moolenbroek *
17*340f5e56SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18*340f5e56SDavid van Moolenbroek * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19*340f5e56SDavid van Moolenbroek * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20*340f5e56SDavid van Moolenbroek * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21*340f5e56SDavid van Moolenbroek * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22*340f5e56SDavid van Moolenbroek * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*340f5e56SDavid van Moolenbroek * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*340f5e56SDavid van Moolenbroek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25*340f5e56SDavid van Moolenbroek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26*340f5e56SDavid van Moolenbroek * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27*340f5e56SDavid van Moolenbroek * POSSIBILITY OF SUCH DAMAGE.
28*340f5e56SDavid van Moolenbroek */
29*340f5e56SDavid van Moolenbroek #include <sys/types.h>
30*340f5e56SDavid van Moolenbroek #include <sys/param.h>
31*340f5e56SDavid van Moolenbroek #include <sys/stat.h>
32*340f5e56SDavid van Moolenbroek
33*340f5e56SDavid van Moolenbroek #include <bozohttpd.h>
34*340f5e56SDavid van Moolenbroek #include <inttypes.h>
35*340f5e56SDavid van Moolenbroek #include <string.h>
36*340f5e56SDavid van Moolenbroek #include <stdio.h>
37*340f5e56SDavid van Moolenbroek #include <stdlib.h>
38*340f5e56SDavid van Moolenbroek #include <unistd.h>
39*340f5e56SDavid van Moolenbroek
40*340f5e56SDavid van Moolenbroek #define LUA_LIB
41*340f5e56SDavid van Moolenbroek #include <lua.h>
42*340f5e56SDavid van Moolenbroek #include <lauxlib.h>
43*340f5e56SDavid van Moolenbroek #include <lualib.h>
44*340f5e56SDavid van Moolenbroek
45*340f5e56SDavid van Moolenbroek #ifndef __UNCONST
46*340f5e56SDavid van Moolenbroek #define __UNCONST(a) ((void *)(unsigned long)(const void *)(a))
47*340f5e56SDavid van Moolenbroek #endif /* !__UNCONST */
48*340f5e56SDavid van Moolenbroek
49*340f5e56SDavid van Moolenbroek int luaopen_bozohttpd(lua_State *);
50*340f5e56SDavid van Moolenbroek
51*340f5e56SDavid van Moolenbroek #if 0
52*340f5e56SDavid van Moolenbroek typedef struct strarg_t {
53*340f5e56SDavid van Moolenbroek const char *s; /* string */
54*340f5e56SDavid van Moolenbroek const int n; /* corresponding int value */
55*340f5e56SDavid van Moolenbroek } strarg_t;
56*340f5e56SDavid van Moolenbroek
57*340f5e56SDavid van Moolenbroek /* map a string onto an int */
58*340f5e56SDavid van Moolenbroek static int
59*340f5e56SDavid van Moolenbroek findtype(strarg_t *strs, const char *s)
60*340f5e56SDavid van Moolenbroek {
61*340f5e56SDavid van Moolenbroek strarg_t *sp;
62*340f5e56SDavid van Moolenbroek
63*340f5e56SDavid van Moolenbroek for (sp = strs ; sp->s && strcasecmp(sp->s, s) != 0 ; sp++) {
64*340f5e56SDavid van Moolenbroek }
65*340f5e56SDavid van Moolenbroek return sp->n;
66*340f5e56SDavid van Moolenbroek }
67*340f5e56SDavid van Moolenbroek #endif
68*340f5e56SDavid van Moolenbroek
69*340f5e56SDavid van Moolenbroek /* init() */
70*340f5e56SDavid van Moolenbroek static int
l_new(lua_State * L)71*340f5e56SDavid van Moolenbroek l_new(lua_State *L)
72*340f5e56SDavid van Moolenbroek {
73*340f5e56SDavid van Moolenbroek bozohttpd_t *httpd;
74*340f5e56SDavid van Moolenbroek
75*340f5e56SDavid van Moolenbroek httpd = lua_newuserdata(L, sizeof(*httpd));
76*340f5e56SDavid van Moolenbroek (void) memset(httpd, 0x0, sizeof(*httpd));
77*340f5e56SDavid van Moolenbroek return 1;
78*340f5e56SDavid van Moolenbroek }
79*340f5e56SDavid van Moolenbroek
80*340f5e56SDavid van Moolenbroek /* initialise(httpd) */
81*340f5e56SDavid van Moolenbroek static int
l_init_httpd(lua_State * L)82*340f5e56SDavid van Moolenbroek l_init_httpd(lua_State *L)
83*340f5e56SDavid van Moolenbroek {
84*340f5e56SDavid van Moolenbroek bozohttpd_t *httpd;
85*340f5e56SDavid van Moolenbroek
86*340f5e56SDavid van Moolenbroek httpd = lua_touserdata(L, 1);
87*340f5e56SDavid van Moolenbroek lua_pushnumber(L, bozo_init_httpd(httpd));
88*340f5e56SDavid van Moolenbroek return 1;
89*340f5e56SDavid van Moolenbroek }
90*340f5e56SDavid van Moolenbroek
91*340f5e56SDavid van Moolenbroek /* initialise(prefs) */
92*340f5e56SDavid van Moolenbroek static int
l_init_prefs(lua_State * L)93*340f5e56SDavid van Moolenbroek l_init_prefs(lua_State *L)
94*340f5e56SDavid van Moolenbroek {
95*340f5e56SDavid van Moolenbroek bozoprefs_t *prefs;
96*340f5e56SDavid van Moolenbroek
97*340f5e56SDavid van Moolenbroek prefs = lua_newuserdata(L, sizeof(*prefs));
98*340f5e56SDavid van Moolenbroek (void) memset(prefs, 0x0, sizeof(*prefs));
99*340f5e56SDavid van Moolenbroek (void) bozo_init_prefs(prefs);
100*340f5e56SDavid van Moolenbroek return 1;
101*340f5e56SDavid van Moolenbroek }
102*340f5e56SDavid van Moolenbroek
103*340f5e56SDavid van Moolenbroek /* bozo_set_pref(prefs, name, value) */
104*340f5e56SDavid van Moolenbroek static int
l_bozo_set_pref(lua_State * L)105*340f5e56SDavid van Moolenbroek l_bozo_set_pref(lua_State *L)
106*340f5e56SDavid van Moolenbroek {
107*340f5e56SDavid van Moolenbroek bozoprefs_t *prefs;
108*340f5e56SDavid van Moolenbroek const char *name;
109*340f5e56SDavid van Moolenbroek const char *value;
110*340f5e56SDavid van Moolenbroek
111*340f5e56SDavid van Moolenbroek prefs = lua_touserdata(L, 1);
112*340f5e56SDavid van Moolenbroek name = luaL_checkstring(L, 2);
113*340f5e56SDavid van Moolenbroek value = luaL_checkstring(L, 3);
114*340f5e56SDavid van Moolenbroek lua_pushnumber(L, bozo_set_pref(prefs, name, value));
115*340f5e56SDavid van Moolenbroek return 1;
116*340f5e56SDavid van Moolenbroek }
117*340f5e56SDavid van Moolenbroek
118*340f5e56SDavid van Moolenbroek /* bozo_get_pref(prefs, name) */
119*340f5e56SDavid van Moolenbroek static int
l_bozo_get_pref(lua_State * L)120*340f5e56SDavid van Moolenbroek l_bozo_get_pref(lua_State *L)
121*340f5e56SDavid van Moolenbroek {
122*340f5e56SDavid van Moolenbroek bozoprefs_t *prefs;
123*340f5e56SDavid van Moolenbroek const char *name;
124*340f5e56SDavid van Moolenbroek
125*340f5e56SDavid van Moolenbroek prefs = lua_touserdata(L, 1);
126*340f5e56SDavid van Moolenbroek name = luaL_checkstring(L, 2);
127*340f5e56SDavid van Moolenbroek lua_pushstring(L, bozo_get_pref(prefs, name));
128*340f5e56SDavid van Moolenbroek return 1;
129*340f5e56SDavid van Moolenbroek }
130*340f5e56SDavid van Moolenbroek
131*340f5e56SDavid van Moolenbroek /* bozo_setup(httpd, prefs, host, root) */
132*340f5e56SDavid van Moolenbroek static int
l_bozo_setup(lua_State * L)133*340f5e56SDavid van Moolenbroek l_bozo_setup(lua_State *L)
134*340f5e56SDavid van Moolenbroek {
135*340f5e56SDavid van Moolenbroek bozohttpd_t *httpd;
136*340f5e56SDavid van Moolenbroek bozoprefs_t *prefs;
137*340f5e56SDavid van Moolenbroek const char *vhost;
138*340f5e56SDavid van Moolenbroek const char *root;
139*340f5e56SDavid van Moolenbroek
140*340f5e56SDavid van Moolenbroek httpd = lua_touserdata(L, 1);
141*340f5e56SDavid van Moolenbroek prefs = lua_touserdata(L, 2);
142*340f5e56SDavid van Moolenbroek vhost = luaL_checkstring(L, 3);
143*340f5e56SDavid van Moolenbroek if (vhost && *vhost == 0x0) {
144*340f5e56SDavid van Moolenbroek vhost = NULL;
145*340f5e56SDavid van Moolenbroek }
146*340f5e56SDavid van Moolenbroek root = luaL_checkstring(L, 4);
147*340f5e56SDavid van Moolenbroek lua_pushnumber(L, bozo_setup(httpd, prefs, vhost, root));
148*340f5e56SDavid van Moolenbroek return 1;
149*340f5e56SDavid van Moolenbroek }
150*340f5e56SDavid van Moolenbroek
151*340f5e56SDavid van Moolenbroek /* bozo_read_request(httpd) */
152*340f5e56SDavid van Moolenbroek static int
l_bozo_read_request(lua_State * L)153*340f5e56SDavid van Moolenbroek l_bozo_read_request(lua_State *L)
154*340f5e56SDavid van Moolenbroek {
155*340f5e56SDavid van Moolenbroek bozo_httpreq_t *req;
156*340f5e56SDavid van Moolenbroek bozohttpd_t *httpd;
157*340f5e56SDavid van Moolenbroek
158*340f5e56SDavid van Moolenbroek httpd = lua_touserdata(L, 1);
159*340f5e56SDavid van Moolenbroek req = bozo_read_request(httpd);
160*340f5e56SDavid van Moolenbroek lua_pushlightuserdata(L, req);
161*340f5e56SDavid van Moolenbroek return 1;
162*340f5e56SDavid van Moolenbroek }
163*340f5e56SDavid van Moolenbroek
164*340f5e56SDavid van Moolenbroek /* bozo_process_request(httpd, req) */
165*340f5e56SDavid van Moolenbroek static int
l_bozo_process_request(lua_State * L)166*340f5e56SDavid van Moolenbroek l_bozo_process_request(lua_State *L)
167*340f5e56SDavid van Moolenbroek {
168*340f5e56SDavid van Moolenbroek bozo_httpreq_t *req;
169*340f5e56SDavid van Moolenbroek bozohttpd_t *httpd;
170*340f5e56SDavid van Moolenbroek
171*340f5e56SDavid van Moolenbroek httpd = lua_touserdata(L, 1);
172*340f5e56SDavid van Moolenbroek req = lua_touserdata(L, 2);
173*340f5e56SDavid van Moolenbroek bozo_process_request(httpd, req);
174*340f5e56SDavid van Moolenbroek lua_pushnumber(L, 1);
175*340f5e56SDavid van Moolenbroek return 1;
176*340f5e56SDavid van Moolenbroek }
177*340f5e56SDavid van Moolenbroek
178*340f5e56SDavid van Moolenbroek /* bozo_clean_request(req) */
179*340f5e56SDavid van Moolenbroek static int
l_bozo_clean_request(lua_State * L)180*340f5e56SDavid van Moolenbroek l_bozo_clean_request(lua_State *L)
181*340f5e56SDavid van Moolenbroek {
182*340f5e56SDavid van Moolenbroek bozo_httpreq_t *req;
183*340f5e56SDavid van Moolenbroek
184*340f5e56SDavid van Moolenbroek req = lua_touserdata(L, 1);
185*340f5e56SDavid van Moolenbroek bozo_clean_request(req);
186*340f5e56SDavid van Moolenbroek lua_pushnumber(L, 1);
187*340f5e56SDavid van Moolenbroek return 1;
188*340f5e56SDavid van Moolenbroek }
189*340f5e56SDavid van Moolenbroek
190*340f5e56SDavid van Moolenbroek /* dynamic_mime(httpd, one, two, three, four) */
191*340f5e56SDavid van Moolenbroek static int
l_bozo_dynamic_mime(lua_State * L)192*340f5e56SDavid van Moolenbroek l_bozo_dynamic_mime(lua_State *L)
193*340f5e56SDavid van Moolenbroek {
194*340f5e56SDavid van Moolenbroek bozohttpd_t *httpd;
195*340f5e56SDavid van Moolenbroek const char *s[4];
196*340f5e56SDavid van Moolenbroek
197*340f5e56SDavid van Moolenbroek httpd = lua_touserdata(L, 1);
198*340f5e56SDavid van Moolenbroek s[0] = luaL_checkstring(L, 2);
199*340f5e56SDavid van Moolenbroek s[1] = luaL_checkstring(L, 3);
200*340f5e56SDavid van Moolenbroek s[2] = luaL_checkstring(L, 4);
201*340f5e56SDavid van Moolenbroek s[3] = luaL_checkstring(L, 5);
202*340f5e56SDavid van Moolenbroek bozo_add_content_map_mime(httpd, s[0], s[1], s[2], s[3]);
203*340f5e56SDavid van Moolenbroek lua_pushnumber(L, 1);
204*340f5e56SDavid van Moolenbroek return 1;
205*340f5e56SDavid van Moolenbroek }
206*340f5e56SDavid van Moolenbroek
207*340f5e56SDavid van Moolenbroek /* ssl_set_opts(httpd, one, two) */
208*340f5e56SDavid van Moolenbroek static int
l_bozo_ssl_set_opts(lua_State * L)209*340f5e56SDavid van Moolenbroek l_bozo_ssl_set_opts(lua_State *L)
210*340f5e56SDavid van Moolenbroek {
211*340f5e56SDavid van Moolenbroek bozohttpd_t *httpd;
212*340f5e56SDavid van Moolenbroek const char *s[2];
213*340f5e56SDavid van Moolenbroek
214*340f5e56SDavid van Moolenbroek httpd = lua_touserdata(L, 1);
215*340f5e56SDavid van Moolenbroek s[0] = luaL_checkstring(L, 2);
216*340f5e56SDavid van Moolenbroek s[1] = luaL_checkstring(L, 3);
217*340f5e56SDavid van Moolenbroek bozo_ssl_set_opts(httpd, s[0], s[1]);
218*340f5e56SDavid van Moolenbroek lua_pushnumber(L, 1);
219*340f5e56SDavid van Moolenbroek return 1;
220*340f5e56SDavid van Moolenbroek }
221*340f5e56SDavid van Moolenbroek
222*340f5e56SDavid van Moolenbroek /* cgi_setbin(httpd, bin) */
223*340f5e56SDavid van Moolenbroek static int
l_bozo_cgi_setbin(lua_State * L)224*340f5e56SDavid van Moolenbroek l_bozo_cgi_setbin(lua_State *L)
225*340f5e56SDavid van Moolenbroek {
226*340f5e56SDavid van Moolenbroek bozohttpd_t *httpd;
227*340f5e56SDavid van Moolenbroek const char *bin;
228*340f5e56SDavid van Moolenbroek
229*340f5e56SDavid van Moolenbroek httpd = lua_touserdata(L, 1);
230*340f5e56SDavid van Moolenbroek bin = luaL_checkstring(L, 2);
231*340f5e56SDavid van Moolenbroek bozo_cgi_setbin(httpd, bin);
232*340f5e56SDavid van Moolenbroek lua_pushnumber(L, 1);
233*340f5e56SDavid van Moolenbroek return 1;
234*340f5e56SDavid van Moolenbroek }
235*340f5e56SDavid van Moolenbroek
236*340f5e56SDavid van Moolenbroek /* cgi_map(httpd, 1, 2) */
237*340f5e56SDavid van Moolenbroek static int
l_bozo_cgi_map(lua_State * L)238*340f5e56SDavid van Moolenbroek l_bozo_cgi_map(lua_State *L)
239*340f5e56SDavid van Moolenbroek {
240*340f5e56SDavid van Moolenbroek bozohttpd_t *httpd;
241*340f5e56SDavid van Moolenbroek const char *s[2];
242*340f5e56SDavid van Moolenbroek
243*340f5e56SDavid van Moolenbroek httpd = lua_touserdata(L, 1);
244*340f5e56SDavid van Moolenbroek s[0] = luaL_checkstring(L, 2);
245*340f5e56SDavid van Moolenbroek s[1] = luaL_checkstring(L, 3);
246*340f5e56SDavid van Moolenbroek bozo_add_content_map_cgi(httpd, s[0], s[1]);
247*340f5e56SDavid van Moolenbroek lua_pushnumber(L, 1);
248*340f5e56SDavid van Moolenbroek return 1;
249*340f5e56SDavid van Moolenbroek }
250*340f5e56SDavid van Moolenbroek
251*340f5e56SDavid van Moolenbroek const struct luaL_reg libluabozohttpd[] = {
252*340f5e56SDavid van Moolenbroek { "new", l_new },
253*340f5e56SDavid van Moolenbroek { "init_httpd", l_init_httpd },
254*340f5e56SDavid van Moolenbroek { "init_prefs", l_init_prefs },
255*340f5e56SDavid van Moolenbroek
256*340f5e56SDavid van Moolenbroek { "set_pref", l_bozo_set_pref },
257*340f5e56SDavid van Moolenbroek { "get_pref", l_bozo_get_pref },
258*340f5e56SDavid van Moolenbroek { "setup", l_bozo_setup },
259*340f5e56SDavid van Moolenbroek { "dynamic_mime", l_bozo_dynamic_mime },
260*340f5e56SDavid van Moolenbroek { "ssl_set_opts", l_bozo_ssl_set_opts },
261*340f5e56SDavid van Moolenbroek { "cgi_setbin", l_bozo_cgi_setbin },
262*340f5e56SDavid van Moolenbroek { "cgi_map", l_bozo_cgi_map },
263*340f5e56SDavid van Moolenbroek
264*340f5e56SDavid van Moolenbroek { "read_request", l_bozo_read_request },
265*340f5e56SDavid van Moolenbroek { "process_request", l_bozo_process_request },
266*340f5e56SDavid van Moolenbroek { "clean_request", l_bozo_clean_request },
267*340f5e56SDavid van Moolenbroek
268*340f5e56SDavid van Moolenbroek { NULL, NULL }
269*340f5e56SDavid van Moolenbroek };
270*340f5e56SDavid van Moolenbroek
271*340f5e56SDavid van Moolenbroek int
luaopen_bozohttpd(lua_State * L)272*340f5e56SDavid van Moolenbroek luaopen_bozohttpd(lua_State *L)
273*340f5e56SDavid van Moolenbroek {
274*340f5e56SDavid van Moolenbroek luaL_openlib(L, "bozohttpd", libluabozohttpd, 0);
275*340f5e56SDavid van Moolenbroek return 1;
276*340f5e56SDavid van Moolenbroek }
277