summaryrefslogtreecommitdiffhomepage
path: root/contrib/package/uhttpd/src/uhttpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/package/uhttpd/src/uhttpd.c')
-rw-r--r--contrib/package/uhttpd/src/uhttpd.c133
1 files changed, 106 insertions, 27 deletions
diff --git a/contrib/package/uhttpd/src/uhttpd.c b/contrib/package/uhttpd/src/uhttpd.c
index 401749faee..a7db794a5b 100644
--- a/contrib/package/uhttpd/src/uhttpd.c
+++ b/contrib/package/uhttpd/src/uhttpd.c
@@ -417,6 +417,10 @@ int main (int argc, char **argv)
char bind[128];
char *port = NULL;
+ /* library handles */
+ void *tls_lib;
+ void *lua_lib;
+
/* clear the master and temp sets */
FD_ZERO(&used_fds);
FD_ZERO(&serv_fds);
@@ -445,11 +449,39 @@ int main (int argc, char **argv)
memset(bind, 0, sizeof(bind));
#ifdef HAVE_TLS
- /* init SSL context */
- if( ! (conf.tls = uh_tls_ctx_init()) )
+ /* load TLS plugin */
+ if( ! (tls_lib = dlopen("uhttpd_tls.so", RTLD_LAZY | RTLD_GLOBAL)) )
{
- fprintf(stderr, "Failed to initalize SSL context\n");
- exit(1);
+ fprintf(stderr,
+ "Notice: Unable to load TLS plugin - disabling SSL support! "
+ "(Reason: %s)\n", dlerror()
+ );
+ }
+ else
+ {
+ /* resolve functions */
+ if( !(conf.tls_init = dlsym(tls_lib, "uh_tls_ctx_init")) ||
+ !(conf.tls_cert = dlsym(tls_lib, "uh_tls_ctx_cert")) ||
+ !(conf.tls_key = dlsym(tls_lib, "uh_tls_ctx_key")) ||
+ !(conf.tls_free = dlsym(tls_lib, "uh_tls_ctx_free")) ||
+ !(conf.tls_accept = dlsym(tls_lib, "uh_tls_client_accept")) ||
+ !(conf.tls_close = dlsym(tls_lib, "uh_tls_client_close")) ||
+ !(conf.tls_recv = dlsym(tls_lib, "uh_tls_client_recv")) ||
+ !(conf.tls_send = dlsym(tls_lib, "uh_tls_client_send"))
+ ) {
+ fprintf(stderr,
+ "Error: Failed to lookup required symbols "
+ "in TLS plugin: %s\n", dlerror()
+ );
+ exit(1);
+ }
+
+ /* init SSL context */
+ if( ! (conf.tls = conf.tls_init()) )
+ {
+ fprintf(stderr, "Error: Failed to initalize SSL context\n");
+ exit(1);
+ }
}
#endif
@@ -477,12 +509,23 @@ int main (int argc, char **argv)
}
if( opt == 's' )
+ {
+ if( !conf.tls )
+ {
+ fprintf(stderr,
+ "Notice: TLS support is disabled, "
+ "ignoring '-s %s'\n", optarg
+ );
+ continue;
+ }
+
tls = 1;
+ }
/* bind sockets */
bound += uh_socket_bind(
&serv_fds, &max_fd, bind[0] ? bind : NULL, port,
- &hints, tls, &conf
+ &hints, (opt == 's'), &conf
);
break;
@@ -490,24 +533,34 @@ int main (int argc, char **argv)
#ifdef HAVE_TLS
/* certificate */
case 'C':
- if( SSL_CTX_use_certificate_file(conf.tls, optarg, SSL_FILETYPE_ASN1) < 1 )
+ if( conf.tls )
{
- fprintf(stderr, "Invalid certificate file given\n");
- exit(1);
+ if( conf.tls_cert(conf.tls, optarg) < 1 )
+ {
+ fprintf(stderr,
+ "Error: Invalid certificate file given\n");
+ exit(1);
+ }
+
+ keys++;
}
- keys++;
break;
/* key */
case 'K':
- if( SSL_CTX_use_PrivateKey_file(conf.tls, optarg, SSL_FILETYPE_ASN1) < 1 )
+ if( conf.tls )
{
- fprintf(stderr, "Invalid private key file given\n");
- exit(1);
+ if( conf.tls_key(conf.tls, optarg) < 1 )
+ {
+ fprintf(stderr,
+ "Error: Invalid private key file given\n");
+ exit(1);
+ }
+
+ keys++;
}
- keys++;
break;
#endif
@@ -515,7 +568,8 @@ int main (int argc, char **argv)
case 'h':
if( ! realpath(optarg, conf.docroot) )
{
- fprintf(stderr, "Invalid directory %s: %s\n", optarg, strerror(errno));
+ fprintf(stderr, "Error: Invalid directory %s: %s\n",
+ optarg, strerror(errno));
exit(1);
}
break;
@@ -604,21 +658,21 @@ int main (int argc, char **argv)
#ifdef HAVE_TLS
if( (tls == 1) && (keys < 2) )
{
- fprintf(stderr, "Missing private key or certificate file\n");
+ fprintf(stderr, "Error: Missing private key or certificate file\n");
exit(1);
}
#endif
if( bound < 1 )
{
- fprintf(stderr, "No sockets bound, unable to continue\n");
+ fprintf(stderr, "Error: No sockets bound, unable to continue\n");
exit(1);
}
/* default docroot */
if( !conf.docroot[0] && !realpath(".", conf.docroot) )
{
- fprintf(stderr, "Can not determine default document root: %s\n",
+ fprintf(stderr, "Error: Can not determine default document root: %s\n",
strerror(errno));
exit(1);
}
@@ -637,14 +691,37 @@ int main (int argc, char **argv)
#endif
#ifdef HAVE_LUA
- /* init Lua runtime if handler is specified */
- if( conf.lua_handler )
+ /* load Lua plugin */
+ if( ! (lua_lib = dlopen("uhttpd_lua.so", RTLD_LAZY | RTLD_GLOBAL)) )
{
- /* default lua prefix */
- if( ! conf.lua_prefix )
- conf.lua_prefix = "/lua";
+ fprintf(stderr,
+ "Notice: Unable to load Lua plugin - disabling Lua support! "
+ "(Reason: %s)\n", dlerror()
+ );
+ }
+ else
+ {
+ /* resolve functions */
+ if( !(conf.lua_init = dlsym(lua_lib, "uh_lua_init")) ||
+ !(conf.lua_close = dlsym(lua_lib, "uh_lua_close")) ||
+ !(conf.lua_request = dlsym(lua_lib, "uh_lua_request"))
+ ) {
+ fprintf(stderr,
+ "Error: Failed to lookup required symbols "
+ "in Lua plugin: %s\n", dlerror()
+ );
+ exit(1);
+ }
+
+ /* init Lua runtime if handler is specified */
+ if( conf.lua_handler )
+ {
+ /* default lua prefix */
+ if( ! conf.lua_prefix )
+ conf.lua_prefix = "/lua";
- L = uh_lua_init(conf.lua_handler);
+ L = conf.lua_init(conf.lua_handler);
+ }
}
#endif
@@ -711,7 +788,8 @@ int main (int argc, char **argv)
{
#ifdef HAVE_TLS
/* setup client tls context */
- uh_tls_client_accept(cl);
+ if( conf.tls )
+ conf.tls_accept(cl);
#endif
/* add client socket to global fdset */
@@ -753,7 +831,7 @@ int main (int argc, char **argv)
/* Lua request? */
if( L && uh_path_match(conf.lua_prefix, req->url) )
{
- uh_lua_request(cl, req, L);
+ conf.lua_request(cl, req, L);
}
else
#endif
@@ -793,7 +871,8 @@ int main (int argc, char **argv)
#ifdef HAVE_TLS
/* free client tls context */
- uh_tls_client_close(cl);
+ if( conf.tls )
+ conf.tls_close(cl);
#endif
cleanup:
@@ -812,7 +891,7 @@ int main (int argc, char **argv)
#ifdef HAVE_LUA
/* destroy the Lua state */
if( L != NULL )
- lua_close(L);
+ conf.lua_close(L);
#endif
return 0;