diff -r 7b235fa88008 -r 627b09ee74e4 src/server/daemon/config.c
--- a/src/server/daemon/config.c Sat Jan 28 16:01:07 2012 +0100
+++ b/src/server/daemon/config.c Mon Feb 13 13:49:49 2012 +0100
@@ -42,6 +42,7 @@
#include "httplistener.h"
#include "config.h"
#include "func.h"
+#include "configmanager.h"
#include "vserver.h"
#include "../util/pblock.h"
@@ -50,10 +51,6 @@
// TODO: Funktion für ConfigDirective -> directive
// TODO: Funktion für UcxList parameter list -> pblock
-// TODO: ConfigurationManager
-// TODO: server.conf
-
-UcxMap *server_conf_handlers; // type: ServerConfigHandler*
void load_init_conf(char *file) {
printf("load_init_conf\n");
@@ -102,7 +99,7 @@
free_init_config(cfg);
}
-ServerConfiguration* load_server_conf(char *file) {
+ServerConfiguration* load_server_conf(ServerConfiguration *old, char *file) {
printf("load_server_conf\n");
ServerConfig *serverconf = load_server_config(file);
@@ -123,39 +120,22 @@
while(list != NULL) {
ServerConfigObject *scfgobj = list->data;
- /* get handler */
- ServerConfigHandler *handler = ucx_map_sstr_get(
- server_conf_handlers,
- scfgobj->type);
- if(handler != NULL) {
- void *object_data = NULL;
- if(handler->element_start != NULL) {
- object_data = handler->element_start(
- handler,
- serverconfig);
- }
-
- /* process the directives */
- UcxDlist *dirs = scfgobj->directives;
- while(dirs != NULL) {
- handler->process_directive(
- handler,
- serverconfig,
- dirs->data,
- object_data);
-
- dirs = dirs->next;
- }
-
- if(handler->element_end != NULL) {
- handler->element_end(
- handler,
- serverconfig,
- NULL,
- object_data);
- }
+ /* handle config object */
+ int hr = 0;
+ if(!sstrcmp(scfgobj->type, sstr("Runtime"))) {
+ hr = cfg_handle_runtime(serverconfig, scfgobj);
+ } else if(!sstrcmp(scfgobj->type, sstr("LogFile"))) {
+ hr = cfg_handle_logfile(serverconfig, scfgobj);
+ } else if(!sstrcmp(scfgobj->type, sstr("AuthDB"))) {
+ hr = cfg_handle_authdb(serverconfig, scfgobj);
+ } else if(!sstrcmp(scfgobj->type, sstr("Listener"))) {
+ hr = cfg_handle_listener(serverconfig, scfgobj);
+ } else if(!sstrcmp(scfgobj->type, sstr("VirtualServer"))) {
+ hr = cfg_handle_vs(serverconfig, scfgobj);
}
+
+ /* next object */
list = list->next;
}
@@ -163,6 +143,8 @@
}
}
+
+
/* set VirtualServer for all listeners */
UcxList *ls = serverconfig->listeners;
while(ls) {
@@ -198,158 +180,103 @@
void init_server_config_parser() {
- /* create handler map */
- server_conf_handlers = ucx_map_new(8);
-
- /* create and add default handlers */
+
+}
- ServerConfigHandler *runtime = calloc(1, sizeof(ServerConfigHandler));
- runtime->init = NULL;
- runtime->process_directive = handle_runtime_directive;
-
- ucx_map_cstr_put(server_conf_handlers, "Runtime", runtime);
-
+int cfg_handle_runtime(ServerConfiguration *cfg, ServerConfigObject *obj) {
+ cfg->user = sstrdub(cfg_directivelist_get_str(
+ obj->directives,
+ sstr("User")));
+ cfg->tmp = sstrdub(cfg_directivelist_get_str(
+ obj->directives,
+ sstr("Temp")));
- ServerConfigHandler *listener = calloc(1, sizeof(ServerConfigHandler));
- listener->init = NULL;
- listener->element_start = handle_listener_start;
- listener->element_end = handle_listener_end;
- listener->process_directive = handle_listener_directive;
+ return 0;
+}
- ucx_map_cstr_put(server_conf_handlers, "Listener", listener);
-
+int cfg_handle_logfile(ServerConfiguration *cfg, ServerConfigObject *obj) {
+ /* TODO: log files */
- ServerConfigHandler *vserver = calloc(1, sizeof(ServerConfigHandler));
- vserver->init = NULL;
- vserver->element_start = handle_vserver_start;
- vserver->element_end = handle_vserver_end;
- vserver->process_directive = handle_vserver_directive;
+ return 0;
+}
- ucx_map_cstr_put(server_conf_handlers, "VirtualServer", vserver);
+int cfg_handle_authdb(ServerConfiguration *cfg, ServerConfigObject *obj) {
+ /* TODO: authdb*/
-
+ return 0;
}
-/*
- * server.conf handlers
- */
-int handle_runtime_directive(
- ServerConfigHandler *h,
- ServerConfiguration *conf,
- ConfigDirective *dir,
- void *data)
-{
+int cfg_handle_listener(ServerConfiguration *cfg, ServerConfigObject *obj) {
+ ListenerConfig lc;
+ lc.port = 8080;
+ lc.nacceptors = 1;
+
+ lc.name = sstrdub(cfg_directivelist_get_str(
+ obj->directives,
+ sstr("Name")));
+ lc.port = atoi(cfg_directivelist_get_str(
+ obj->directives,
+ sstr("Port")).ptr);
+ lc.vs = sstrdub(cfg_directivelist_get_str(
+ obj->directives,
+ sstr("DefaultVS")));
+ HttpListener *listener = http_listener_new(&lc);
+ listener->default_vs.vs_name = lc.vs.ptr;
+ cfg->listeners = ucx_list_append(cfg->listeners, listener);
+
+ return 0;
+}
+
+int cfg_handle_vs(ServerConfiguration *cfg, ServerConfigObject *obj) {
+ VirtualServer *vs = vs_new();
+
+ vs->name = sstrdub(cfg_directivelist_get_str(
+ obj->directives,
+ sstr("Name")));
+ vs->host = sstrdub(cfg_directivelist_get_str(
+ obj->directives,
+ sstr("Host")));
+ vs->document_root = sstrdub(cfg_directivelist_get_str(
+ obj->directives,
+ sstr("DocRoot")));
+ sstr_t objfile = cfg_directivelist_get_str(
+ obj->directives,
+ sstr("ObjectFile"));
+ sstr_t base = sstr("conf/");
+ sstr_t file;
+ file.length = base.length + objfile.length + 1;
+ file.ptr = alloca(file.length);
+ file.ptr[file.length] = 0;
+ file = sstrncat(2, file, base, objfile);
+
+ ConfigFile *f = cfgmgr_get_file(file);
+ if(f == NULL) {
+ f = malloc(sizeof(ConfigFile));
+ f->file = sstrdub(file);
+ f->reload = object_conf_reload;
+ f->reload(f, cfg);
+ cfgmgr_attach_file(f);
+ }
+ vs->objects = (HTTPObjectConfig*)f->data;
+
+ ucx_map_sstr_put(cfg->host_vs, vs->host, vs);
+
return 0;
}
-void* handle_listener_start(ServerConfigHandler *h, ServerConfiguration *cfg) {
- /* free this in handle_listener_end */
- ListenerConfig *listener = calloc(1, sizeof(ListenerConfig));
- listener->nacceptors = 1;
- listener->port = 0;
- //printf("\n");
- return listener;
-}
-
-int handle_listener_directive(
- ServerConfigHandler *h,
- ServerConfiguration *conf,
- ConfigDirective *dir,
- void *data)
-{
- ListenerConfig *listener = data;
- ConfigParam *param = dir->param->data;
-
- if(!sstrcmp(dir->directive_type, sstr("Name"))) {
- listener->name = sstrdub(param->name);
- //printf("Name %s\n", listener->name.ptr);
- } else if(!sstrcmp(dir->directive_type, sstr("Port"))) {
- listener->port = atoi(param->name.ptr);
- //printf("Port %d\n", listener->port);
- } else if(!sstrcmp(dir->directive_type, sstr("DefaultVS"))) {
- listener->vs = sstrdub(param->name);
- //printf("DefaultVS %s\n", param->name.ptr);
+int object_conf_reload(ConfigFile *file, ServerConfiguration *cfg) {
+ file->data = load_obj_conf(file->file.ptr);
+ struct stat s;
+ if(stat(file->file.ptr, &s) != 0) {
+ perror("object_conf_reload: stat");
+ return -1;
}
-
- return 0;
-}
-
-int handle_listener_end(
- ServerConfigHandler *h,
- ServerConfiguration *conf,
- ConfigDirective *dir,
- void *data)
-{
- //printf("\n\n");
- /* add listener to server configuration */
- ListenerConfig *lc = data;
- HttpListener *listener = http_listener_new(lc);
- listener->default_vs.vs_name = lc->vs.ptr;
- //free(lc);
- conf->listeners = ucx_list_append(conf->listeners, listener);
-
- return 0;
+ file->last_modified = s.st_mtim.tv_sec;
}
-
-void* handle_vserver_start(ServerConfigHandler *h, ServerConfiguration *cfg) {
- //printf("\n");
- VirtualServer *vs = vs_new();
- return vs;
-}
-
-int handle_vserver_directive(
- ServerConfigHandler *h,
- ServerConfiguration *conf,
- ConfigDirective *dir,
- void *data)
-{
- VirtualServer *vs = data;
- ConfigParam *param = dir->param->data;
-
- if(!sstrcmp(dir->directive_type, sstr("Name"))) {
- vs->name = sstrdub(param->name);
- //printf("Name %s\n", vs->name.ptr);
- } else if(!sstrcmp(dir->directive_type, sstr("Host"))) {
- vs->host = sstrdub(param->name);
- //printf("Host %s\n", vs->host.ptr);
- } else if(!sstrcmp(dir->directive_type, sstr("ObjectFile"))) {
- sstr_t base = sstr("conf/");
- sstr_t file;
- file.length = base.length + param->name.length + 1;
- file.ptr = alloca(file.length);
- file.ptr[file.length] = 0;
- file = sstrncat(2, file, base, param->name);
- //printf("ObjectFile %s\n", file.ptr);
-
- vs->objects = load_obj_conf(file.ptr);
-
- } else if(!sstrcmp(dir->directive_type, sstr("DocRoot"))) {
- vs->document_root = sstrdub(param->name);
- }
- // TODO: Listener, ACLFile, DAVFile, DocRoot, ...
-
- return 0;
-}
-
-int handle_vserver_end(
- ServerConfigHandler *h,
- ServerConfiguration *conf,
- ConfigDirective *dir,
- void *data)
-{
- //printf("\n\n");
- VirtualServer *vs = data;
-
- ucx_map_sstr_put(conf->host_vs, vs->host, vs);
-
- return 0;
-}
-
-
HTTPObjectConfig* load_obj_conf(char *file) {
printf("load_obj_conf\n");