diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-05 11:19:16 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-07-24 09:53:24 +0000 |
commit | b5f8ee61a7f7e9bd291dd26b0585d03eb686c941 (patch) | |
tree | d4d31289c39fc00da064a825df13a0b98ce95b10 /fluent-bit/lib/monkey/plugins/dirlisting/dirlisting.c | |
parent | Adding upstream version 1.44.3. (diff) | |
download | netdata-b5f8ee61a7f7e9bd291dd26b0585d03eb686c941.tar.xz netdata-b5f8ee61a7f7e9bd291dd26b0585d03eb686c941.zip |
Adding upstream version 1.46.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'fluent-bit/lib/monkey/plugins/dirlisting/dirlisting.c')
-rw-r--r-- | fluent-bit/lib/monkey/plugins/dirlisting/dirlisting.c | 949 |
1 files changed, 0 insertions, 949 deletions
diff --git a/fluent-bit/lib/monkey/plugins/dirlisting/dirlisting.c b/fluent-bit/lib/monkey/plugins/dirlisting/dirlisting.c deleted file mode 100644 index 1ffd3fac4..000000000 --- a/fluent-bit/lib/monkey/plugins/dirlisting/dirlisting.c +++ /dev/null @@ -1,949 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ - -/* Monkey HTTP Server - * ================== - * Copyright 2001-2017 Eduardo Silva <eduardo@monkey.io> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Some history about this plugin - * ------------------------------ - * 2008 - Rewrite module, suport dynamic themes by Eduardo Silva - * 2008 - Felipe Astroza (max) provided the mk_dirhtml_human_readable_size_func() - * 2007 - Add struct client_request support by Eduardo - * 2002 - Original version written by Daniel R. Ome - */ - -#include <monkey/mk_api.h> -#include <monkey/mk_stream.h> -#include "dirlisting.h" - -#include <time.h> -#include <dirent.h> -#include <sys/stat.h> - -const mk_ptr_t mk_dirhtml_default_mime = mk_ptr_init(MK_DIRHTML_DEFAULT_MIME); -const mk_ptr_t mk_dir_iov_dash = mk_ptr_init("-"); -const mk_ptr_t mk_dir_iov_none = mk_ptr_init(""); -const mk_ptr_t mk_dir_iov_slash = mk_ptr_init("/"); - -void mk_dirhtml_cb_body_rows(struct mk_stream_input *in); - -/* Function wrote by Max (Felipe Astroza), thanks! */ -static char *mk_dirhtml_human_readable_size(char *buf, size_t size, int len) -{ - unsigned long u = 1024, i; - static const char *__units[] = { - "b", "K", "M", "G", - "T", "P", "E", "Z", "Y", NULL - }; - - for (i = 0; __units[i] != NULL; i++) { - if ((size / u) == 0) { - break; - } - u *= 1024; - } - if (!i) { - snprintf(buf, size, "%lu%s", (long unsigned int) len, __units[0]); - } - else { - float fsize = (float) ((double) len / (u / 1024)); - snprintf(buf, size, "%.1f%s", fsize, __units[i]); - } - - return buf; -} - -static struct mk_f_list *mk_dirhtml_create_element(char *file, - unsigned char type, - char *full_path, - unsigned long *list_len) -{ - int n; - struct tm *st_time; - struct mk_f_list *entry; - - entry = mk_api->mem_alloc_z(sizeof(struct mk_f_list)); - - if (mk_api->file_get_info(full_path, &entry->info, MK_FILE_READ) != 0) { - mk_api->mem_free(entry); - return NULL; - } - - strcpy(entry->name, file); - entry->type = type; - - st_time = localtime((time_t *) & entry->info.last_modification); - n = strftime(entry->ft_modif, MK_DIRHTML_FMOD_LEN, "%d-%b-%G %H:%M", st_time); - if (n == 0) { - mk_mem_free(entry); - return NULL; - } - - if (type != DT_DIR) { - mk_dirhtml_human_readable_size(entry->size, - sizeof(entry->size), - entry->info.size); - } - else { - entry->size[0] = '-'; - entry->size[1] = '\0'; - } - - *list_len = *list_len + 1; - - return entry; -} - -static struct mk_list *mk_dirhtml_create_list(DIR * dir, char *path, - unsigned long *list_len) -{ - char full_path[PATH_MAX]; - struct mk_list *list; - struct dirent *ent; - struct mk_f_list *entry = 0; - - list = mk_api->mem_alloc(sizeof(struct mk_list)); - mk_list_init(list); - - while ((ent = readdir(dir)) != NULL) { - if ((ent->d_name[0] == '.') && (strcmp(ent->d_name, "..") != 0)) - continue; - - /* Look just for files and dirs */ - if (ent->d_type != DT_REG && ent->d_type != DT_DIR - && ent->d_type != DT_LNK && ent->d_type != DT_UNKNOWN) { - continue; - } - - snprintf(full_path, PATH_MAX, "%s%s", path, ent->d_name); - entry = mk_dirhtml_create_element(ent->d_name, - ent->d_type, full_path, list_len); - if (!entry) { - continue; - } - - mk_list_add(&entry->_head, list); - } - - return list; -} - -/* Read dirhtml config and themes */ -int mk_dirhtml_conf(char *confdir) -{ - int ret = 0; - unsigned long len; - char *conf_file = NULL; - - mk_api->str_build(&conf_file, &len, "%s", confdir); - - /* Read configuration */ - ret = mk_dirhtml_read_config(conf_file); - if (ret < 0) { - mk_mem_free(conf_file); - return -1; - } - - /* - * This function will load the default theme setted in dirhtml_conf struct - */ - mk_mem_free(conf_file); - return mk_dirhtml_theme_load(); -} - -/* - * Read the main configuration file for dirhtml: dirhtml.conf, - * it will alloc the dirhtml_conf struct -*/ -int mk_dirhtml_read_config(char *path) -{ - unsigned long len; - char *default_file = NULL; - struct mk_rconf *conf; - struct mk_rconf_section *section; - struct file_info finfo; - - mk_api->str_build(&default_file, &len, "%sdirhtml.conf", path); - conf = mk_api->config_open(default_file); - if (!conf) { - return -1; - } - - section = mk_api->config_section_get(conf, "DIRLISTING"); - if (!section) { - mk_err_ex(mk_api, "Could not find DIRLISTING tag in configuration file"); - exit(EXIT_FAILURE); - } - - /* alloc dirhtml config struct */ - dirhtml_conf = mk_api->mem_alloc(sizeof(struct dirhtml_config)); - dirhtml_conf->theme = mk_api->config_section_get_key(section, "Theme", - MK_RCONF_STR); - dirhtml_conf->theme_path = NULL; - - mk_api->str_build(&dirhtml_conf->theme_path, &len, - "%sthemes/%s/", path, dirhtml_conf->theme); - mk_api->mem_free(default_file); - - if (mk_api->file_get_info(dirhtml_conf->theme_path, - &finfo, MK_FILE_READ) != 0) { - mk_warn_ex(mk_api, "Dirlisting: cannot load theme from '%s'", dirhtml_conf->theme_path); - mk_warn_ex(mk_api, "Dirlisting: unloading plugin"); - return -1; - } - - mk_api->config_free(conf); - return 0; -} - -int mk_dirhtml_theme_load() -{ - /* Data */ - char *header, *entry, *footer; - - /* Load theme files */ - header = mk_dirhtml_load_file(MK_DIRHTML_FILE_HEADER); - entry = mk_dirhtml_load_file(MK_DIRHTML_FILE_ENTRY); - footer = mk_dirhtml_load_file(MK_DIRHTML_FILE_FOOTER); - - if (!header || !entry || !footer) { - mk_api->mem_free(header); - mk_api->mem_free(entry); - mk_api->mem_free(footer); - return -1; - } - - /* Parse themes */ - mk_dirhtml_tpl_header = mk_dirhtml_template_create(header); - mk_dirhtml_tpl_entry = mk_dirhtml_template_create(entry); - mk_dirhtml_tpl_footer = mk_dirhtml_template_create(footer); - -#ifdef DEBUG_THEME - /* Debug data */ - mk_dirhtml_theme_debug(&mk_dirhtml_tpl_header); - mk_dirhtml_theme_debug(&mk_dirhtml_tpl_entry); - mk_dirhtml_theme_debug(&mk_dirhtml_tpl_footer); - -#endif - mk_api->mem_free(header); - mk_api->mem_free(entry); - mk_api->mem_free(footer); - - return 0; -} - -#ifdef DEBUG_THEME -int mk_dirhtml_theme_debug(struct dirhtml_template **st_tpl) -{ - int i = 0; - struct dirhtml_template *aux; - - aux = *st_tpl; - - printf("\n** DEBUG_THEME **"); - fflush(stdout); - - while (aux) { - printf("\n%i) len=%i, tag_id=%i", i, aux->len, aux->tag_id); - if (aux->tag_id >= 0) { - printf(" (%s) ", aux->tags[aux->tag_id]); - } - fflush(stdout); - aux = aux->next; - i++; - } - return 0; -} -#endif - -/* Search which tag exists first in content : - * ex: %_html_title_% - */ -static int mk_dirhtml_theme_match_tag(char *content, char *tpl[]) -{ - int i, len, match; - - for (i = 0; tpl[i]; i++) { - len = strlen(tpl[i]); - match = (int) mk_api->str_search_n(content, tpl[i], MK_STR_INSENSITIVE, len); - if (match >= 0) { - return i; - } - } - - return -1; -} - -struct dirhtml_template *mk_dirhtml_template_create(char *content) -{ - int i = 0, cont_len; - int pos, last = 0; /* 0=search init, 1=search end */ - int n_tags = 0, tpl_idx = 0; - - char *_buf; - int _len; - - /* Global keys */ - char **_tpl = 0; - - /* Template to return */ - struct dirhtml_template *st_tpl = 0; - - cont_len = strlen(content); - if (cont_len <= 0) { - return NULL; - } - - /* Parsing content */ - while (i < cont_len) { - pos = (int) mk_api->str_search(content + i, - MK_DIRHTML_TAG_INIT, MK_STR_INSENSITIVE); - - if (pos < 0) { - break; - } - - /* Checking global tag, if it's not found, proceed with - * 'entry tags' - */ - _tpl = (char **) _tags_global; - tpl_idx = mk_dirhtml_theme_match_tag(content + i + pos, _tpl); - - /* if global template do not match, use the entry tags */ - if (tpl_idx < 0) { - _tpl = (char **) _tags_entry; - tpl_idx = mk_dirhtml_theme_match_tag(content + i + pos, _tpl); - } - - /* if tag found is known, we add them to our list */ - if (tpl_idx >= 0) { - - _buf = mk_api->str_copy_substr(content, i, i + pos); - _len = strlen(_buf); - - /* Dummy if/else to create or pass a created st_tpl */ - if (!st_tpl) { - st_tpl = mk_dirhtml_template_list_add(NULL, - _buf, _len, _tpl, -1); - } - else { - mk_dirhtml_template_list_add(&st_tpl, _buf, _len, _tpl, -1); - } - i += (pos + strlen(_tpl[tpl_idx])); - - /* This means that a value need to be replaced */ - mk_dirhtml_template_list_add(&st_tpl, NULL, -1, _tpl, tpl_idx); - n_tags++; - } - else { - i++; - } - } - - if (last < cont_len) { - _buf = mk_api->str_copy_substr(content, i, cont_len); - _len = strlen(_buf); - - if (n_tags <= 0) { - st_tpl = mk_dirhtml_template_list_add(NULL, _buf, _len, _tpl, -1); - } - else { - mk_dirhtml_template_list_add(&st_tpl, _buf, _len, _tpl, -1); - } - } - - return st_tpl; -} - -struct dirhtml_template *mk_dirhtml_template_list_add(struct dirhtml_template **header, - char *buf, int len, char **tpl, - int tag_id) -{ - struct dirhtml_template *node, *aux; - - node = mk_api->mem_alloc_z(sizeof(struct dirhtml_template)); - if (!node) { - return NULL; - } - - node->buf = buf; - node->len = len; - node->tag_id = tag_id; - node->tags = tpl; - node->next = NULL; - - if (!header || !(*header)) { - return (struct dirhtml_template *) node; - } - - aux = *header; - while ((*aux).next != NULL) { - aux = (*aux).next; - } - - (*aux).next = node; - return (struct dirhtml_template *) node; -} - -static int mk_dirhtml_template_len(struct dirhtml_template *tpl) -{ - int len = 0; - struct dirhtml_template *aux; - - aux = tpl; - while (aux) { - len++; - aux = aux->next; - } - - return len; -} - -static struct mk_iov *mk_dirhtml_theme_compose(struct dirhtml_template *template, - struct mk_list *list) -{ - /* - * template = struct { char buf ; int len, int tag } - * values = struct {int tag, char *value, struct *next} - */ - struct mk_iov *iov; - struct dirhtml_template *tpl = template; - struct dirhtml_value *val; - struct mk_list *head; - - int tpl_len; - - tpl_len = mk_dirhtml_template_len(template); - - /* we duplicate the lenght in case we get separators */ - iov = mk_api->iov_create(1 + tpl_len * 2, 1); - tpl = template; - - while (tpl) { - /* check for dynamic value */ - if (!tpl->buf && tpl->tag_id >= 0) { - mk_list_foreach(head, list) { - val = mk_list_entry(head, struct dirhtml_value, _head); - if (val->tags == tpl->tags && val->tag_id == tpl->tag_id) { - mk_api->iov_add(iov, - val->value, val->len, - MK_FALSE); - mk_api->iov_add(iov, - val->sep.data, val->sep.len, - MK_FALSE); - break; - } - } - } - /* static */ - else { - mk_api->iov_add(iov, - tpl->buf, tpl->len, - MK_FALSE); - } - tpl = tpl->next; - } - - return iov; -} - -struct dirhtml_value *mk_dirhtml_tag_assign(struct mk_list *list, - int tag_id, mk_ptr_t sep, - char *value, char **tags) -{ - struct dirhtml_value *aux = NULL; - - aux = mk_api->mem_alloc(sizeof(struct dirhtml_value)); - if (!aux) { - return NULL; - } - - aux->tag_id = tag_id; - aux->value = value; - aux->sep = sep; - aux->tags = tags; - - if (value) { - aux->len = strlen(value); - } - else { - aux->len = -1; - } - - mk_list_add(&aux->_head, list); - return (struct dirhtml_value *) aux; -} - -static void mk_dirhtml_tag_free_list(struct mk_list *list) -{ - struct mk_list *head; - struct mk_list *tmp; - struct dirhtml_value *target; - - mk_list_foreach_safe(head, tmp, list) { - target = mk_list_entry(head, struct dirhtml_value, _head); - mk_list_del(&target->_head); - mk_api->mem_free(target); - } -} - -char *mk_dirhtml_load_file(char *filename) -{ - char *tmp = 0, *data = 0; - unsigned long len; - - mk_api->str_build(&tmp, &len, "%s%s", dirhtml_conf->theme_path, filename); - - if (!tmp) { - return NULL; - } - - data = mk_api->file_to_buffer(tmp); - mk_api->mem_free(tmp); - - if (!data) { - return NULL; - } - - return (char *) data; -} - -static int mk_dirhtml_entry_cmp(const void *a, const void *b) -{ - struct mk_f_list *const *f_a = a; - struct mk_f_list *const *f_b = b; - - return strcasecmp((*f_a)->name, (*f_b)->name); -} - -static void mk_dirhtml_free_list(struct mk_dirhtml_request *request) -{ - struct mk_list *tmp; - struct mk_list *head; - struct mk_f_list *entry; - - mk_list_foreach_safe(head, tmp, request->file_list) { - entry = mk_list_entry(head, struct mk_f_list, _head); - mk_list_del(&entry->_head); - mk_api->mem_free(entry); - } - - mk_api->mem_free(request->file_list); - mk_api->mem_free(request->toc); -} - -static inline struct mk_iov *enqueue_row(int i, struct mk_dirhtml_request *request) -{ - mk_ptr_t sep; - struct mk_list list; - struct mk_iov *iov_entry; - - /* %_target_title_% */ - if (request->toc[i]->type == DT_DIR) { - sep = mk_dir_iov_slash; - } - else { - sep = mk_dir_iov_none; - } - - mk_list_init(&list); - - /* target title */ - mk_dirhtml_tag_assign(&list, 0, sep, - request->toc[i]->name, - (char **) _tags_entry); - - /* target url */ - mk_dirhtml_tag_assign(&list, 1, sep, - request->toc[i]->name, (char **) _tags_entry); - - /* target name */ - mk_dirhtml_tag_assign(&list, 2, sep, - request->toc[i]->name, (char **) _tags_entry); - - /* target modification time */ - mk_dirhtml_tag_assign(&list, 3, mk_dir_iov_none, - request->toc[i]->ft_modif, (char **) _tags_entry); - - /* target size */ - mk_dirhtml_tag_assign(&list, 4, mk_dir_iov_none, - request->toc[i]->size, (char **) _tags_entry); - - iov_entry = mk_dirhtml_theme_compose(mk_dirhtml_tpl_entry, &list); - - /* free entry list */ - mk_dirhtml_tag_free_list(&list); - return iov_entry; -} - -/* Release all resources for a given Request context */ -void mk_dirhtml_cleanup(struct mk_dirhtml_request *req) -{ - PLUGIN_TRACE("release resources"); - - if (req->iov_header) { - mk_api->iov_free(req->iov_header); - req->iov_header = NULL; - } - if (req->iov_entry) { - mk_api->iov_free(req->iov_entry); - req->iov_entry = NULL; - } - if (req->iov_footer) { - mk_api->iov_free(req->iov_footer); - req->iov_footer = NULL; - } - mk_dirhtml_free_list(req); - closedir(req->dir); - - req->sr->handler_data = NULL; - mk_api->mem_free(req); - req = NULL; -} - -void mk_dirhtml_cb_complete(struct mk_stream_input *in) -{ - struct mk_stream *stream; - struct mk_dirhtml_request *req; - - stream = in->stream; - req = stream->context; - if (req) { - mk_dirhtml_cleanup(req); - } -} - -void mk_dirhtml_cb_error(struct mk_stream *stream, int status) -{ -#ifndef TRACE - (void) status; -#endif - struct mk_dirhtml_request *req = stream->context; - - PLUGIN_TRACE("exception: %i", status); - - if (req) { - mk_dirhtml_cleanup(req); - } -} - -void mk_dirhtml_cb_chunk_body_rows(struct mk_stream_input *in, long bytes) -{ - (void) bytes; - - mk_dirhtml_cb_body_rows(in); -} - -void mk_dirhtml_cb_body_rows(struct mk_stream_input *in) -{ - int len; - char tmp[16]; - struct mk_stream *stream = in->stream; - struct mk_dirhtml_request *req = stream->context; - void (*cb_ok)(struct mk_stream_input *) = NULL; - - if (req->iov_entry) { - mk_api->iov_free(req->iov_entry); - req->iov_entry = NULL; - } - - if (req->toc_idx >= req->toc_len) { - if (req->chunked) { - len = snprintf(tmp, sizeof(tmp), "%x\r\n", - (int) req->iov_footer->total_len); - mk_stream_in_raw(req->stream, - NULL, - tmp, len, - NULL, NULL); - cb_ok = NULL; - } - else { - cb_ok = mk_dirhtml_cb_complete; - } - - mk_stream_in_iov(req->stream, - NULL, - req->iov_footer, - NULL, NULL); - if (req->chunked) { - mk_stream_in_raw(req->stream, - NULL, - "\r\n0\r\n\r\n", 7, - NULL, mk_dirhtml_cb_complete); - } - - return; - } - - req->iov_entry = enqueue_row(req->toc_idx, req); - if (req->chunked) { - len = snprintf(tmp, sizeof(tmp), "%x\r\n", - (int) req->iov_entry->total_len); - mk_stream_in_raw(req->stream, - NULL, - tmp, len, - NULL, NULL); - cb_ok = NULL; - } - else { - cb_ok = mk_dirhtml_cb_body_rows; - } - - mk_stream_in_iov(req->stream, - NULL, - req->iov_entry, - NULL, cb_ok); - - if (req->chunked) { - mk_stream_in_raw(req->stream, - NULL, - "\r\n", 2, - mk_dirhtml_cb_chunk_body_rows, NULL); - } - req->toc_idx++; -} - -/* - * The HTTP Headers were sent, now start registering the - * rows for each directory entry. - */ -void cb_header_finish(struct mk_stream_input *in) -{ - struct mk_stream *stream = in->stream; - struct mk_dirhtml_request *req; - - req = stream->context; - if (req->iov_header) { - mk_api->iov_free(req->iov_header); - req->iov_header = NULL; - } - mk_dirhtml_cb_body_rows(in); -} - -static int mk_dirhtml_init(struct mk_plugin *plugin, - struct mk_http_session *cs, struct mk_http_request *sr) -{ - DIR *dir; - int len; - char tmp[16]; - unsigned int i = 0; - struct mk_list *head; - struct mk_list list; - struct mk_f_list *entry; - struct mk_dirhtml_request *request; - struct mk_stream *stream; - - if (!(dir = opendir(sr->real_path.data))) { - return -1; - } - - /* Create the main context */ - request = mk_api->mem_alloc(sizeof(struct mk_dirhtml_request)); - if (!request) { - closedir(dir); - return -1; - } - - stream = mk_stream_set(NULL, cs->channel, request, - NULL, NULL, mk_dirhtml_cb_error); - if (!stream) { - closedir(dir); - free(request); - return -1; - } - - request->stream = stream; - request->state = MK_DIRHTML_STATE_HTTP_HEADER; - request->dir = dir; - request->toc_idx = 0; - request->cs = cs; - request->sr = sr; - request->toc_len = 0; - request->chunked = MK_FALSE; - request->iov_header = NULL; - request->iov_entry = NULL; - request->iov_footer = NULL; - - sr->handler_data = request; - - request->file_list = mk_dirhtml_create_list(dir, sr->real_path.data, - &request->toc_len); - - /* Building headers */ - mk_api->header_set_http_status(sr, MK_HTTP_OK); - sr->headers.cgi = SH_CGI; - sr->headers.breakline = MK_HEADER_BREAKLINE; - sr->headers.content_type = mk_dirhtml_default_mime; - sr->headers.content_length = -1; - - if (sr->protocol >= MK_HTTP_PROTOCOL_11) { - sr->headers.transfer_encoding = MK_HEADER_TE_TYPE_CHUNKED; - request->chunked = MK_TRUE; - } - - /* - * Creating response template - */ - - mk_list_init(&list); - - /* Set %_html_title_% */ - mk_dirhtml_tag_assign(&list, 0, mk_dir_iov_none, - sr->uri_processed.data, - (char **) _tags_global); - - /* Set %_theme_path_% */ - mk_dirhtml_tag_assign(&list, 1, mk_dir_iov_none, - dirhtml_conf->theme_path, (char **) _tags_global); - - /* HTML Header */ - request->iov_header = mk_dirhtml_theme_compose(mk_dirhtml_tpl_header, - &list); - - /* HTML Footer */ - request->iov_footer = mk_dirhtml_theme_compose(mk_dirhtml_tpl_footer, - &list); - mk_dirhtml_tag_free_list(&list); - - /* Creating table of contents and sorting */ - request->toc = mk_api->mem_alloc(sizeof(struct mk_f_list *) * request->toc_len); - - i = 0; - mk_list_foreach(head, request->file_list) { - entry = mk_list_entry(head, struct mk_f_list, _head); - request->toc[i] = entry; - i++; - } - - qsort(request->toc, - request->toc_len, - sizeof(*request->toc), - mk_dirhtml_entry_cmp); - - /* Prepare HTTP response headers */ - mk_api->header_prepare(plugin, cs, sr); - - if (request->chunked) { - len = snprintf(tmp, sizeof(tmp), "%x\r\n", - (int) request->iov_header->total_len); - mk_stream_in_raw(request->stream, - NULL, - tmp, len, - NULL, mk_dirhtml_cb_complete); - } - - mk_stream_in_iov(request->stream, - NULL, - request->iov_header, - NULL, cb_header_finish); - - if (request->chunked) { - mk_stream_in_raw(request->stream, - NULL, - "\r\n", 2, - NULL, NULL); - } - return 0; -} - -int mk_dirlisting_plugin_init(struct mk_plugin *plugin, char *confdir) -{ - mk_api = plugin->api; - - return mk_dirhtml_conf(confdir); -} - -int mk_dirlisting_plugin_exit(struct mk_plugin *plugin) -{ - (void) plugin; - - mk_api->mem_free(dirhtml_conf->theme); - mk_api->mem_free(dirhtml_conf->theme_path); - mk_api->mem_free(dirhtml_conf); - - return 0; -} - -int mk_dirlisting_stage30(struct mk_plugin *plugin, - struct mk_http_session *cs, - struct mk_http_request *sr, - int n_param, - struct mk_list *params) -{ - (void) plugin; - (void) n_param; - (void) params; - - /* validate file_info */ - if (sr->file_info.size == 0) { - return MK_PLUGIN_RET_NOT_ME; - } - - /* This plugin just handle directories */ - if (sr->file_info.is_directory == MK_FALSE) { - return MK_PLUGIN_RET_NOT_ME; - } - - PLUGIN_TRACE("Dirlisting attending socket %i", cs->socket); - if (mk_dirhtml_init(plugin, cs, sr)) { - /* - * If we failed here, we cannot return RET_END - that causes a mk_bug. - * dirhtml_init only fails if opendir fails. Usually we're at full - * capacity then and can't open new files. - */ - return MK_PLUGIN_RET_CLOSE_CONX; - } - - return MK_PLUGIN_RET_END; -} - -int mk_dirlisting_stage30_hangup(struct mk_plugin *plugin, - struct mk_http_session *cs, - struct mk_http_request *sr) -{ - (void) cs; - (void) plugin; - - if (sr->handler_data) { - mk_dirhtml_cleanup(sr->handler_data); - } - return 0; -} - -struct mk_plugin_stage mk_plugin_stage_dirlisting = { - .stage30 = &mk_dirlisting_stage30, - .stage30_hangup = &mk_dirlisting_stage30_hangup -}; - -struct mk_plugin mk_plugin_dirlisting = { - /* Identification */ - .shortname = "dirlisting", - .name = "Directory Listing", - .version = MK_VERSION_STR, - .hooks = MK_PLUGIN_STAGE, - - /* Init / Exit */ - .init_plugin = mk_dirlisting_plugin_init, - .exit_plugin = mk_dirlisting_plugin_exit, - - /* Init Levels */ - .master_init = NULL, - .worker_init = NULL, - - /* Type */ - .stage = &mk_plugin_stage_dirlisting -}; |