#include <stdio.h>
#include <stdlib.h>
#include "../public/nsapi.h"
#include <ucx/string.h>
#include "httplistener.h"
#include "log.h"
#include "configmanager.h"
static ServerConfiguration *current_config =
NULL;
static time_t sc_last_modified =
0;
static UcxMap *config_files;
static conf_global_vars_s global_vars;
void init_configuration_manager() {
init_server_config_parser();
config_files = ucx_map_new(
16);
}
NSAPI_PUBLIC conf_global_vars_s* conf_getglobals() {
return &global_vars;
}
void cfgmgr_attach_file(ConfigFile *cf) {
ucx_map_sstr_put(config_files, cf->file, cf);
}
ConfigFile* cfgmgr_get_file(
sstr_t name) {
return ucx_map_sstr_get(config_files, name);
}
int cfgmgr_reload_file(ConfigFile *f, ServerConfiguration *conf,
int *reload) {
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_mtime) {
if(f->last_modified !=
0) {
log_ereport(
LOG_INFORM,
"reload configuration file: %s",
f->file.ptr);
}
if(f->reload(f, conf)) {
return -
1;
}
f->last_modified = s.st_mtime;
if(reload) {
*reload =
1;
}
}
return 0;
}
int cfgmgr_load_config(ServerConfiguration **set_cfg) {
int cfgreload =
0;
UcxMapIterator iter = ucx_map_iterator(config_files);
ConfigFile *f;
UCX_MAP_FOREACH(key, f, iter) {
if(cfgmgr_reload_file(f, current_config, &cfgreload) == -
1) {
return -
1;
}
}
struct stat s;
if(stat(
"config/server.conf", &s) !=
0) {
perror(
"stat(\"config/server.conf\")");
return -
1;
}
ServerConfiguration *config;
if(cfgreload || !current_config || sc_last_modified != s.st_mtime) {
config = load_server_conf(
current_config,
"config/server.conf");
if(config ==
NULL) {
return -
1;
}
sc_last_modified = s.st_mtime;
}
else {
log_ereport(
LOG_VERBOSE,
"no reconfig required");
config = current_config;
}
if(set_cfg) {
*set_cfg = config;
}
ServerConfiguration *old_conf =
NULL;
if(current_config != config) {
old_conf = current_config;
}
current_config = config;
if(old_conf) {
cfg_unref(old_conf);
}
return 0;
}
ServerConfiguration *cfgmgr_get_server_config() {
return current_config;
}