diff options
author | Rene Mayrhofer <rene@mayrhofer.eu.org> | 2008-07-10 12:47:56 +0000 |
---|---|---|
committer | Rene Mayrhofer <rene@mayrhofer.eu.org> | 2008-07-10 12:47:56 +0000 |
commit | eb841c5ef668a48782ef1154fda65cb6048f5885 (patch) | |
tree | 00dd0cb4313bf2291d94ed511fe51f0b4bc7ea7a /src/manager/lib | |
parent | 738206039047924ae7e4762a53d121be1ca43000 (diff) | |
download | vyos-strongswan-eb841c5ef668a48782ef1154fda65cb6048f5885.tar.gz vyos-strongswan-eb841c5ef668a48782ef1154fda65cb6048f5885.zip |
- Updated to new upstream.
Diffstat (limited to 'src/manager/lib')
-rw-r--r-- | src/manager/lib/context.h | 47 | ||||
-rw-r--r-- | src/manager/lib/controller.h | 84 | ||||
-rw-r--r-- | src/manager/lib/dispatcher.c | 401 | ||||
-rw-r--r-- | src/manager/lib/dispatcher.h | 95 | ||||
-rw-r--r-- | src/manager/lib/request.c | 341 | ||||
-rw-r--r-- | src/manager/lib/request.h | 135 | ||||
-rw-r--r-- | src/manager/lib/session.c | 175 | ||||
-rw-r--r-- | src/manager/lib/session.h | 73 | ||||
-rw-r--r-- | src/manager/lib/xml.c | 169 | ||||
-rw-r--r-- | src/manager/lib/xml.h | 63 |
10 files changed, 0 insertions, 1583 deletions
diff --git a/src/manager/lib/context.h b/src/manager/lib/context.h deleted file mode 100644 index 23c979b8e..000000000 --- a/src/manager/lib/context.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @file context.h - * - * @brief Interface of context_t. - * - */ - -/* - * Copyright (C) 2007 Martin Willi - * Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#ifndef CONTEXT_H_ -#define CONTEXT_H_ - -typedef struct context_t context_t; - -/** - * @brief Constructor function for a context - */ -typedef context_t *(*context_constructor_t)(void *param); - -/** - * @brief Custom session context - * - */ -struct context_t { - - /** - * @brief Destroy the context_t. - * - * @param this calling object - */ - void (*destroy) (context_t *this); -}; - -#endif /* CONTEXT_H_ */ diff --git a/src/manager/lib/controller.h b/src/manager/lib/controller.h deleted file mode 100644 index 5b39f559c..000000000 --- a/src/manager/lib/controller.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @file controller.h - * - * @brief Interface controller_t. - * - */ - -/* - * Copyright (C) 2007 Martin Willi - * Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#ifndef CONTROLLER_H_ -#define CONTROLLER_H_ - -#include "request.h" -#include "context.h" - -typedef struct controller_t controller_t; - -/** - * @brief Controller action handle function - * - * @param request http request - * @param response http response - */ -typedef void *(*controller_handler_t)(controller_t *this, request_t *request); - -/** - * @brief Constructor function for a controller - * - * @param context session specific context - * @param param user supplied param - */ -typedef controller_t *(*controller_constructor_t)(context_t* context, void *param); - -/** - * @brief Controller interface, to be implemented by users controllers. - * - */ -struct controller_t { - - /** - * @brief Get the name of the controller. - * - * @return name of the controller - */ - char* (*get_name)(controller_t *this); - - /** - * @brief Handle a HTTP request for that controller. - * - * Request URLs are parsed in the form - * controller_name/p1/p2/p3/p4/p5 with a maximum of 5 parameters. Each - * parameter not found in the request URL is set to NULL. - * - * @param request HTTP request - * @param p1 first parameter - * @param p2 second parameter - * @param p3 third parameter - * @param p4 forth parameter - * @param p5 fifth parameter - * @return - */ - void (*handle)(controller_t *this, request_t *request, - char *a1, char *a2, char *a3, char *a4, char *a5); - - /** - * @brief Destroy the controller instance. - */ - void (*destroy) (controller_t *this); -}; - -#endif /* CONTROLLER_H_ */ diff --git a/src/manager/lib/dispatcher.c b/src/manager/lib/dispatcher.c deleted file mode 100644 index ce53d39ea..000000000 --- a/src/manager/lib/dispatcher.c +++ /dev/null @@ -1,401 +0,0 @@ -/** - * @file dispatcher.c - * - * @brief Implementation of dispatcher_t. - * - */ - -/* - * Copyright (C) 2007 Martin Willi - * Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#include "dispatcher.h" - -#include "request.h" -#include "session.h" - -#include <fcgiapp.h> -#include <pthread.h> -#include <signal.h> -#include <unistd.h> - -#include <debug.h> -#include <utils/linked_list.h> - -typedef struct private_dispatcher_t private_dispatcher_t; - -/** - * private data of the task manager - */ -struct private_dispatcher_t { - - /** - * public functions - */ - dispatcher_t public; - - /** - * fcgi socket fd - */ - int fd; - - /** - * thread list - */ - pthread_t *threads; - - /** - * number of threads in "threads" - */ - int thread_count; - - /** - * session locking mutex - */ - pthread_mutex_t mutex; - - /** - * List of sessions - */ - linked_list_t *sessions; - - /** - * session timeout - */ - time_t timeout; - - /** - * List of controllers controller_constructor_t - */ - linked_list_t *controllers; - - /** - * constructor function to create session context (in constructor_entry_t) - */ - context_constructor_t context_constructor; - - /** - * user param to context constructor - */ - void *param; - - /** - * thread specific initialization handler - */ - void (*init)(void *param); - - /** - * argument to pass to thread intiializer - */ - void *init_param; - - /** - * thread specific deinitialization handler - */ - void (*deinit)(void *param); - - /** - * param tho thread specific deinitialization handler - */ - void *deinit_param; -}; - -typedef struct { - /** constructor function */ - controller_constructor_t constructor; - /** parameter to constructor */ - void *param; -} constructor_entry_t; - -typedef struct { - /** session instance */ - session_t *session; - /** condvar to wait for session */ - pthread_cond_t cond; - /** TRUE if session is in use */ - bool in_use; - /** last use of the session */ - time_t used; -} session_entry_t; - -/** - * create a session and instanciate controllers - */ -static session_t* load_session(private_dispatcher_t *this) -{ - iterator_t *iterator; - constructor_entry_t *entry; - session_t *session; - context_t *context = NULL; - controller_t *controller; - - if (this->context_constructor) - { - context = this->context_constructor(this->param); - } - session = session_create(context); - - iterator = this->controllers->create_iterator(this->controllers, TRUE); - while (iterator->iterate(iterator, (void**)&entry)) - { - controller = entry->constructor(context, entry->param); - session->add_controller(session, controller); - } - iterator->destroy(iterator); - - return session; -} - -/** - * create a new session entry - */ -static session_entry_t *session_entry_create(private_dispatcher_t *this) -{ - session_entry_t *entry; - - entry = malloc_thing(session_entry_t); - entry->in_use = FALSE; - pthread_cond_init(&entry->cond, NULL); - entry->session = load_session(this); - entry->used = time(NULL); - - return entry; -} - -static void session_entry_destroy(session_entry_t *entry) -{ - entry->session->destroy(entry->session); - free(entry); -} - -/** - * Implementation of dispatcher_t.add_controller. - */ -static void add_controller(private_dispatcher_t *this, - controller_constructor_t constructor, void *param) -{ - constructor_entry_t *entry = malloc_thing(constructor_entry_t); - - entry->constructor = constructor; - entry->param = param; - this->controllers->insert_last(this->controllers, entry); -} - -/** - * Actual dispatching code - */ -static void dispatch(private_dispatcher_t *this) -{ - FCGX_Request fcgi_req; - - if (FCGX_InitRequest(&fcgi_req, this->fd, 0) == 0) - { - while (TRUE) - { - request_t *request; - session_entry_t *current, *found = NULL; - iterator_t *iterator; - time_t now; - char *sid; - int accepted; - - pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); - accepted = FCGX_Accept_r(&fcgi_req); - pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); - - if (accepted != 0) - { - break; - } - - /* prepare */ - request = request_create(&fcgi_req, TRUE); - if (request == NULL) - { - continue; - } - sid = request->get_cookie(request, "SID"); - now = time(NULL); - - /* find session */ - pthread_mutex_lock(&this->mutex); - iterator = this->sessions->create_iterator(this->sessions, TRUE); - while (iterator->iterate(iterator, (void**)¤t)) - { - /* check all sessions for timeout */ - if (!current->in_use && - current->used < now - this->timeout) - { - iterator->remove(iterator); - session_entry_destroy(current); - continue; - } - if (!found && sid && - streq(current->session->get_sid(current->session), sid)) - { - found = current; - } - } - iterator->destroy(iterator); - - if (found) - { /* wait until session is unused */ - while (found->in_use) - { - pthread_cond_wait(&found->cond, &this->mutex); - } - } - else - { /* create a new session if not found */ - found = session_entry_create(this); - this->sessions->insert_first(this->sessions, found); - } - found->in_use = TRUE; - pthread_mutex_unlock(&this->mutex); - - /* start processing */ - found->session->process(found->session, request); - found->used = time(NULL); - - /* release session */ - pthread_mutex_lock(&this->mutex); - found->in_use = FALSE; - pthread_cond_signal(&found->cond); - pthread_mutex_unlock(&this->mutex); - - /* cleanup */ - request->destroy(request); - - /* - FCGX_FPrintF(fcgi_req.out, "<ul>"); - char **env = fcgi_req.envp; - while (*env) - { - FCGX_FPrintF(fcgi_req.out, "<li>%s</li>", *env); - env++; - } - FCGX_FPrintF(fcgi_req.out, "</ul>"); - */ - } - } -} - -/** - * Setup thread and start dispatching - */ -static void start_dispatching(private_dispatcher_t *this) -{ - pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); - if (this->init) - { - this->init(this->init_param); - } - if (this->deinit) - { - pthread_cleanup_push(this->deinit, this->deinit_param); - dispatch(this); - pthread_cleanup_pop(1); - } - else - { - dispatch(this); - } -} - -/** - * Implementation of dispatcher_t.run. - */ -static void run(private_dispatcher_t *this, int threads, - void(*init)(void *param), void *init_param, - void(*deinit)(void *param), void *deinit_param) -{ - this->init = init; - this->init_param = init_param; - this->deinit = deinit; - this->deinit_param = deinit_param; - this->thread_count = threads; - this->threads = malloc(sizeof(pthread_t) * threads); - while (threads) - { - if (pthread_create(&this->threads[threads - 1], - NULL, (void*)start_dispatching, this) == 0) - { - threads--; - } - } -} - -/** - * Implementation of dispatcher_t.waitsignal. - */ -static void waitsignal(private_dispatcher_t *this) -{ - sigset_t set; - int sig; - - sigemptyset(&set); - sigaddset(&set, SIGINT); - sigaddset(&set, SIGTERM); - sigaddset(&set, SIGHUP); - sigprocmask(SIG_BLOCK, &set, NULL); - sigwait(&set, &sig); -} - -/** - * Implementation of dispatcher_t.destroy - */ -static void destroy(private_dispatcher_t *this) -{ - FCGX_ShutdownPending(); - while (this->thread_count--) - { - pthread_cancel(this->threads[this->thread_count]); - pthread_join(this->threads[this->thread_count], NULL); - } - this->sessions->destroy_function(this->sessions, (void*)session_entry_destroy); - this->controllers->destroy_function(this->controllers, free); - free(this); -} - -/* - * see header file - */ -dispatcher_t *dispatcher_create(char *socket, int timeout, - context_constructor_t constructor, void *param) -{ - private_dispatcher_t *this = malloc_thing(private_dispatcher_t); - - this->public.add_controller = (void(*)(dispatcher_t*, controller_constructor_t, void*))add_controller; - this->public.run = (void(*)(dispatcher_t*, int threads,void(*)(void *),void *,void(*)(void *),void *))run; - this->public.waitsignal = (void(*)(dispatcher_t*))waitsignal; - this->public.destroy = (void(*)(dispatcher_t*))destroy; - - this->sessions = linked_list_create(); - this->controllers = linked_list_create(); - this->context_constructor = constructor; - pthread_mutex_init(&this->mutex, NULL); - this->param = param; - this->fd = 0; - this->timeout = timeout; - - FCGX_Init(); - - if (socket) - { - unlink(socket); - this->fd = FCGX_OpenSocket(socket, 10); - } - return &this->public; -} - diff --git a/src/manager/lib/dispatcher.h b/src/manager/lib/dispatcher.h deleted file mode 100644 index 274837838..000000000 --- a/src/manager/lib/dispatcher.h +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @file dispatcher.h - * - * @brief Interface of dispatcher_t. - * - */ - -/* - * Copyright (C) 2007 Martin Willi - * Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#ifndef DISPATCHER_H_ -#define DISPATCHER_H_ - -#include "controller.h" - -typedef struct dispatcher_t dispatcher_t; - -/** - * @brief Dispatcher, accepts connections using multiple threads. - * - * The dispatcher creates a session for each client (using SID cookies). In - * each session, a session context is created using the context constructor. - * Each controller is instanciated in the session using the controller - * constructor added with add_controller. - */ -struct dispatcher_t { - - /** - * @brief Register a controller to the dispatcher. - * - * The first controller added serves as default controller. Client's - * get redirected to it if no other controller matches. - * - * @param constructor constructor function to the conntroller - * @param param param to pass to constructor - */ - void (*add_controller)(dispatcher_t *this, - controller_constructor_t constructor, void *param); - - /** - * @brief Start with dispatching. - * - * It may be necessary to call per-thread initialization functions. - * If init is not NULL, the handler is called right after thread - * creation (by the created thread) and the deinit function is called - * before the thread gets destroyed (again by the thread itself). - * - * @param thread number of dispatching threads - * @param init thread specific initialization function, or NULL - * @param init_param param to pass to init function - * @param deinit thread dpecific deinitialization function, or NULL - * @param deinit_param param to pass to deinit function - */ - void (*run)(dispatcher_t *this, int threads, - void(*init)(void *param), void *init_param, - void(*deinit)(void *param), void *deinit_param); - - /** - * @brief Wait for a relevant signal action. - */ - void (*waitsignal)(dispatcher_t *this); - - /** - * @brief Destroy the dispatcher_t. - */ - void (*destroy) (dispatcher_t *this); -}; - -/** - * @brief Create a dispatcher. - * - * The context constructor is invoked to create a session context for - * each session. - * - * @param socket FastCGI socket path, NULL for dynamic - * @param timeout session timeout - * @param constructor construction function for session context - * @param param parameter to supply to context constructor - */ -dispatcher_t *dispatcher_create(char *socket, int timeout, - context_constructor_t constructor, void *param); - -#endif /* DISPATCHER_H_ */ diff --git a/src/manager/lib/request.c b/src/manager/lib/request.c deleted file mode 100644 index bbaec10cc..000000000 --- a/src/manager/lib/request.c +++ /dev/null @@ -1,341 +0,0 @@ -/** - * @file request.c - * - * @brief Implementation of request_t. - * - */ - -/* - * Copyright (C) 2007 Martin Willi - * Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#define _GNU_SOURCE - -#include "request.h" - -#include <library.h> -#include <stdlib.h> -#include <string.h> -#include <pthread.h> -#include <ClearSilver/ClearSilver.h> - -typedef struct private_request_t private_request_t; - -/** - * private data of the task manager - */ -struct private_request_t { - - /** - * public functions - */ - request_t public; - - /** - * FastCGI request object - */ - FCGX_Request *req; - - /** - * ClearSilver CGI Kit context - */ - CGI *cgi; - - /** - * ClearSilver HDF dataset for this request - */ - HDF *hdf; -}; - -/** - * key to a thread specific FCGX_Request, used for ClearSilver cgiwrap callbacks. - * ClearSilver cgiwrap is not threadsave, so we use a private - * context for each thread. - */ -static pthread_key_t req_key; - -/** - * length of param list in req->envp - */ -static pthread_key_t req_env_len_key; - -/** - * control variable for pthread_once - */ -pthread_once_t once = PTHREAD_ONCE_INIT; - -/** - * fcgiwrap read callback - */ -static int read_cb(void *null, char *buf, int size) -{ - FCGX_Request *req = (FCGX_Request*)pthread_getspecific(req_key); - return FCGX_GetStr(buf, size, req->in); -} - -/** - * fcgiwrap writef callback - */ -static int writef_cb(void *null, const char *format, va_list args) -{ - FCGX_Request *req = (FCGX_Request*)pthread_getspecific(req_key); - FCGX_VFPrintF(req->out, format, args); - return 0; -} -/** - * fcgiwrap write callback - */ -static int write_cb(void *null, const char *buf, int size) -{ - FCGX_Request *req = (FCGX_Request*)pthread_getspecific(req_key); - return FCGX_PutStr(buf, size, req->out); -} - -/** - * fcgiwrap getenv callback - */ -static char *getenv_cb(void *null, const char *key) -{ - char *value; - FCGX_Request *req = (FCGX_Request*)pthread_getspecific(req_key); - value = FCGX_GetParam(key, req->envp); - return value ? strdup(value) : NULL; -} - -/** - * fcgiwrap getenv callback - */ -static int putenv_cb(void *null, const char *key, const char *value) -{ - /* not supported */ - return 1; -} - -/** - * fcgiwrap iterenv callback - */ -static int iterenv_cb(void *null, int num, char **key, char **value) -{ - *key = NULL; - *value = NULL; - FCGX_Request *req = (FCGX_Request*)pthread_getspecific(req_key); - int req_env_len = (int)pthread_getspecific(req_env_len_key); - if (num < req_env_len) - { - char *eq; - - eq = strchr(req->envp[num], '='); - if (eq) - { - *key = strndup(req->envp[num], eq - req->envp[num]); - *value = strdup(eq + 1); - } - if (*key == NULL || *value == NULL) - { - free(*key); - free(*value); - return 1; - } - } - return 0; -} - -/** - * Implementation of request_t.get_cookie. - */ -static char* get_cookie(private_request_t *this, char *name) -{ - return hdf_get_valuef(this->hdf, "Cookie.%s", name); -} - -/** - * Implementation of request_t.get_path. - */ -static char* get_path(private_request_t *this) -{ - char * path = FCGX_GetParam("PATH_INFO", this->req->envp); - return path ? path : ""; -} - -/** - * Implementation of request_t.get_post_data. - */ -static char* get_query_data(private_request_t *this, char *name) -{ - return hdf_get_valuef(this->hdf, "Query.%s", name); -} - -/** - * Implementation of request_t.add_cookie. - */ -static void add_cookie(private_request_t *this, char *name, char *value) -{ - cgi_cookie_set (this->cgi, name, value, - FCGX_GetParam("SCRIPT_NAME", this->req->envp), - NULL, NULL, 0, 0); -} - -/** - * Implementation of request_t.redirect. - */ -static void redirect(private_request_t *this, char *fmt, ...) -{ - va_list args; - - FCGX_FPrintF(this->req->out, "Status: 303 See Other\n"); - FCGX_FPrintF(this->req->out, "Location: %s%s", - FCGX_GetParam("SCRIPT_NAME", this->req->envp), - *fmt == '/' ? "" : "/"); - va_start(args, fmt); - FCGX_VFPrintF(this->req->out, fmt, args); - va_end(args); - FCGX_FPrintF(this->req->out, "\n\n"); -} - -/** - * Implementation of request_t.get_base. - */ -static char* get_base(private_request_t *this) -{ - return FCGX_GetParam("SCRIPT_NAME", this->req->envp); -} - -/** - * Implementation of request_t.serve. - */ -static void serve(private_request_t *this, char *headers, chunk_t chunk) -{ - FCGX_FPrintF(this->req->out, "%s\n\n", headers); - - FCGX_PutStr(chunk.ptr, chunk.len, this->req->out); -} - -/** - * Implementation of request_t.render. - */ -static void render(private_request_t *this, char *template) -{ - NEOERR* err; - - err = cgi_display(this->cgi, template); - if (err) - { - cgi_neo_error(this->cgi, err); - nerr_log_error(err); - } - return; -} - -/** - * Implementation of request_t.set. - */ -static void set(private_request_t *this, char *key, char *value) -{ - hdf_set_value(this->hdf, key, value); -} - -/** - * Implementation of request_t.setf. - */ -static void setf(private_request_t *this, char *format, ...) -{ - va_list args; - - va_start(args, format); - hdf_set_valuevf(this->hdf, format, args); - va_end(args); -} - -/** - * Implementation of request_t.destroy - */ -static void destroy(private_request_t *this) -{ - cgi_destroy(&this->cgi); - free(this); -} - -/** - * This initialization method is guaranteed to run only once - * for all threads. - */ -static void init(void) -{ - cgiwrap_init_emu(NULL, read_cb, writef_cb, write_cb, - getenv_cb, putenv_cb, iterenv_cb); - pthread_key_create(&req_key, NULL); - pthread_key_create(&req_env_len_key, NULL); -} - -/* - * see header file - */ -request_t *request_create(FCGX_Request *request, bool debug) -{ - NEOERR* err; - private_request_t *this = malloc_thing(private_request_t); - - this->public.get_path = (char*(*)(request_t*))get_path; - this->public.get_base = (char*(*)(request_t*))get_base; - this->public.add_cookie = (void(*)(request_t*, char *name, char *value))add_cookie; - this->public.get_cookie = (char*(*)(request_t*,char*))get_cookie; - this->public.get_query_data = (char*(*)(request_t*, char *name))get_query_data; - this->public.redirect = (void(*)(request_t*, char *fmt,...))redirect; - this->public.render = (void(*)(request_t*,char*))render; - this->public.serve = (void(*)(request_t*,char*,chunk_t))serve; - this->public.set = (void(*)(request_t*, char *, char*))set; - this->public.setf = (void(*)(request_t*, char *format, ...))setf; - this->public.destroy = (void(*)(request_t*))destroy; - - pthread_once(&once, init); - - this->req = request; - pthread_setspecific(req_key, (void*)request); - - int req_env_len = 0; - while (request->envp[req_env_len] != NULL) - { - req_env_len++; - } - - pthread_setspecific(req_env_len_key, (void*)req_env_len); - - err = hdf_init(&this->hdf); - if (!err) - { - hdf_set_value(this->hdf, "base", get_base(this)); - hdf_set_value(this->hdf, "Config.NoCache", "true"); - if (!debug) - { - hdf_set_value(this->hdf, "Config.TimeFooter", "0"); - hdf_set_value(this->hdf, "Config.CompressionEnabled", "1"); - hdf_set_value(this->hdf, "Config.WhiteSpaceStrip", "2"); - } - - err = cgi_init(&this->cgi, this->hdf); - if (!err) - { - err = cgi_parse(this->cgi); - if (!err) - { - return &this->public; - } - cgi_destroy(&this->cgi); - } - } - nerr_log_error(err); - free(this); - return NULL; -} - diff --git a/src/manager/lib/request.h b/src/manager/lib/request.h deleted file mode 100644 index f78741d37..000000000 --- a/src/manager/lib/request.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @file request.h - * - * @brief Interface of request_t. - * - */ - -/* - * Copyright (C) 2007 Martin Willi - * Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#ifndef REQUEST_H_ -#define REQUEST_H_ - -#include <fcgiapp.h> -#include <library.h> - -typedef struct request_t request_t; - -/** - * @brief A HTTP request, encapsulates FCGX_Request. - * - */ -struct request_t { - - /** - * @brief Add a cookie to the reply (Set-Cookie header). - * - * @param name name of the cookie to set - * @param value value of the cookie - */ - void (*add_cookie)(request_t *this, char *name, char *value); - - /** - * @brief Get a cookie the client sent in the request. - * - * @param name name of the cookie - * @return cookie value, NULL if no such cookie found - */ - char* (*get_cookie)(request_t *this, char *name); - - /** - * @brief Get the request path relative to the application. - * - * @return path - */ - char* (*get_path)(request_t *this); - - /** - * @brief Get the base path of the application. - * - * @return base path - */ - char* (*get_base)(request_t *this); - - /** - * @brief Get a post/get variable included in the request. - * - * @param name name of the POST/GET variable - * @return value, NULL if not found - */ - char* (*get_query_data)(request_t *this, char *name); - - /** - * @brief Redirect the client to another location. - * - * @param fmt location format string - * @param ... variable argument for fmt - */ - void (*redirect)(request_t *this, char *fmt, ...); - - /** - * @brief Set a template value. - * - * @param key key to set - * @param value value to set key to - */ - void (*set)(request_t *this, char *key, char *value); - - /** - * @brief Set a template value using format strings. - * - * Format string is in the form "key=value", where printf like format - * substitution occurs over the whole string. - * - * @param format printf like format string - * @param ... variable argument list - */ - void (*setf)(request_t *this, char *format, ...); - - /** - * @brief Render a template. - * - * The render() function additionally sets a HDF variable "base" - * which points to the root of the web application and allows to point to - * other targets without to worry about path location. - * - * @param template clearsilver template file location - */ - void (*render)(request_t *this, char *template); - - /** - * @brief Serve a request with headers and a body. - * - * @param headers HTTP headers, \n separated - * @param chunk body to write to output - */ - void (*serve)(request_t *this, char *headers, chunk_t chunk); - - /** - * @brief Destroy the request_t. - */ - void (*destroy) (request_t *this); -}; - -/** - * @brief Create a request from the fastcgi struct. - * - * @param request the FCGI request - * @param debug no stripping, no compression, timing information - */ -request_t *request_create(FCGX_Request *request, bool debug); - -#endif /* REQUEST_H_ */ diff --git a/src/manager/lib/session.c b/src/manager/lib/session.c deleted file mode 100644 index fe260b887..000000000 --- a/src/manager/lib/session.c +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @file session.c - * - * @brief Implementation of session_t. - * - */ - -/* - * Copyright (C) 2007 Martin Willi - * Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#define _GNU_SOURCE - -#include "session.h" - -#include <string.h> -#include <fcgiapp.h> -#include <stdio.h> - -#include <utils/linked_list.h> -#include <utils/randomizer.h> - -typedef struct private_session_t private_session_t; - -/** - * private data of the task manager - */ -struct private_session_t { - - /** - * public functions - */ - session_t public; - - /** - * session ID - */ - char *sid; - - /** - * list of controller instances controller_t - */ - linked_list_t *controllers; - - /** - * user defined session context - */ - context_t *context; -}; - -/** - * Implementation of session_t.load_controller. - */ -static void add_controller(private_session_t *this, controller_t *controller) -{ - this->controllers->insert_last(this->controllers, controller); -} - -/** - * Create a session ID and a cookie - */ -static void create_sid(private_session_t *this, request_t *request) -{ - char buf[16]; - chunk_t chunk = chunk_from_buf(buf); - randomizer_t *randomizer = randomizer_create(); - - randomizer->get_pseudo_random_bytes(randomizer, sizeof(buf), buf); - this->sid = chunk_to_hex(chunk, FALSE); - request->add_cookie(request, "SID", this->sid); - randomizer->destroy(randomizer); -} - -/** - * Implementation of session_t.process. - */ -static void process(private_session_t *this, request_t *request) -{ - char *pos, *start, *param[6] = {NULL, NULL, NULL, NULL, NULL, NULL}; - iterator_t *iterator; - bool handled = FALSE; - controller_t *current; - int i = 0; - - if (this->sid == NULL) - { - create_sid(this, request); - } - - start = request->get_path(request); - if (start) - { - if (*start == '/') start++; - while ((pos = strchr(start, '/')) != NULL && i < 5) - { - param[i++] = strndup(start, pos - start); - start = pos + 1; - } - param[i] = strdup(start); - iterator = this->controllers->create_iterator(this->controllers, TRUE); - while (iterator->iterate(iterator, (void**)¤t)) - { - if (streq(current->get_name(current), param[0])) - { - current->handle(current, request, param[1], param[2], param[3], - param[4], param[5]); - handled = TRUE; - break; - } - } - iterator->destroy(iterator); - for (i = 0; i < 6; i++) - { - free(param[i]); - } - } - if (!handled) - { - if (this->controllers->get_first(this->controllers, - (void**)¤t) == SUCCESS) - { - request->redirect(request, current->get_name(current)); - } - } -} - -/** - * Implementation of session_t.get_sid. - */ -static char* get_sid(private_session_t *this) -{ - return this->sid; -} - -/** - * Implementation of session_t.destroy - */ -static void destroy(private_session_t *this) -{ - this->controllers->destroy_offset(this->controllers, offsetof(controller_t, destroy)); - if (this->context) this->context->destroy(this->context); - free(this->sid); - free(this); -} - -/* - * see header file - */ -session_t *session_create(context_t *context) -{ - private_session_t *this = malloc_thing(private_session_t); - - this->public.add_controller = (void(*)(session_t*, controller_t*))add_controller; - this->public.process = (void(*)(session_t*,request_t*))process; - this->public.get_sid = (char*(*)(session_t*))get_sid; - this->public.destroy = (void(*)(session_t*))destroy; - - this->sid = NULL; - this->controllers = linked_list_create(); - this->context = context; - - return &this->public; -} - diff --git a/src/manager/lib/session.h b/src/manager/lib/session.h deleted file mode 100644 index d18545876..000000000 --- a/src/manager/lib/session.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - * @file session.h - * - * @brief Interface of session_t. - * - */ - -/* - * Copyright (C) 2007 Martin Willi - * Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#ifndef SESSION_H_ -#define SESSION_H_ - -#include "request.h" -#include "controller.h" - -typedef struct session_t session_t; - -/** - * @brief A session, identified by a session ID. - * - */ -struct session_t { - - /** - * @brief Get the session ID of the session. - * - * @return session ID - */ - char* (*get_sid)(session_t *this); - - /** - * @brief Add a controller instance to the session. - * - * @param controller controller to add - */ - void (*add_controller)(session_t *this, controller_t *controller); - - /** - * @brief Process a request in this session. - * - * @param request request to process - */ - void (*process)(session_t *this, request_t *request); - - /** - * @brief Destroy the session_t. - * - * @param this calling object - */ - void (*destroy) (session_t *this); -}; - -/** - * @brief Create a session. - * - * @param context user defined session context instance - */ -session_t *session_create(context_t *context); - -#endif /* SESSION_H_ */ diff --git a/src/manager/lib/xml.c b/src/manager/lib/xml.c deleted file mode 100644 index 008235b69..000000000 --- a/src/manager/lib/xml.c +++ /dev/null @@ -1,169 +0,0 @@ -/** - * @file xml.c - * - * @brief Implementation of xml_t. - * - */ - -/* - * Copyright (C) 2007 Martin Willi - * Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#include "xml.h" - -#include <libxml/parser.h> -#include <libxml/tree.h> - - -typedef struct private_xml_t private_xml_t; - -/** - * private data of xml - */ -struct private_xml_t { - - /** - * public functions - */ - xml_t public; - - /** - * root node of this xml (part) - */ - xmlNode *node; - - /** - * document, only for root xml_t - */ - xmlDoc *doc; - - /** - * Root xml_t* - */ - private_xml_t *root; - - /** - * number of enumerator instances - */ - int enums; -}; - -/** - * child element enumerator - */ -typedef struct { - /** enumerator interface */ - enumerator_t e; - /** current child context (returned to enumerate() caller) */ - private_xml_t child; - /** currently processing node */ - xmlNode *node; -} child_enum_t; - -/** - * Implementation of xml_t.children().enumerate(). - */ -static bool child_enumerate(child_enum_t *e, private_xml_t **child, - char **name, char **value) -{ - while (e->node && e->node->type != XML_ELEMENT_NODE) - { - e->node = e->node->next; - } - if (e->node) - { - xmlNode *text; - - text = e->node->children; - *value = NULL; - - while (text && text->type != XML_TEXT_NODE) - { - text = text->next; - } - if (text) - { - *value = text->content; - } - *name = (char*)e->node->name; - *child = &e->child; - e->child.node = e->node->children; - e->node = e->node->next; - return TRUE; - } - return FALSE; -} - -/** - * Implementation of xml_t.get_attribute. - */ -static char* get_attribute(private_xml_t *this, char *name) -{ - return NULL; -} - -/** - * destroy enumerator, and complete tree if this was the last enumerator - */ -static void child_destroy(child_enum_t *this) -{ - if (--this->child.root->enums == 0) - { - xmlFreeDoc(this->child.root->doc); - free(this->child.root); - } - free(this); -} - -/** - * Implementation of xml_t.children. - */ -static enumerator_t* children(private_xml_t *this) -{ - child_enum_t *ce = malloc_thing(child_enum_t); - ce->e.enumerate = (void*)child_enumerate; - ce->e.destroy = (void*)child_destroy; - ce->node = this->node; - ce->child.public.children = (void*)children; - ce->child.public.get_attribute = (void*)get_attribute; - ce->child.node = NULL; - ce->child.doc = this->doc; - ce->child.root = this->root; - this->root->enums++; - return &ce->e; -} - -/* - * see header file - */ -xml_t *xml_create(char *xml) -{ - private_xml_t *this = malloc_thing(private_xml_t); - - this->public.get_attribute = (char*(*)(xml_t*,char*))get_attribute; - this->public.children = (enumerator_t*(*)(xml_t*))children; - - this->doc = xmlReadMemory(xml, strlen(xml), NULL, NULL, 0); - if (this->doc == NULL) - { - free(this); - return NULL; - } - this->node = xmlDocGetRootElement(this->doc); - this->root = this; - this->enums = 0; - - return &this->public; -} - diff --git a/src/manager/lib/xml.h b/src/manager/lib/xml.h deleted file mode 100644 index 738a8e1b3..000000000 --- a/src/manager/lib/xml.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @file xml.h - * - * @brief Interface of xml_t. - * - */ - -/* - * Copyright (C) 2007 Martin Willi - * Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#ifndef XML_H_ -#define XML_H_ - -#include <utils/enumerator.h> - -typedef struct xml_t xml_t; - -/** - * @brief Simple enumerator based XML parser. - * - * An xml_t is a single node of the XML tree, but also serves as root node - * and therefore the document. - * This object has no destructor, the tree gets destroyed when all enumerator - * instances get destroyed. - */ -struct xml_t { - - /** - * @brief Create an enumerator over all children. - * - * Enumerated values must not be manipulated or freed. - * - * @return enumerator over (xml_t* child, char *name, char *value) - */ - enumerator_t* (*children)(xml_t *this); - - /** - * @brief Get an attribute value by its name. - * - * @param name name of the attribute - * @return attribute value, NULL if not found - */ - char *(*get_attribute)(xml_t *this, char *name); -}; - -/** - * @brief Create a xml instance. - */ -xml_t *xml_create(char *xml); - -#endif /* XML_H_ */ |