src/server/daemon/config.c

changeset 36
450d2d5f4735
parent 33
96dbfe4f91e5
child 37
360b9aabe17e
--- a/src/server/daemon/config.c	Sat Aug 18 11:39:34 2012 +0200
+++ b/src/server/daemon/config.c	Sat Oct 06 13:00:07 2012 +0200
@@ -38,6 +38,7 @@
 #include <sys/mman.h>
 
 #include "../ucx/string.h"
+#include "../ucx/atomic.h"
 
 #include "httplistener.h"
 #include "config.h"
@@ -111,6 +112,7 @@
         fprintf(stderr, "Cannot load server.conf\n");
     }
     ServerConfiguration *serverconfig = malloc(sizeof(ServerConfiguration));
+    serverconfig->ref = 1;
     serverconfig->pool = pool_create();
     serverconfig->listeners = NULL;
     serverconfig->host_vs = ucx_map_new(16);
@@ -184,29 +186,30 @@
         cfg_handle_vs(serverconfig, scfgobj);
     }
 
-    /* check event handler config */
+    // check event handler config
     if(check_event_handler_cfg() != 0) {
         /* critical error */
         return NULL;
     }
     
-    /* check thread pool config */
+    // check thread pool config
     if(check_thread_pool_cfg() != 0) {
         /* critical error */
         return NULL;
     }
 
-    /* set VirtualServer for all listeners */
+    // 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;
+        // search for VirtualServer
+        //int b = 0;
         UcxMapIterator iter = ucx_map_iterator(serverconfig->host_vs);
-        UCX_MAP_FOREACH(VirtualServer*, vs, serverconfig->host_vs, iter) {
+        VirtualServer *vs;
+        UCX_MAP_FOREACH(vs, iter) {
             if(!sstrcmp(vsname, vs->name)) {
                 listener->default_vs.vs = vs;
                 break;
@@ -219,16 +222,27 @@
     return serverconfig;
 }
 
+void cfg_ref(ServerConfiguration *cfg) {
+    ucx_atomic_inc_32(&cfg->ref);
+}
+
+void cfg_unref(ServerConfiguration *cfg) {
+    uint32_t ref = ucx_atomic_dec_32_nv(&cfg->ref);
+    if(ref == 0) {
+        // TODO: free configuration
+    }
+}
+
 
 void init_server_config_parser() {
     
 }
 
 int cfg_handle_runtime(ServerConfiguration *cfg, ServerConfigObject *obj) {
-    cfg->user = sstrdub(cfg_directivelist_get_str(
+    cfg->user = sstrdup(cfg_directivelist_get_str(
             obj->directives,
             sstr("User")));
-    cfg->tmp = sstrdub(cfg_directivelist_get_str(
+    cfg->tmp = sstrdup(cfg_directivelist_get_str(
             obj->directives,
             sstr("Temp")));
 
@@ -246,7 +260,7 @@
     
     LogConfig logcfg;
     logcfg.file = sstrdup(file).ptr;
-    logcfg.level = sstrdub(lvl).ptr;
+    logcfg.level = sstrdup(lvl).ptr;
     /* TODO: stdout, stderr config */
     
     int ret = init_log_file(&logcfg);
@@ -289,21 +303,23 @@
 
 int cfg_handle_listener(ServerConfiguration *cfg, ServerConfigObject *obj) {
     ListenerConfig lc;
+    lc.cfg = cfg;
     lc.port = 8080;
     lc.nacceptors = 1;
-
-    lc.name = sstrdub(cfg_directivelist_get_str(
+    
+    // TODO: use sstrdup_pool?
+    lc.name = sstrdup(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(
+    lc.vs = sstrdup(cfg_directivelist_get_str(
             obj->directives,
             sstr("DefaultVS")));
     
 
-    HttpListener *listener = http_listener_new(&lc);
+    HttpListener *listener = http_listener_create(&lc);
     listener->default_vs.vs_name = lc.vs.ptr;
     cfg->listeners = ucx_list_append(cfg->listeners, listener); 
 
@@ -313,13 +329,13 @@
 int cfg_handle_vs(ServerConfiguration *cfg, ServerConfigObject *obj) {
     VirtualServer *vs = vs_new();
 
-    vs->name = sstrdub(cfg_directivelist_get_str(
+    vs->name = sstrdup(cfg_directivelist_get_str(
             obj->directives,
             sstr("Name")));
-    vs->host = sstrdub(cfg_directivelist_get_str(
+    vs->host = sstrdup(cfg_directivelist_get_str(
             obj->directives,
             sstr("Host")));
-    vs->document_root = sstrdub(cfg_directivelist_get_str(
+    vs->document_root = sstrdup(cfg_directivelist_get_str(
             obj->directives,
             sstr("DocRoot")));
     sstr_t objfile = cfg_directivelist_get_str(
@@ -335,12 +351,13 @@
     ConfigFile *f = cfgmgr_get_file(file);
     if(f == NULL) {
         f = malloc(sizeof(ConfigFile));
-        f->file = sstrdub(file);
+        f->file = sstrdup(file);
         f->reload = object_conf_reload;
         f->reload(f, cfg);
         cfgmgr_attach_file(f);
     }
-    vs->objects = (HTTPObjectConfig*)f->data;
+    vs->objectfile = sstrdup(file); // TODO: pool
+    vs->objects = (HTTPObjectConfig*)f->data; // TODO: ref
 
     ucx_map_sstr_put(cfg->host_vs, vs->host, vs);
     
@@ -387,10 +404,10 @@
         char *name = NULL;
         char *ppath = NULL;
         if(cob->name.length > 0) {
-            name = sstrdub(cob->name).ptr;
+            name = sstrdup(cob->name).ptr;
         }
         if(cob->ppath.length > 0) {
-            ppath = sstrdub(cob->ppath).ptr;
+            ppath = sstrdup(cob->ppath).ptr;
         }
 
         /* create and add object */

mercurial