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