diff -r 73aacbf6e492 -r d680536f8c2f src/server/daemon/config.c --- a/src/server/daemon/config.c Mon Jan 16 14:06:52 2012 +0100 +++ b/src/server/daemon/config.c Sat Jan 21 16:37:35 2012 +0100 @@ -46,8 +46,6 @@ #include "vserver.h" #include "../util/pblock.h" -VirtualServer *default_vs; - pool_handle_t *cfg_pool; // TODO: Funktion für ConfigDirective -> directive @@ -60,7 +58,7 @@ void load_init_conf(char *file) { printf("load_init_conf\n"); - InitConfig *cfg = load_init_config("conf/init.conf"); + InitConfig *cfg = load_init_config(file); if(cfg == NULL) { return; } @@ -102,16 +100,17 @@ free_init_config(cfg); } -void load_server_conf(char *file) { +ServerConfiguration* load_server_conf(char *file) { printf("load_server_conf\n"); - init_default_server_conf_handlers(); - - ServerConfig *serverconf = load_server_config("conf/server.conf"); + ServerConfig *serverconf = load_server_config(file); if(serverconf == NULL) { fprintf(stderr, "Cannot load server.conf\n"); } ServerConfiguration *serverconfig = malloc(sizeof(ServerConfiguration)); + serverconfig->pool = pool_create(); + serverconfig->listeners = NULL; + serverconfig->host_vs = ucx_map_new(16); // TODO: init serverconfig stuff /* convert ServerConfig to ServerConfiguration */ @@ -127,16 +126,32 @@ 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); + dirs->data, + object_data); dirs = dirs->next; } + + if(handler->element_end != NULL) { + handler->element_end( + handler, + serverconfig, + NULL, + object_data); + } } list = list->next; @@ -145,50 +160,194 @@ elm = elm->next; } } - - - ListenerConfig *conf = malloc(sizeof(ListenerConfig)); - conf->port = 9090; - conf->nacceptors = 1; - conf->name = "default"; + + /* set VirtualServer for all listeners */ + UcxList *ls = serverconfig->listeners; + while(ls) { + HttpListener *listener = ls->data; + + sstr_t vsname = sstr(listener->default_vs.vs_name); + + /* search for VirtualServer */ + int b = 0; + for(int i=0;ihost_vs->size;i++) { + UcxMapElement *elm = &serverconfig->host_vs->map[i]; + while(elm != NULL && elm->data != NULL) { + VirtualServer *vs = elm->data; - http_listener_new(conf); + if(!sstrcmp(vsname, vs->name)) { + b = 1; + listener->default_vs.vs = vs; + break; + } - // virtual server - default_vs = vs_new(); - // load obj.conf - default_vs->objects = load_obj_conf("conf/obj.conf"); - default_vs->default_obj_name = "default"; - + elm = elm->next; + } + if(b) { + break; + } + } + + ls = ls->next; + } + + return serverconfig; } -void init_default_server_conf_handlers() { + +void init_server_config_parser() { /* create handler map */ server_conf_handlers = ucx_map_new(8); /* create and add default handlers */ - ServerConfigHandler *runtime = malloc(sizeof(ServerConfigHandler)); + ServerConfigHandler *runtime = calloc(1, sizeof(ServerConfigHandler)); runtime->init = NULL; runtime->process_directive = handle_runtime_directive; ucx_map_cstr_put(server_conf_handlers, "Runtime", runtime); + + + 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; + + ucx_map_cstr_put(server_conf_handlers, "Listener", listener); + + + 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; + + ucx_map_cstr_put(server_conf_handlers, "VirtualServer", vserver); + + } +/* + * server.conf handlers + */ int handle_runtime_directive( ServerConfigHandler *h, ServerConfiguration *conf, - ConfigDirective *dir) + ConfigDirective *dir, + void *data) { return 0; } -VirtualServer* conf_get_default_vs() { - return default_vs; + +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); + } + + 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; } + +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"); @@ -200,7 +359,7 @@ /* create object config */ HTTPObjectConfig *conf = calloc(sizeof(HTTPObjectConfig), 1); - conf->pool = cfg_pool; + conf->pool = pool_create(); /* convert ObjectConfig to HTTPObjectConfig */