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.c89
1 files changed, 77 insertions, 12 deletions
diff --git a/contrib/package/uhttpd/src/uhttpd.c b/contrib/package/uhttpd/src/uhttpd.c
index 7a5f42ad61..788606068d 100644
--- a/contrib/package/uhttpd/src/uhttpd.c
+++ b/contrib/package/uhttpd/src/uhttpd.c
@@ -16,6 +16,8 @@
* limitations under the License.
*/
+#define _XOPEN_SOURCE 500 /* crypt() */
+
#include "uhttpd.h"
#include "uhttpd-utils.h"
#include "uhttpd-file.h"
@@ -40,6 +42,43 @@ static void uh_sigterm(int sig)
run = 0;
}
+static void uh_config_parse(const char *path)
+{
+ FILE *c;
+ char line[512];
+ char *user = NULL;
+ char *pass = NULL;
+ char *eol = NULL;
+
+ if( (c = fopen(path ? path : "/etc/httpd.conf", "r")) != NULL )
+ {
+ memset(line, 0, sizeof(line));
+
+ while( fgets(line, sizeof(line) - 1, c) )
+ {
+ if( (line[0] == '/') && (strchr(line, ':') != NULL) )
+ {
+ if( !(user = strchr(line, ':')) || (*user++ = 0) ||
+ !(pass = strchr(user, ':')) || (*pass++ = 0) ||
+ !(eol = strchr(pass, '\n')) || (*eol++ = 0) )
+ continue;
+
+ if( !uh_auth_add(line, user, pass) )
+ {
+ fprintf(stderr,
+ "Can not manage more than %i basic auth realms, "
+ "will skip the rest\n", UH_LIMIT_AUTHREALMS
+ );
+
+ break;
+ }
+ }
+ }
+
+ fclose(c);
+ }
+}
+
static int uh_socket_bind(
fd_set *serv_fds, int *max_fd, const char *host, const char *port,
struct addrinfo *hints, int do_tls, struct config *conf
@@ -398,7 +437,7 @@ int main (int argc, char **argv)
}
#endif
- while( (opt = getopt(argc, argv, "fC:K:p:s:h:c:l:L:d:")) > 0 )
+ while( (opt = getopt(argc, argv, "fC:K:p:s:h:c:l:L:d:r:m:x:")) > 0 )
{
switch(opt)
{
@@ -467,7 +506,7 @@ int main (int argc, char **argv)
#ifdef HAVE_CGI
/* cgi prefix */
- case 'c':
+ case 'x':
conf.cgi_prefix = optarg;
break;
#endif
@@ -501,25 +540,44 @@ int main (int argc, char **argv)
}
break;
+ /* basic auth realm */
+ case 'r':
+ conf.realm = optarg;
+ break;
+
+ /* md5 crypt */
+ case 'm':
+ printf("%s\n", crypt(optarg, "$1$"));
+ exit(0);
+ break;
+
+ /* config file */
+ case 'c':
+ conf.file = optarg;
+ break;
+
default:
fprintf(stderr,
"Usage: %s -p [addr:]port [-h docroot]\n"
- " -p Bind to specified address and port, multiple allowed\n"
+ " -f Do not fork to background\n"
+ " -c file Configuration file, default is '/etc/httpd.conf'\n"
+ " -p [addr:]port Bind to specified address and port, multiple allowed\n"
#ifdef HAVE_TLS
- " -s Like -p but provide HTTPS on this port\n"
- " -C ASN.1 server certificate file\n"
- " -K ASN.1 server private key file\n"
+ " -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"
#endif
- " -h Specify the document root, default is '.'\n"
- " -f Do not fork to background\n"
+ " -h directory Specify the document root, default is '.'\n"
#ifdef HAVE_LUA
- " -l URL prefix for Lua handler, default is '/lua'\n"
- " -L Lua handler script, omit to disable Lua\n"
+ " -l string URL prefix for Lua handler, default is '/lua'\n"
+ " -L file Lua handler script, omit to disable Lua\n"
#endif
#ifdef HAVE_CGI
- " -c URL prefix for CGI handler, default is '/cgi-bin'\n"
+ " -x string URL prefix for CGI handler, default is '/cgi-bin'\n"
#endif
- " -d URL decode given string\n"
+ " -d string URL decode given string\n"
+ " -r string Specify basic auth realm\n"
+ " -m string MD5 crypt given string\n"
"\n", argv[0]
);
@@ -549,6 +607,13 @@ int main (int argc, char **argv)
exit(1);
}
+ /* default realm */
+ if( ! conf.realm )
+ conf.realm = "Protected Area";
+
+ /* config file */
+ uh_config_parse(conf.file);
+
#ifdef HAVE_CGI
/* default cgi prefix */
if( ! conf.cgi_prefix )