src/server/daemon/config.c

changeset 18
73aacbf6e492
parent 17
d2a97bbeb57d
child 19
d680536f8c2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/server/daemon/config.c	Mon Jan 16 14:06:52 2012 +0100
@@ -0,0 +1,274 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2011 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../public/nsapi.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+
+#include "../ucx/string.h"
+
+#include "httplistener.h"
+#include "config.h"
+#include "func.h"
+
+#include "vserver.h"
+#include "../util/pblock.h"
+
+VirtualServer *default_vs;
+
+pool_handle_t *cfg_pool;
+
+// 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");
+
+    InitConfig *cfg = load_init_config("conf/init.conf");
+    if(cfg == NULL) {
+        return;
+    }
+
+    cfg_pool = pool_create(); // one pool for one Configuration
+    UcxDlist *dirs = cfg->directives;
+    while(dirs != NULL) {
+        ConfigDirective *dir = dirs->data;
+
+        /* create NSAPI directive */
+        directive *d = malloc(sizeof(directive));
+        d->param = pblock_create_pool(cfg_pool, 8);
+        UcxList *param = dir->param;
+        while(param != NULL) {
+            ConfigParam *p = param->data;
+            pblock_nvlinsert(
+                    p->name.ptr,
+                    p->name.length,
+                    p->value.ptr,
+                    p->value.length,
+                    d->param);
+            param = param->next;
+        }
+
+        /* get function */
+        char *func_name = pblock_findval("fn", d->param);
+        d->func = get_function(func_name);
+        if(d->func == NULL) {
+            free(d);
+            continue;
+        }
+
+        /* execute init directive */
+        d->func->func(d->param, NULL, NULL);
+
+        dirs = dirs->next;
+    }
+    
+    free_init_config(cfg);
+}
+
+void load_server_conf(char *file) {
+    printf("load_server_conf\n");
+
+    init_default_server_conf_handlers();
+
+    ServerConfig *serverconf = load_server_config("conf/server.conf");
+    if(serverconf == NULL) {
+        fprintf(stderr, "Cannot load server.conf\n");
+    }
+    ServerConfiguration *serverconfig = malloc(sizeof(ServerConfiguration));
+    // TODO: init serverconfig stuff
+
+    /* convert ServerConfig to ServerConfiguration */
+    for(int i=0;i<serverconf->objects->size;i++) {
+        UcxMapElement *elm = &serverconf->objects->map[i];
+        while(elm != NULL) {
+            UcxList *list = elm->data;
+            while(list != NULL) {
+                ServerConfigObject *scfgobj = list->data;
+
+                /* get handler */
+                ServerConfigHandler *handler = ucx_map_sstr_get(
+                        server_conf_handlers,
+                        scfgobj->type);
+                if(handler != NULL) {
+                    /* process the directives */
+                    UcxDlist *dirs = scfgobj->directives;
+                    while(dirs != NULL) {
+                        handler->process_directive(
+                                handler,
+                                serverconfig,
+                                dirs->data);
+                        
+                        dirs = dirs->next;
+                    }
+                }
+
+                list = list->next;
+            }
+            
+            elm = elm->next;
+        }
+    }
+    
+    
+    ListenerConfig *conf = malloc(sizeof(ListenerConfig));
+    conf->port = 9090;
+    conf->nacceptors = 1;
+    conf->name = "default";
+
+    http_listener_new(conf);
+
+    // virtual server
+    default_vs = vs_new();
+    // load obj.conf
+    default_vs->objects = load_obj_conf("conf/obj.conf");
+    default_vs->default_obj_name = "default";
+    
+}
+
+void init_default_server_conf_handlers() {
+    /* create handler map */
+    server_conf_handlers = ucx_map_new(8);
+
+    /* create and add default handlers */
+
+    ServerConfigHandler *runtime = malloc(sizeof(ServerConfigHandler));
+    runtime->init = NULL;
+    runtime->process_directive = handle_runtime_directive;
+
+    ucx_map_cstr_put(server_conf_handlers, "Runtime", runtime);
+}
+
+int handle_runtime_directive(
+        ServerConfigHandler *h,
+        ServerConfiguration *conf,
+        ConfigDirective *dir)
+{
+    
+
+    return 0;
+}
+
+VirtualServer* conf_get_default_vs() {
+    return default_vs;
+}
+
+HTTPObjectConfig* load_obj_conf(char *file) {
+    printf("load_obj_conf\n");
+
+    // new conf function test
+    ObjectConfig *cfg = load_object_config(file);
+    if(cfg == NULL) {
+        return NULL;
+    }
+
+    /* create object config */
+    HTTPObjectConfig *conf = calloc(sizeof(HTTPObjectConfig), 1);
+    conf->pool = cfg_pool;
+
+    /* convert ObjectConfig to HTTPObjectConfig */
+
+    /* add objects */
+    conf->nobj = ucx_dlist_size(cfg->objects);
+    conf->objects = calloc(1, sizeof(httpd_object*));
+    
+    UcxDlist *objlist = cfg->objects;
+    int i = 0;
+    while(objlist != NULL) {
+        ConfigObject *cob = objlist->data;
+
+        /* get name and ppath */
+        char *name = NULL;
+        char *ppath = NULL;
+        if(cob->name.length > 0) {
+            name = sstrdub(cob->name).ptr;
+        }
+        if(cob->ppath.length > 0) {
+            ppath = sstrdub(cob->ppath).ptr;
+        }
+
+        /* create and add object */
+        httpd_object *obj = object_new(name);
+        obj->path = NULL;
+
+        conf->objects[i] = obj;
+
+        /* add directives */
+        for(int i=0;i<6;i++) {
+            UcxDlist *dirs = cob->directives[i];
+            while(dirs != NULL) {
+                ConfigDirective *cfgdir = dirs->data;
+
+                directive *d = malloc(sizeof(directive));
+                d->cond = NULL;
+                d->param = pblock_create_pool(conf->pool, 8);
+
+                /* add params */
+                UcxList *param = cfgdir->param;
+                while(param != NULL) {
+                    ConfigParam *p = param->data;
+                    pblock_nvlinsert(
+                            p->name.ptr,
+                            p->name.length,
+                            p->value.ptr,
+                            p->value.length,
+                            d->param);
+                    param = param->next;
+                }
+
+                /* get function */
+                char *func_name = pblock_findval("fn", d->param);
+                d->func = get_function(func_name);
+
+                dirs = dirs->next;
+
+                /* add function to dtable */
+                object_add_directive(obj, d, cfgdir->type_num);
+            }
+        }
+
+        /* next */
+        i++;
+        objlist = objlist->next;
+    }
+
+    free_object_config(cfg);
+
+    return conf;
+}

mercurial