diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 98 |
1 files changed, 93 insertions, 5 deletions
@@ -141,10 +141,12 @@ static int usage(const char *name) " -s [addr:]port Like -p but provide HTTPS on this port\n" " -C file ASN.1 server certificate file\n" " -K file ASN.1 server private key file\n" + " -P ciphers Colon separated list of allowed TLS ciphers\n" " -q Redirect all HTTP requests to HTTPS\n" #endif " -h directory Specify the document root, default is '.'\n" " -E string Use given virtual URL as 404 error handler\n" + " -b string Use given charset for directory listings, default to UTF-8\n" " -I string Use given filename as index for directories, multiple allowed\n" " -S Do not follow symbolic links outside of the docroot\n" " -D Do not allow directory listings, send 403 instead\n" @@ -152,14 +154,19 @@ static int usage(const char *name) " -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" + " -l string URL prefix for Lua handler\n" + " -L file Path to Lua handler script, -l and -L may be repeated in pairs\n" +#endif +#ifdef HAVE_UCODE + " -o string URL prefix for ucode handler\n" + " -O file Path to ucode handler script, -o and -O may be repeated in pairs\n" #endif #ifdef HAVE_UBUS " -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" " -X Enable CORS HTTP headers on JSON-RPC api\n" + " -e Events subscription reconnection time (retry value)\n" #endif " -x string URL prefix for CGI handler, default is '/cgi-bin'\n" " -y alias[=path] URL alias handle\n" @@ -188,6 +195,9 @@ static void init_defaults_pre(void) conf.cgi_path = "/sbin:/usr/sbin:/bin:/usr/bin"; INIT_LIST_HEAD(&conf.cgi_alias); INIT_LIST_HEAD(&conf.lua_prefix); +#if HAVE_UCODE + INIT_LIST_HEAD(&conf.ucode_prefix); +#endif } static void init_defaults_post(void) @@ -241,6 +251,25 @@ static void add_lua_prefix(const char *prefix, const char *handler) { } #endif +#ifdef HAVE_UCODE +static void add_ucode_prefix(const char *prefix, const char *handler) { + struct ucode_prefix *p; + char *pprefix, *phandler; + + p = calloc_a(sizeof(*p), + &pprefix, strlen(prefix) + 1, + &phandler, strlen(handler) + 1); + + if (!p) + return; + + p->prefix = strcpy(pprefix, prefix); + p->handler = strcpy(phandler, handler); + + list_add_tail(&p->list, &conf.ucode_prefix); +} +#endif + int main(int argc, char **argv) { struct alias *alias; @@ -251,11 +280,14 @@ int main(int argc, char **argv) int bound = 0; #ifdef HAVE_TLS int n_tls = 0; - const char *tls_key = NULL, *tls_crt = NULL; + const char *tls_key = NULL, *tls_crt = NULL, *tls_ciphers = NULL; #endif #ifdef HAVE_LUA const char *lua_prefix = NULL, *lua_handler = NULL; #endif +#ifdef HAVE_UCODE + const char *ucode_prefix = NULL, *ucode_handler = NULL; +#endif char *device = NULL; BUILD_BUG_ON(sizeof(uh_buf) < PATH_MAX); @@ -264,7 +296,7 @@ int main(int argc, char **argv) init_defaults_pre(); signal(SIGPIPE, SIG_IGN); - while ((ch = getopt(argc, argv, "A:aB:C:c:Dd:E:fh:H:I:i:K:k:L:l:m:N:n:p:qRr:Ss:T:t:U:u:Xx:y:")) != -1) { + while ((ch = getopt(argc, argv, "A:aB:b:C:c:Dd:E:e:fh:H:I:i:K:k:L:l:m:N:n:O:o:P:p:qRr:Ss:T:t:U:u:Xx:y:")) != -1) { switch(ch) { #ifdef HAVE_TLS case 'C': @@ -275,6 +307,10 @@ int main(int argc, char **argv) tls_key = optarg; break; + case 'P': + tls_ciphers = optarg; + break; + case 'q': conf.tls_redirect = 1; break; @@ -285,6 +321,7 @@ int main(int argc, char **argv) #else case 'C': case 'K': + case 'P': case 'q': case 's': fprintf(stderr, "uhttpd: TLS support not compiled, " @@ -302,6 +339,7 @@ int main(int argc, char **argv) case 'p': optarg = strdup(optarg); bound += add_listener_arg(optarg, device, (ch == 's')); + free(optarg); break; case 'h': @@ -339,6 +377,10 @@ int main(int argc, char **argv) uh_index_add(optarg); break; + case 'b': + conf.dirlist_charset = optarg; + break; + case 'S': conf.no_symlinks = 1; break; @@ -479,6 +521,38 @@ int main(int argc, char **argv) "ignoring -%c\n", ch); break; #endif +#ifdef HAVE_UCODE + case 'o': + case 'O': + if (ch == 'o') { + if (ucode_prefix) + fprintf(stderr, "uhttpd: Ignoring previous -%c %s\n", + ch, ucode_prefix); + + ucode_prefix = optarg; + } + else { + if (ucode_handler) + fprintf(stderr, "uhttpd: Ignoring previous -%c %s\n", + ch, ucode_handler); + + ucode_handler = optarg; + } + + if (ucode_prefix && ucode_handler) { + add_ucode_prefix(ucode_prefix, ucode_handler); + ucode_prefix = NULL; + ucode_handler = NULL; + } + + break; +#else + case 'o': + case 'O': + fprintf(stderr, "uhttpd: ucode support not compiled, " + "ignoring -%c\n", ch); + break; +#endif #ifdef HAVE_UBUS case 'a': conf.ubus_noauth = 1; @@ -495,11 +569,16 @@ int main(int argc, char **argv) case 'X': conf.ubus_cors = 1; break; + + case 'e': + conf.events_retry = atoi(optarg); + break; #else case 'a': case 'u': case 'U': case 'X': + case 'e': fprintf(stderr, "uhttpd: UBUS support not compiled, " "ignoring -%c\n", ch); break; @@ -534,7 +613,7 @@ int main(int argc, char **argv) return 1; } - if (uh_tls_init(tls_key, tls_crt)) + if (uh_tls_init(tls_key, tls_crt, tls_ciphers)) return 1; } #endif @@ -548,6 +627,15 @@ int main(int argc, char **argv) if (!list_empty(&conf.lua_prefix) && uh_plugin_init("uhttpd_lua.so")) return 1; #endif +#ifdef HAVE_UCODE + if (ucode_handler || ucode_prefix) { + fprintf(stderr, "Need handler and prefix to enable ucode support\n"); + return 1; + } + + if (!list_empty(&conf.ucode_prefix) && uh_plugin_init("uhttpd_ucode.so")) + return 1; +#endif #ifdef HAVE_UBUS if (conf.ubus_prefix && uh_plugin_init("uhttpd_ubus.so")) return 1; |