diff -r 7b235fa88008 -r 627b09ee74e4 src/server/daemon/configmanager.c --- 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;isize;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; }