diff options
| author | mrg <mrg@NetBSD.org> | 2010-05-10 03:30:04 +0000 |
|---|---|---|
| committer | mrg <mrg@NetBSD.org> | 2010-05-10 03:30:04 +0000 |
| commit | 390458fa546a7c8cf4c2ef38e584c9bbbc2cd638 (patch) | |
| tree | 3938648e1845c1cba939af177317c91561ef9ee4 /libexec | |
| parent | 10e151e52e2a8ed4f8f81ec5c34250e73569797b (diff) | |
import bozohttpd 20100509. it has these changes:
o major rework and clean up of internal interfaces. move the main
program into main.c, the remaining parts are useable as library.
add bindings for lua. by Alistair G. Crooks <agc@netbsd.org>
o fix http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=566325
special thanks to al for the majority of these changes.
Diffstat (limited to 'libexec')
| -rw-r--r-- | libexec/httpd/libbozohttpd/Makefile | 36 | ||||
| -rw-r--r-- | libexec/httpd/libbozohttpd/libbozohttpd.3 | 143 | ||||
| -rw-r--r-- | libexec/httpd/libbozohttpd/shlib_version | 2 | ||||
| -rw-r--r-- | libexec/httpd/lua/Makefile | 39 | ||||
| -rwxr-xr-x | libexec/httpd/lua/bozo.lua | 162 | ||||
| -rw-r--r-- | libexec/httpd/lua/glue.c | 276 | ||||
| -rw-r--r-- | libexec/httpd/lua/optparse.lua | 123 | ||||
| -rw-r--r-- | libexec/httpd/lua/shlib_version | 2 | ||||
| -rw-r--r-- | libexec/httpd/main.c | 340 |
9 files changed, 1123 insertions, 0 deletions
diff --git a/libexec/httpd/libbozohttpd/Makefile b/libexec/httpd/libbozohttpd/Makefile new file mode 100644 index 00000000000..52945a61e55 --- /dev/null +++ b/libexec/httpd/libbozohttpd/Makefile @@ -0,0 +1,36 @@ +# $eterna: Makefile,v 1.1 2010/05/10 02:24:31 mrg Exp $ + +.PATH: $(.CURDIR)/.. + +# build bozohttpd library +LIB= bozohttpd +COPTS+= -I$(.CURDIR)/.. + +COPTS+= -DDO_HTPASSWD +CPPFLAGS+= -DDO_HTPASSWD +SRCS= bozohttpd.c ssl-bozo.c auth-bozo.c cgi-bozo.c daemon-bozo.c +SRCS+= tilde-luzah-bozo.c dir-index-bozo.c content-bozo.c + +LDADD= -lcrypt +DPADD= ${LIBCRYPT} + +MAN= libbozohttpd.3 +WARNS= 4 + +INCS= bozohttpd.h +INCSDIR= /usr/include + +.include <bsd.own.mk> + +.if ${MKCRYPTO} != "no" + +LDADD+= -lssl -lcrypto +DPADD+= ${LIBSSL} ${LIBCRYPTO} + +.else + +COPTS+= -DNO_SSL_SUPPORT + +.endif + +.include <bsd.lib.mk> diff --git a/libexec/httpd/libbozohttpd/libbozohttpd.3 b/libexec/httpd/libbozohttpd/libbozohttpd.3 new file mode 100644 index 00000000000..6da03ecc328 --- /dev/null +++ b/libexec/httpd/libbozohttpd/libbozohttpd.3 @@ -0,0 +1,143 @@ +.\" $NetBSD: libbozohttpd.3,v 1.1.1.1 2010/05/10 03:30:04 mrg Exp $ +.\" +.\" $eterna: libbozohttpd.3,v 1.2 2010/05/10 02:48:23 mrg Exp $ +.\" +.\" Copyright (c) 2009 The NetBSD Foundation, Inc. +.\" All rights reserved. +.\" +.\" This manual page is derived from software contributed to The +.\" NetBSD Foundation by Alistair Crooks (agc@NetBSD.org) +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +.\" POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd November 5, 2009 +.Dt LIBBOZOHTTPD 3 +.Os +.Sh NAME +.Nm libbozohttpd +.Nd embedded web server library +.Sh LIBRARY +.Lb libbozohttpd +.Sh SYNOPSIS +.In bozohttpd.h +.Ft int +.Fo bozo_set_pref +.Fa "bozoprefs_t *prefs" "char *name" "char *value" +.Fc +.Ft char * +.Fo bozo_get_pref +.Fa "bozoprefs_t *prefs" "char *name" +.Fc +.Ft int +.Fo bozo_set_defaults +.Fa "bozohttpd_t *httpd" "bozoprefs_t *prefs" +.Fc +.Ft void +.Fo bozo_setup +.Fa "bozohttpd_t *httpd" "bozoprefs_t *prefs" "const char *vhost" "char *slash" +.Fc +.Ft bozo_httpreq_t * +.Fo bozo_read_request +.Fa "bozohttpd_t *httpd" +.Fc +.Ft void +.Fo bozo_process_request +.Fa "bozo_httpreq_t *" +.Fc +.Ft void +.Fo bozo_clean_request +.Fa "bozo_httpreq_t *" +.Fc +.Sh DESCRIPTION +.Nm +is a library interface to the +.Xr bozohttpd 8 +web server. +The +.Nm +library can be used to embed a webserver +in your applications. +.Pp +Normal operation sees the +.Nm +process be initialised using the +.Fn bozo_set_defaults +function, which will set up the default port +and other internal settings, allocating +any necessary space as needed. +The +.Fn bozo_set_defaults +function returns 1 on sucess, 0 on failure. +.Pp +The +.Fn bozo_setup +function is used to specify the virtual host name +for the web server. +A NULL host name will mean that +.Nm +will use the local value for the host name, +as returned by +.Xr gethostname 3 . +This virtual hostname should be a fully qualified domain name. +The final argument to +.Fn bozo_setup +is the name of the directory to serve as the root +directory of the web server tree. +.Pp +Once the server has been set up, it serves +requests by using the +.Fn bozo_read_request +function, which returns a pointer to a request structure, +and +.Fn bozo_process_request , +which deals with the request, and answers the client. +The request space is de-allocated +using the +.Fn bozo_clean_request +function. +.Pp +Preferences are set +using the function +.Fn bozo_set_pref +function +and queried using the two +.Fn bozo_get_pref +function. +This is the main interface for selecting options, and for +setting preferences. +.Sh SEE ALSO +.Xr gethostname 3 , +.Xr ssl 3 , +.Xr services 5 , +.Xr httpd 8 +.Sh HISTORY +The +.Nm +library first appeared in +.Nx 6.0 . +.Sh AUTHORS +.An Matthew R. Green Aq mrg@eterna.com.au +.An Alistair Crooks Aq agc@NetBSD.org +wrote this high-level interface. +.Pp +This manual page was written by +.An Alistair Crooks . diff --git a/libexec/httpd/libbozohttpd/shlib_version b/libexec/httpd/libbozohttpd/shlib_version new file mode 100644 index 00000000000..97c9f92d6b8 --- /dev/null +++ b/libexec/httpd/libbozohttpd/shlib_version @@ -0,0 +1,2 @@ +major=0 +minor=0 diff --git a/libexec/httpd/lua/Makefile b/libexec/httpd/lua/Makefile new file mode 100644 index 00000000000..448fa71946c --- /dev/null +++ b/libexec/httpd/lua/Makefile @@ -0,0 +1,39 @@ +#PREFIX=/Users/agcrooks +PREFIX=/usr + +#LIBDIR=/usr/lib + +LIB=luabozohttpd +SRCS=glue.c +MKMAN=no +CPPFLAGS+=-g -I${PREFIX}/pkg/include +LDADD+= -lbozohttpd +WARNS=4 +CLEANFILES+= a a.sig + +.include <bsd.lib.mk> +.include <bsd.own.mk> + +LUABOZOOBJDIR != cd ${.CURDIR} && ${PRINTOBJDIR} + +OPSYS!= uname -s + +.if ${OPSYS} == "Darwin" +.sinclude <bsd.warns.mk> + +lib${LIB}.dylib: + libtool -dynamic -o ${.TARGET} ${OBJS} ${PREFIX}/pkg/lib/liblua.dylib /usr/lib/libc.dylib ${PREFIX}/pkg/lib/libbozohttpd.dylib + +t: lib${LIB}.dylib + cp Makefile a + ./bozo.lua --sign --detached a + ./bozo.lua --verify a.sig + +.else +t: + cp Makefile a + env LD_LIBRARY_PATH=${LUABOZOOBJDIR}:/lib:/usr/lib:${PREFIX}/lib \ + ./bozo.lua --sign --detached a + env LD_LIBRARY_PATH=${LUABOZOOBJDIR}:/lib:/usr/lib:${PREFIX}/lib \ + ./bozo.lua --verify a.sig +.endif diff --git a/libexec/httpd/lua/bozo.lua b/libexec/httpd/lua/bozo.lua new file mode 100755 index 00000000000..9a30c9f1fc6 --- /dev/null +++ b/libexec/httpd/lua/bozo.lua @@ -0,0 +1,162 @@ +#! /usr/bin/env lua + +-- +-- Copyright (c) 2009 The NetBSD Foundation, Inc. +-- All rights reserved. +-- +-- This code is derived from software contributed to The NetBSD Foundation +-- by Alistair Crooks (agc@netbsd.org) +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +-- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- + +-- command line args +dofile "optparse.lua" + +opt = OptionParser{usage="%prog [options] root [vhost]", version="20091105"} + +opt.add_option{"-C", "--cgimap", action="store", dest="cgimap", help="--cgimap 's t'"} +opt.add_option{"-H", "--hide-dots", action="store_true", dest="hidedots", help="--hide-dots"} +opt.add_option{"-I", "--portnum", action="store", dest="portnum", help="--portnum number"} +opt.add_option{"-M", "--dynamicmime", action="store", dest="dynmime", help="--dynamicmime 'suffix type a b'"} +opt.add_option{"-S", "--server-software", action="store", dest="serversw", help="--server-software name"} +opt.add_option{"-U", "--username", action="store", dest="username", help="--username name"} +opt.add_option{"-V", "--unknown-slash", action="store_true", dest="unknown", help="--unknown-slash"} +opt.add_option{"-X", "--dir-index", action="store_true", dest="dirindex", help="--dir-index"} +opt.add_option{"-Z", "--ssl", action="store", dest="ssl", help="--ssl 'cert priv'"} +opt.add_option{"-b", "--background", action="store", dest="background", help="--background count"} +opt.add_option{"-c", "--cgibin", action="store", dest="cgibin", help="--cgibin bin"} +opt.add_option{"-e", "--dirtyenv", action="store_true", dest="dirtyenv", help="--dirtyenv"} +opt.add_option{"-f", "--foreground", action="store_true", dest="foreground", help="--foreground"} +opt.add_option{"-i", "--bindaddr", action="store", dest="bindaddress", help="--bindaddr address"} +opt.add_option{"-n", "--numeric", action="store_true", dest="numeric", help="--numeric"} +opt.add_option{"-p", "--public-html", action="store", dest="public_html", help="--public-html dir"} +opt.add_option{"-r", "--trusted-referal", action="store_true", dest="trustedref", help="trusted referal"} +opt.add_option{"-s", "--logtostderr", action="store_true", dest="logstderr", help="log to stderr"} +opt.add_option{"-t", "--chroot", action="store", dest="chroot", help="--chroot dir"} +opt.add_option{"-u", "--enable-users", action="store_true", dest="enableusers", help="--enable-users"} +opt.add_option{"-v", "--virtbase", action="store", dest="virtbase", help="virtual base location"} +opt.add_option{"-x", "--index-html", action="store", dest="indexhtml", help="index.html name"} + +-- caller lua script +local extension = ".so" +f = io.open("libluabozohttpd.dylib", "r") +if f then + extension = ".dylib" + io.close(f) +end +glupkg = package.loadlib("./" .. "libluabozohttpd" .. extension, "luaopen_bozohttpd") +bozohttpd = glupkg() + +-- initialise +httpd = bozohttpd.new() +bozohttpd.init_httpd(httpd) +prefs = bozohttpd.init_prefs() + +-- parse command line args +options,args = opt.parse_args() +if options.portnum then + bozohttpd.set_pref(prefs, "port number", options.portnum) +end +if options.background then + bozohttpd.set_pref(prefs, "background", options.background) +end +if options.numeric then + bozohttpd.set_pref(prefs, "numeric", "true") +end +if options.logstderr then + bozohttpd.set_pref(prefs, "log to stderr", "true") +end +if options.foreground then + bozohttpd.set_pref(prefs, "foreground", "true") +end +if options.trustedref then + bozohttpd.set_pref(prefs, "trusted referal", "true") +end +if options.dynmime then + suffix, type, s1, s2 = string.find(options.dynmime, + "(%S+)%s+(%S+)%s+(%S+)%s+(%S+)") + bozohttpd.dynamic_mime(httpd, suffix, type, s1, s2) +end +if options.serversw then + bozohttpd.set_pref(prefs, "server software", options.serversw) +end +if options.ssl then + cert, priv = string.find(options.ssl, "(%S+)%s+(%S+)") + bozohttpd.dynamic_mime(httpd, cert, priv) +end +if options.username then + bozohttpd.set_pref(prefs, "username", options.username) +end +if options.unknownslash then + bozohttpd.set_pref(prefs, "unknown slash", "true") +end +if options.virtbase then + bozohttpd.set_pref(prefs, "virtual base", options.virtbase) +end +if options.indexhtml then + bozohttpd.set_pref(prefs, "index.html", options.indexhtml) +end +if options.dirtyenv then + bozohttpd.set_pref(prefs, "dirty environment", "true") +end +if options.bindaddr then + bozohttpd.set_pref(prefs, "bind address", options.bindaddr) +end +if options.cgibin then + bozohttpd.cgi_setbin(httpd, options.cgibin) +end +if options.cgimap then + name, handler = string.find(options.cgimap, "(%S+)%s+(%S+)") + bozohttpd.cgi_map(httpd, name, handler) +end +if options.public_html then + bozohttpd.set_pref(prefs, "public_html", options.public_html) +end +if options.chroot then + bozohttpd.set_pref(prefs, "chroot dir", options.chroot) +end +if options.enableusers then + bozohttpd.set_pref(prefs, "enable users", "true") +end +if options.hidedots then + bozohttpd.set_pref(prefs, "hide dots", "true") +end +if options.dirindex then + bozohttpd.set_pref(prefs, "directory indexing", "true") +end + +if #args < 1 then + print("At least one arg needed for root directory") +else + -- set up connections + local vhost = args[2] or "" + bozohttpd.setup(httpd, prefs, vhost, args[1]) + + -- loop, serving requests + local numreps = options.background or 0 + repeat + req = bozohttpd.read_request(httpd) + bozohttpd.process_request(httpd, req) + bozohttpd.clean_request(req) + until numreps == 0 +end diff --git a/libexec/httpd/lua/glue.c b/libexec/httpd/lua/glue.c new file mode 100644 index 00000000000..cad53b8e32c --- /dev/null +++ b/libexec/httpd/lua/glue.c @@ -0,0 +1,276 @@ +/*- + * Copyright (c) 2009 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Alistair Crooks (agc@netbsd.org) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include <sys/types.h> +#include <sys/param.h> +#include <sys/stat.h> + +#include <bozohttpd.h> +#include <inttypes.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#define LUA_LIB +#include <lua.h> +#include <lauxlib.h> +#include <lualib.h> + +#ifndef __UNCONST +#define __UNCONST(a) ((void *)(unsigned long)(const void *)(a)) +#endif /* !__UNCONST */ + +int luaopen_bozohttpd(lua_State *); + +#if 0 +typedef struct strarg_t { + const char *s; /* string */ + const int n; /* corresponding int value */ +} strarg_t; + +/* map a string onto an int */ +static int +findtype(strarg_t *strs, const char *s) +{ + strarg_t *sp; + + for (sp = strs ; sp->s && strcasecmp(sp->s, s) != 0 ; sp++) { + } + return sp->n; +} +#endif + +/* init() */ +static int +l_new(lua_State *L) +{ + bozohttpd_t *httpd; + + httpd = lua_newuserdata(L, sizeof(*httpd)); + (void) memset(httpd, 0x0, sizeof(*httpd)); + return 1; +} + +/* initialise(httpd) */ +static int +l_init_httpd(lua_State *L) +{ + bozohttpd_t *httpd; + + httpd = lua_touserdata(L, 1); + lua_pushnumber(L, bozo_init_httpd(httpd)); + return 1; +} + +/* initialise(prefs) */ +static int +l_init_prefs(lua_State *L) +{ + bozoprefs_t *prefs; + + prefs = lua_newuserdata(L, sizeof(*prefs)); + (void) memset(prefs, 0x0, sizeof(*prefs)); + (void) bozo_init_prefs(prefs); + return 1; +} + +/* bozo_set_pref(prefs, name, value) */ +static int +l_bozo_set_pref(lua_State *L) +{ + bozoprefs_t *prefs; + const char *name; + const char *value; + + prefs = lua_touserdata(L, 1); + name = luaL_checkstring(L, 2); + value = luaL_checkstring(L, 3); + lua_pushnumber(L, bozo_set_pref(prefs, name, value)); + return 1; +} + +/* bozo_get_pref(prefs, name) */ +static int +l_bozo_get_pref(lua_State *L) +{ + bozoprefs_t *prefs; + const char *name; + + prefs = lua_touserdata(L, 1); + name = luaL_checkstring(L, 2); + lua_pushstring(L, bozo_get_pref(prefs, name)); + return 1; +} + +/* bozo_setup(httpd, prefs, host, root) */ +static int +l_bozo_setup(lua_State *L) +{ + bozohttpd_t *httpd; + bozoprefs_t *prefs; + const char *vhost; + const char *root; + + httpd = lua_touserdata(L, 1); + prefs = lua_touserdata(L, 2); + vhost = luaL_checkstring(L, 3); + if (vhost && *vhost == 0x0) { + vhost = NULL; + } + root = luaL_checkstring(L, 4); + lua_pushnumber(L, bozo_setup(httpd, prefs, vhost, root)); + return 1; +} + +/* bozo_read_request(httpd) */ +static int +l_bozo_read_request(lua_State *L) +{ + bozo_httpreq_t *req; + bozohttpd_t *httpd; + + httpd = lua_touserdata(L, 1); + req = bozo_read_request(httpd); + lua_pushlightuserdata(L, req); + return 1; +} + +/* bozo_process_request(httpd, req) */ +static int +l_bozo_process_request(lua_State *L) +{ + bozo_httpreq_t *req; + bozohttpd_t *httpd; + + httpd = lua_touserdata(L, 1); + req = lua_touserdata(L, 2); + bozo_process_request(httpd, req); + lua_pushnumber(L, 1); + return 1; +} + +/* bozo_clean_request(req) */ +static int +l_bozo_clean_request(lua_State *L) +{ + bozo_httpreq_t *req; + + req = lua_touserdata(L, 1); + bozo_clean_request(req); + lua_pushnumber(L, 1); + return 1; +} + +/* dynamic_mime(httpd, one, two, three, four) */ +static int +l_bozo_dynamic_mime(lua_State *L) +{ + bozohttpd_t *httpd; + const char *s[4]; + + httpd = lua_touserdata(L, 1); + s[0] = luaL_checkstring(L, 2); + s[1] = luaL_checkstring(L, 3); + s[2] = luaL_checkstring(L, 4); + s[3] = luaL_checkstring(L, 5); + bozo_add_content_map_mime(httpd, s[0], s[1], s[2], s[3]); + lua_pushnumber(L, 1); + return 1; +} + +/* ssl_set_opts(httpd, one, two) */ +static int +l_bozo_ssl_set_opts(lua_State *L) +{ + bozohttpd_t *httpd; + const char *s[2]; + + httpd = lua_touserdata(L, 1); + s[0] = luaL_checkstring(L, 2); + s[1] = luaL_checkstring(L, 3); + bozo_ssl_set_opts(httpd, s[0], s[1]); + lua_pushnumber(L, 1); + return 1; +} + +/* cgi_setbin(httpd, bin) */ +static int +l_bozo_cgi_setbin(lua_State *L) +{ + bozohttpd_t *httpd; + const char *bin; + + httpd = lua_touserdata(L, 1); + bin = luaL_checkstring(L, 2); + bozo_cgi_setbin(httpd, bin); + lua_pushnumber(L, 1); + return 1; +} + +/* cgi_map(httpd, 1, 2) */ +static int +l_bozo_cgi_map(lua_State *L) +{ + bozohttpd_t *httpd; + const char *s[2]; + + httpd = lua_touserdata(L, 1); + s[0] = luaL_checkstring(L, 2); + s[1] = luaL_checkstring(L, 3); + bozo_add_content_map_cgi(httpd, s[0], s[1]); + lua_pushnumber(L, 1); + return 1; +} + +const struct luaL_reg libluabozohttpd[] = { + { "new", l_new }, + { "init_httpd", l_init_httpd }, + { "init_prefs", l_init_prefs }, + + { "set_pref", l_bozo_set_pref }, + { "get_pref", l_bozo_get_pref }, + { "setup", l_bozo_setup }, + { "dynamic_mime", l_bozo_dynamic_mime }, + { "ssl_set_opts", l_bozo_ssl_set_opts }, + { "cgi_setbin", l_bozo_cgi_setbin }, + { "cgi_map", l_bozo_cgi_map }, + + { "read_request", l_bozo_read_request }, + { "process_request", l_bozo_process_request }, + { "clean_request", l_bozo_clean_request }, + + { NULL, NULL } +}; + +int +luaopen_bozohttpd(lua_State *L) +{ + luaL_openlib(L, "bozohttpd", libluabozohttpd, 0); + return 1; +} diff --git a/libexec/httpd/lua/optparse.lua b/libexec/httpd/lua/optparse.lua new file mode 100644 index 00000000000..da9b62a16cf --- /dev/null +++ b/libexec/httpd/lua/optparse.lua @@ -0,0 +1,123 @@ +-- Lua command line option parser. +-- Interface based on Pythons optparse. +-- http://docs.python.org/lib/module-optparse.html +-- (c) 2008 David Manura, Licensed under the same terms as Lua (MIT license) +-- +-- To be used like this: +-- t={usage="<some usage message>", version="<version string>"} +-- op=OptionParser(t) +-- op=add_option{"<opt>", action=<action>, dest=<dest>, help="<help message for this option>"} +-- +-- with : +-- <opt> the option string to be used (can be anything, if one letter opt, then should be -x val, more letters: -xy=val ) +-- <action> one of +-- - store: store in options as key, val +-- - store_true: stores key, true +-- - store_false: stores key, false +-- <dest> is the key under which the option is saved +-- +-- options,args = op.parse_args() +-- +-- now options is the table of options (key, val) and args is the table with non-option arguments. +-- You can use op.fail(message) for failing and op.print_help() for printing the usage as you like. + +function OptionParser(t) + local usage = t.usage + local version = t.version + + local o = {} + local option_descriptions = {} + local option_of = {} + + function o.fail(s) -- extension + io.stderr:write(s .. '\n') + os.exit(1) + end + + function o.add_option(optdesc) + option_descriptions[#option_descriptions+1] = optdesc + for _,v in ipairs(optdesc) do + option_of[v] = optdesc + end + end + function o.parse_args() + -- expand options (e.g. "--input=file" -> "--input", "file") + local arg = {unpack(arg)} + for i=#arg,1,-1 do local v = arg[i] + local flag, val = v:match('^(%-%-%w+)=(.*)') + if flag then + arg[i] = flag + table.insert(arg, i+1, val) + end + end + + local options = {} + local args = {} + local i = 1 + while i <= #arg do local v = arg[i] + local optdesc = option_of[v] + if optdesc then + local action = optdesc.action + local val + if action == 'store' or action == nil then + i = i + 1 + val = arg[i] + if not val then o.fail('option requires an argument ' .. v) end + elseif action == 'store_true' then + val = true + elseif action == 'store_false' then + val = false + end + options[optdesc.dest] = val + else + if v:match('^%-') then o.fail('invalid option ' .. v) end + args[#args+1] = v + end + i = i + 1 + end + if options.help then + o.print_help() + os.exit() + end + if options.version then + io.stdout:write(t.version .. "\n") + os.exit() + end + return options, args + end + + local function flags_str(optdesc) + local sflags = {} + local action = optdesc.action + for _,flag in ipairs(optdesc) do + local sflagend + if action == nil or action == 'store' then + local metavar = optdesc.metavar or optdesc.dest:upper() + sflagend = #flag == 2 and ' ' .. metavar + or '=' .. metavar + else + sflagend = '' + end + sflags[#sflags+1] = flag .. sflagend + end + return table.concat(sflags, ', ') + end + + function o.print_help() + io.stdout:write("Usage: " .. usage:gsub('%%prog', arg[0]) .. "\n") + io.stdout:write("\n") + io.stdout:write("Options:\n") + for _,optdesc in ipairs(option_descriptions) do + io.stdout:write(" " .. flags_str(optdesc) .. + " " .. optdesc.help .. "\n") + end + end + o.add_option{"--help", action="store_true", dest="help", + help="show this help message and exit"} + if t.version then + o.add_option{"--version", action="store_true", dest="version", + help="output version info."} + end + return o +end + diff --git a/libexec/httpd/lua/shlib_version b/libexec/httpd/lua/shlib_version new file mode 100644 index 00000000000..97c9f92d6b8 --- /dev/null +++ b/libexec/httpd/lua/shlib_version @@ -0,0 +1,2 @@ +major=0 +minor=0 diff --git a/libexec/httpd/main.c b/libexec/httpd/main.c new file mode 100644 index 00000000000..220df4e9a84 --- /dev/null +++ b/libexec/httpd/main.c @@ -0,0 +1,340 @@ +/* $NetBSD: main.c,v 1.1.1.1 2010/05/10 03:30:04 mrg Exp $ */ + +/* $eterna: main.c,v 1.3 2010/05/10 02:51:28 mrg Exp $ */ +/* from: eterna: bozohttpd.c,v 1.159 2009/05/23 02:14:30 mrg Exp */ + +/* + * Copyright (c) 1997-2010 Matthew R. Green + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer and + * dedication in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +/* this program is dedicated to the Great God of Processed Cheese */ + +/* + * main.c: C front end to bozohttpd + */ + +#include <sys/types.h> +#include <sys/param.h> + +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <syslog.h> +#include <time.h> +#include <unistd.h> + +#ifndef __attribute__ +#define __attribute__(x) +#endif /* __attribute__ */ + +#include "bozohttpd.h" + +/* variables and functions */ +#ifndef LOG_FTP +#define LOG_FTP LOG_DAEMON +#endif + +/* print a usage message, and then exit */ +static void +usage(bozohttpd_t *httpd, char *progname) +{ + bozo_warn(httpd, "usage: %s [options] slashdir [virtualhostname]", + progname); + bozo_warn(httpd, "options:"); +#ifdef DEBUG + bozo_warn(httpd, " -d\t\t\tenable debug support"); +#endif + bozo_warn(httpd, " -s\t\t\talways log to stderr"); +#ifndef NO_USER_SUPPORT + bozo_warn(httpd, " -u\t\t\tenable ~user/public_html support"); + bozo_warn(httpd, " -p dir\t\tchange `public_html' directory name]"); +#endif +#ifndef NO_DYNAMIC_CONTENT + bozo_warn(httpd, " -M arg t c c11\tadd this mime extenstion"); +#endif +#ifndef NO_CGIBIN_SUPPORT +#ifndef NO_DYNAMIC_CONTENT + bozo_warn(httpd, " -C arg prog\t\tadd this CGI handler"); +#endif + bozo_warn(httpd, + " -c cgibin\t\tenable cgi-bin support in this directory"); +#endif +#ifndef NO_DAEMON_MODE + bozo_warn(httpd, " -b\t\t\tbackground and go into daemon mode"); + bozo_warn(httpd, " -f\t\t\tkeep daemon mode in the foreground"); + bozo_warn(httpd, + " -i address\t\tbind on this address (daemon mode only)"); + bozo_warn(httpd, " -I port\t\tbind on this port (daemon mode only)"); +#endif + bozo_warn(httpd, " -S version\t\tset server version string"); + bozo_warn(httpd, " -t dir\t\tchroot to `dir'"); + bozo_warn(httpd, " -U username\t\tchange user to `user'"); + bozo_warn(httpd, + " -e\t\t\tdon't clean the environment (-t and -U only)"); + bozo_warn(httpd, + " -v virtualroot\tenable virtual host support " + "in this directory"); + bozo_warn(httpd, + " -r\t\t\tmake sure sub-pages come from " + "this host via referrer"); +#ifndef NO_DIRINDEX_SUPPORT + bozo_warn(httpd, + " -X\t\t\tenable automatic directory index support"); + bozo_warn(httpd, + " -H\t\t\thide files starting with a period (.)" + " in index mode"); +#endif + bozo_warn(httpd, + " -x index\t\tchange default `index.html' file name"); +#ifndef NO_SSL_SUPPORT + bozo_warn(httpd, + " -Z cert privkey\tspecify path to server certificate" + " and private key file\n" + "\t\t\tin pem format and enable bozohttpd in SSL mode"); +#endif /* NO_SSL_SUPPORT */ + bozo_err(httpd, 1, "%s failed to start", progname); +} + +int +main(int argc, char **argv) +{ + bozo_httpreq_t *request; + bozohttpd_t httpd; + bozoprefs_t prefs; + char *progname; + int c; + + (void) memset(&httpd, 0x0, sizeof(httpd)); + (void) memset(&prefs, 0x0, sizeof(prefs)); + + if ((progname = strrchr(argv[0], '/')) == NULL) + progname = argv[0]; + else + progname++; + + openlog(progname, LOG_PID|LOG_NDELAY, LOG_FTP); + + bozo_set_defaults(&httpd, &prefs); + + while ((c = getopt(argc, argv, + "C:HI:M:S:U:VXZ:bc:defhi:np:rst:uv:x:z:")) != -1) { + switch(c) { + + case 'M': +#ifdef NO_DYNAMIC_CONTENT + bozo_err(&httpd, 1, + "dynamic mime content support is not enabled"); + /* NOTREACHED */ +#else + /* make sure there's four arguments */ + if (argc - optind < 3) + usage(&httpd, progname); + bozo_add_content_map_mime(&httpd, optarg, argv[optind], + argv[optind+1], argv[optind+2]); + optind += 3; + break; +#endif /* NO_DYNAMIC_CONTENT */ + + case 'n': + bozo_set_pref(&prefs, "numeric", "true"); + break; + + case 'r': + bozo_set_pref(&prefs, "trusted referal", "true"); + break; + + case 's': + bozo_set_pref(&prefs, "log to stderr", "true"); + break; + + case 'S': + bozo_set_pref(&prefs, "server software", optarg); + break; + case 'Z': +#ifdef NO_SSL_SUPPORT + bozo_err(&httpd, 1, "ssl support is not enabled"); + /* NOT REACHED */ +#else + /* make sure there's two arguments */ + if (argc - optind < 1) + usage(&httpd, progname); + bozo_ssl_set_opts(&httpd, optarg, argv[optind++]); + break; +#endif /* NO_SSL_SUPPORT */ + case 'U': + bozo_set_pref(&prefs, "username", optarg); + break; + + case 'V': + bozo_set_pref(&prefs, "unknown slash", "true"); + break; + + case 'v': + bozo_set_pref(&prefs, "virtual base", optarg); + break; + + case 'x': + bozo_set_pref(&prefs, "index.html", optarg); + break; + +#ifdef NO_DAEMON_MODE + case 'b': + case 'e': + case 'f': + case 'i': + case 'I': + bozo_err(&httpd, 1, "Daemon mode is not enabled"); + /* NOTREACHED */ +#else + case 'b': + /* + * test suite support - undocumented + * background == 2 (aka, -b -b) means to + * only process 1 per kid + */ + if (bozo_get_pref(&prefs, "background") == NULL) { + bozo_set_pref(&prefs, "background", "1"); + } else { + bozo_set_pref(&prefs, "background", "2"); + } + break; + + case 'e': + bozo_set_pref(&prefs, "dirty environment", "true"); + break; + + case 'f': + bozo_set_pref(&prefs, "foreground", "true"); + break; + + case 'i': + bozo_set_pref(&prefs, "bind address", optarg); + break; + + case 'I': + bozo_set_pref(&prefs, "port number", optarg); + break; +#endif /* NO_DAEMON_MODE */ + +#ifdef NO_CGIBIN_SUPPORT + case 'c': + case 'C': + bozo_err(&httpd, 1, "CGI is not enabled"); + /* NOTREACHED */ +#else + case 'c': + bozo_cgi_setbin(&httpd, optarg); + break; + + case 'C': +# ifdef NO_DYNAMIC_CONTENT + bozo_err(&httpd, 1, + "dynamic CGI handler support is not enabled"); + /* NOTREACHED */ +# else + /* make sure there's two arguments */ + if (argc - optind < 1) + usage(&httpd, progname); + bozo_add_content_map_cgi(&httpd, optarg, + argv[optind++]); + break; +# endif /* NO_DYNAMIC_CONTENT */ +#endif /* NO_CGIBIN_SUPPORT */ + + case 'd': + httpd.debug++; +#ifndef DEBUG + if (httpd.debug == 1) + bozo_warn(&httpd, "Debugging is not enabled"); +#endif /* !DEBUG */ + break; + +#ifdef NO_USER_SUPPORT + case 'p': + case 't': + case 'u': + bozo_err(&httpd, 1, "User support is not enabled"); + /* NOTREACHED */ +#else + case 'p': + bozo_set_pref(&prefs, "public_html", optarg); + break; + + case 't': + bozo_set_pref(&prefs, "chroot dir", optarg); + break; + + case 'u': + bozo_set_pref(&prefs, "enable users", "true"); + break; +#endif /* NO_USER_SUPPORT */ + +#ifdef NO_DIRINDEX_SUPPORT + case 'H': + case 'X': + bozo_err(&httpd, 1, + "directory indexing is not enabled"); + /* NOTREACHED */ +#else + case 'H': + bozo_set_pref(&prefs, "hide dots", "true"); + break; + + case 'X': + bozo_set_pref(&prefs, "directory indexing", "true"); + break; + +#endif /* NO_DIRINDEX_SUPPORT */ + + default: + usage(&httpd, progname); + /* NOTREACHED */ + } + } + + argc -= optind; + argv += optind; + + if (argc == 0 || argc > 2) { + usage(&httpd, progname); + } + + /* virtual host, and root of tree to serve */ + bozo_setup(&httpd, &prefs, argv[1], argv[0]); + + /* + * read and process the HTTP request. + */ + do { + if ((request = bozo_read_request(&httpd)) != NULL) { + bozo_process_request(request); + bozo_clean_request(request); + } + } while (httpd.background); + + return (0); +} |
