summaryrefslogtreecommitdiff
path: root/browse.c
diff options
context:
space:
mode:
authorVincent Douillet <vincent@vdouillet.fr>2023-07-20 18:10:49 +0200
committerVincent Douillet <vincent@vdouillet.fr>2023-08-01 18:13:38 +0200
commit519194a2199af44b157812705aa8838068a97bc8 (patch)
treebf6e3b481fb855b3c2100766065b578bcac35baf /browse.c
first commit
Diffstat (limited to 'browse.c')
-rw-r--r--browse.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/browse.c b/browse.c
new file mode 100644
index 0000000..1cd635f
--- /dev/null
+++ b/browse.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2023, Vincent Douillet <vincent@vdouillet.fr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <dirent.h>
+#include <kcgi.h>
+#include <kcgihtml.h>
+#include <string.h>
+
+#include "browse.h"
+#include "config.h"
+#include "error.h"
+#include "http.h"
+
+int
+browse(struct kreq * r)
+{
+ struct dirent *current_dir;
+ DIR *data_dir;
+ char *dir_name;
+ struct khtmlreq html;
+
+ http_open(r, KHTTP_200);
+
+ if (KCGI_OK != khtml_open(&html, r, 0))
+ return VAULT_CGI_ERROR;
+
+ /* build basic html page */
+ khtml_elem(&html, KELEM_DOCTYPE);
+ khtml_elem(&html, KELEM_HTML);
+ khtml_elem(&html, KELEM_BODY);
+ khtml_elem(&html, KELEM_P);
+ khtml_puts(&html, "/");
+ khtml_closeelem(&html, 1);
+
+ /* list data directory content */
+ data_dir = opendir(DATA_DIR);
+ if (NULL == data_dir)
+ return VAULT_IO_ERROR;
+ khtml_elem(&html, KELEM_UL);
+ while ((current_dir = readdir(data_dir)) != NULL) {
+ /* ignore special . and .. folders */
+ dir_name = current_dir->d_name;
+ if (strcmp(".", dir_name) == 0 || strcmp("..", dir_name) == 0)
+ continue;
+ khtml_elem(&html, KELEM_LI);
+ khtml_puts(&html, current_dir->d_name);
+ khtml_closeelem(&html, 1);
+ }
+ khtml_close(&html);
+ closedir(data_dir);
+
+ return VAULT_SUCCESS;
+}