src/server/daemon/configmanager.c

changeset 21
627b09ee74e4
parent 19
d680536f8c2f
child 25
5dee29c7c530
--- a/src/server/daemon/configmanager.c	Sat Jan 28 16:01:07 2012 +0100
+++ b/src/server/daemon/configmanager.c	Mon Feb 13 13:49:49 2012 +0100
@@ -34,19 +34,89 @@
 #include "configmanager.h"
 
 ServerConfiguration *current_config = NULL;
+time_t sc_last_modified = 0;
+
+UcxMap *config_files;
 
 void init_configuration_manager() {
     /* init parser */
     init_server_config_parser();
+
+    config_files = ucx_map_new(16);
+}
+
+void cfgmgr_attach_file(ConfigFile *cf) {
+    ucx_map_sstr_put(config_files, cf->file, cf);
+}
+
+ConfigFile* cfgmgr_get_file(sstr_t name) {
+    ucx_map_sstr_get(config_files, name);
 }
 
 int cfgmgr_load_config() {
-    ServerConfiguration *config = load_server_conf("conf/server.conf");
-    if(config == NULL) {
-        fprintf(stderr, "Cannot load server.conf\n");
+    int cfgreload = 0;
+    /* check config files */
+    for(int i=0;i<config_files->size;i++) {
+        UcxMapElement *elm = &config_files->map[i];
+        while(elm != NULL) {
+            /*check file */
+            ConfigFile *f = elm->data;
+
+            if(f != NULL) {
+                struct stat s;
+                if(stat(f->file.ptr, &s) != 0) {
+                    fprintf(
+                            stderr,
+                            "Error: Cannot get stat of file %s\n", f->file.ptr);
+                    perror("cfgmgr_load_config: stat");
+                    return -1;
+                }
+
+                if(f->last_modified != s.st_mtim.tv_sec) {
+                    /* reload the file */
+                    f->reload(f, current_config);
+                    cfgreload = 1;
+                }
+            }
+
+            elm = elm->next;
+        }
+    }
+
+    struct stat s;
+    if(stat("conf/server.conf", &s) != 0) {
+        perror("stat(\"conf/server.conf\")");
         return -1;
     }
 
+    ServerConfiguration *config;
+    if(sc_last_modified != s.st_mtim.tv_sec) {
+        config = load_server_conf(
+            current_config,
+            "conf/server.conf");
+
+        if(config == NULL) {
+            fprintf(stderr, "Cannot load server.conf\n");
+            return -1;
+        }
+    } else if(cfgreload) {
+        /* copy configuration */
+
+        /* TODO: copy */
+        config = load_server_conf(
+            current_config,
+            "conf/server.conf");
+
+        if(config == NULL) {
+            fprintf(stderr, "Cannot load server.conf\n");
+            return -1;
+        }
+
+    } else {
+        config = current_config;
+    }
+
+
     current_config = config;
     return 0;
 }

mercurial