X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;ds=sidebyside;f=main.c;h=8dc352e4a5e2ca932b5c9db1a29ebedec1bf8dcb;hb=fae8886f8aa5d996c8de607abea8b677216549b5;hp=56cff802e0e8987541160dcad438df97a1ca03fe;hpb=1f4c517bb889413e55ccee466d9dfe79156092e8;p=project%2Fuhttpd.git diff --git a/main.c b/main.c index 56cff80..8dc352e 100644 --- a/main.c +++ b/main.c @@ -103,6 +103,7 @@ static int add_listener_arg(char *arg, bool tls) char *host = NULL; char *port = arg; char *s; + int l; s = strrchr(arg, ':'); if (s) { @@ -111,6 +112,14 @@ static int add_listener_arg(char *arg, bool tls) *s = 0; } + if (host && *host == '[') { + l = strlen(host); + if (l >= 2) { + host[l-1] = 0; + host++; + } + } + return uh_socket_bind(host, port, tls); } @@ -132,20 +141,22 @@ static int usage(const char *name) " -S Do not follow symbolic links outside of the docroot\n" " -D Do not allow directory listings, send 403 instead\n" " -R Enable RFC1918 filter\n" - " -n count Maximum allowed number of concurrent requests\n" + " -n count Maximum allowed number of concurrent script requests\n" + " -N count Maximum allowed number of concurrent connections\n" #ifdef HAVE_LUA " -l string URL prefix for Lua handler, default is '/lua'\n" " -L file Lua handler script, omit to disable Lua\n" #endif #ifdef HAVE_UBUS - " -u string URL prefix for HTTP/JSON handler\n" + " -u string URL prefix for UBUS via JSON-RPC handler\n" " -U file Override ubus socket path\n" + " -a Do not authenticate JSON-RPC requests against UBUS session api\n" #endif " -x string URL prefix for CGI handler, default is '/cgi-bin'\n" " -i .ext=path Use interpreter at path for files with the given extension\n" " -t seconds CGI, Lua and UBUS script timeout in seconds, default is 60\n" " -T seconds Network timeout in seconds, default is 30\n" - " -k seconds HTTP keepalive timeout\n" + " -k seconds HTTP keepalive timeout\n" " -d string URL decode given string\n" " -r string Specify basic auth realm\n" " -m string MD5 crypt given string\n" @@ -154,16 +165,20 @@ static int usage(const char *name) return 1; } -static void init_defaults(void) +static void init_defaults_pre(void) { conf.script_timeout = 60; conf.network_timeout = 30; conf.http_keepalive = 20; - conf.max_requests = 3; + conf.max_script_requests = 3; + conf.max_connections = 100; conf.realm = "Protected Area"; conf.cgi_prefix = "/cgi-bin"; conf.cgi_path = "/sbin:/usr/sbin:/bin:/usr/bin"; +} +static void init_defaults_post(void) +{ uh_index_add("index.html"); uh_index_add("index.htm"); uh_index_add("default.html"); @@ -187,30 +202,47 @@ static void fixup_prefix(char *str) int main(int argc, char **argv) { - const char *tls_key = NULL, *tls_crt = NULL; bool nofork = false; char *port; int opt, ch; int cur_fd; int bound = 0; + +#ifdef HAVE_TLS int n_tls = 0; + const char *tls_key = NULL, *tls_crt = NULL; +#endif BUILD_BUG_ON(sizeof(uh_buf) < PATH_MAX); uh_dispatch_add(&cgi_dispatch); - init_defaults(); + init_defaults_pre(); signal(SIGPIPE, SIG_IGN); - while ((ch = getopt(argc, argv, "fSDRC:K:E:I:p:s:h:c:l:L:d:r:m:n:x:i:t:k:T:A:u:U:")) != -1) { - bool tls = false; - + while ((ch = getopt(argc, argv, "afSDRC:K:E:I:p:s:h:c:l:L:d:r:m:n:N:x:i:t:k:T:A:u:U:")) != -1) { switch(ch) { +#ifdef HAVE_TLS + case 'C': + tls_crt = optarg; + break; + + case 'K': + tls_key = optarg; + break; + case 's': n_tls++; - tls = true; /* fall through */ +#else + case 'C': + case 'K': + case 's': + fprintf(stderr, "uhttpd: TLS support not compiled, " + "ignoring -%c\n", opt); + break; +#endif case 'p': - bound += add_listener_arg(optarg, tls); + bound += add_listener_arg(optarg, (ch == 's')); break; case 'h': @@ -253,7 +285,11 @@ int main(int argc, char **argv) break; case 'n': - conf.max_requests = atoi(optarg); + conf.max_script_requests = atoi(optarg); + break; + + case 'N': + conf.max_connections = atoi(optarg); break; case 'x': @@ -328,13 +364,6 @@ int main(int argc, char **argv) conf.file = optarg; break; - case 'C': - tls_crt = optarg; - break; - - case 'K': - tls_key = optarg; - break; #ifdef HAVE_LUA case 'l': conf.lua_prefix = optarg; @@ -343,8 +372,18 @@ int main(int argc, char **argv) case 'L': conf.lua_handler = optarg; break; +#else + case 'l': + case 'L': + fprintf(stderr, "uhttpd: Lua support not compiled, " + "ignoring -%c\n", opt); + break; #endif #ifdef HAVE_UBUS + case 'a': + conf.ubus_noauth = 1; + break; + case 'u': conf.ubus_prefix = optarg; break; @@ -352,6 +391,13 @@ int main(int argc, char **argv) case 'U': conf.ubus_socket = optarg; break; +#else + case 'a': + case 'u': + case 'U': + fprintf(stderr, "uhttpd: UBUS support not compiled, " + "ignoring -%c\n", opt); + break; #endif default: return usage(argv[0]); @@ -359,12 +405,22 @@ int main(int argc, char **argv) } uh_config_parse(); + init_defaults_post(); if (!bound) { fprintf(stderr, "Error: No sockets bound, unable to continue\n"); return 1; } + if (!conf.docroot) { + if (!realpath(".", uh_buf)) { + fprintf(stderr, "Error: Unable to determine work dir\n"); + return 1; + } + conf.docroot = strdup(uh_buf); + } + +#ifdef HAVE_TLS if (n_tls) { if (!tls_crt || !tls_key) { fprintf(stderr, "Please specify a certificate and " @@ -372,14 +428,10 @@ int main(int argc, char **argv) return 1; } -#ifdef HAVE_TLS if (uh_tls_init(tls_key, tls_crt)) return 1; -#else - fprintf(stderr, "Error: TLS support not compiled in.\n"); - return 1; -#endif } +#endif #ifdef HAVE_LUA if (conf.lua_handler || conf.lua_prefix) {