src/server/daemon/config.c

changeset 21
627b09ee74e4
parent 20
7b235fa88008
child 25
5dee29c7c530
--- 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("<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);
+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("</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;
+    file->last_modified = s.st_mtim.tv_sec;
 }
 
-
-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");
 

mercurial