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");