src/server/daemon/config.c

changeset 19
d680536f8c2f
parent 18
73aacbf6e492
child 20
7b235fa88008
--- 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;i<serverconfig->host_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("<Listener>\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("</Listener>\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("<VirtualServer>\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("</VirtualServer>\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 */
 

mercurial