diff options
author | Vincent Douillet <vincent@vdouillet.fr> | 2023-07-20 18:10:49 +0200 |
---|---|---|
committer | Vincent Douillet <vincent@vdouillet.fr> | 2023-08-01 18:13:38 +0200 |
commit | 519194a2199af44b157812705aa8838068a97bc8 (patch) | |
tree | bf6e3b481fb855b3c2100766065b578bcac35baf /browse.c |
first commit
Diffstat (limited to 'browse.c')
-rw-r--r-- | browse.c | 80 |
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; +} |