add option to deny directory listing
authorChristian Hesse <mail@eworm.de>
Mon, 18 May 2015 22:43:41 +0000 (00:43 +0200)
committerEmil Mikulic <emikulic@gmail.com>
Tue, 19 May 2015 11:02:58 +0000 (21:02 +1000)
Signed-off-by: Christian Hesse <mail@eworm.de>
darkhttpd.c

index a8d704a..bab5224 100644 (file)
@@ -272,6 +272,7 @@ static in_addr_t bindaddr = INADDR_ANY;
 static uint16_t bindport = 8080; /* or 80 if running as root */
 static int max_connections = -1;        /* kern.ipc.somaxconn */
 static const char *index_name = "index.html";
+static int no_listing = 0;
 
 static int sockin = -1;             /* socket to accept connections from */
 static char *wwwroot = NULL;        /* a path name */
@@ -886,6 +887,8 @@ static void usage(const char *argv0) {
     printf("\t--index filename (default: %s)\n"
     "\t\tDefault file to serve when a directory is requested.\n\n",
         index_name);
+    printf("\t--no-listing\n"
+    "\t\tDo not serve listing if directory is requested.\n\n");
     printf("\t--mimetypes filename (optional)\n"
     "\t\tParses specified file for extension-MIME associations.\n\n");
     printf("\t--uid uid/uname, --gid gid/gname (default: don't privdrop)\n"
@@ -994,6 +997,9 @@ static void parse_commandline(const int argc, char *argv[]) {
                 errx(1, "missing filename after --index");
             index_name = argv[i];
         }
+        else if (strcmp(argv[i], "--no-listing") == 0) {
+            no_listing = 1;
+        }
         else if (strcmp(argv[i], "--mimetypes") == 0) {
             if (++i >= argc)
                 errx(1, "missing filename after --mimetypes");
@@ -1827,6 +1833,11 @@ static void process_get(struct connection *conn) {
         xasprintf(&target, "%s%s%s", wwwroot, decoded_url, index_name);
         if (!file_exists(target)) {
             free(target);
+            if (no_listing) {
+                default_reply(conn, 404, "Not Found",
+                    "The URL you requested (%s) was not found.", conn->url);
+                return;
+            }
             xasprintf(&target, "%s%s", wwwroot, decoded_url);
             generate_dir_listing(conn, target);
             free(target);