int Host_load(tst_t *settings, Value *val) { CONFIRM_TYPE("Host"); Class *cls = val->as.cls; char *sql = NULL; struct tagbstring ROUTES_VAR = bsStatic("routes"); const char *name = AST_str(settings, cls->params, "name", VAL_QSTRING); check(name, "No name set for Host."); sql = sqlite3_mprintf(bdata(&HOST_SQL), SERVER_ID, name, name); int rc = DB_exec(sql, NULL, NULL); check(rc == 0, "Failed to store Host: %s", name); cls->id = HOST_ID = DB_lastid(); Value *routes = AST_get(settings, cls->params, &ROUTES_VAR, VAL_HASH); check(routes, "Didn't find any routes for %s", name); AST_walk_hash(settings, routes, Route_load); sqlite3_free(sql); return 0; error: if(sql) sqlite3_free(sql); return -1; }
int Config_load(const char *config_file, const char *db_file) { int rc = 0; tst_t *settings = NULL; struct tagbstring SETTINGS_VAR = bsStatic("settings"); struct tagbstring MIMETYPES_VAR = bsStatic("mimetypes"); settings = Parse_config_file(config_file); check(settings != NULL, "Error parsing config file: %s.", config_file); rc = Config_setup(db_file); check(rc == 0, "Failed to configure config db: %s", db_file); rc = AST_walk(settings, Server_load); check(rc == 0, "Failed to process the config file: %s", config_file); Value *set = AST_get(settings, settings, &SETTINGS_VAR, VAL_HASH); if(set) { rc = AST_walk_hash(settings, set, Settings_load); check(rc == 0, "Failed to load the settings. Aborting."); } rc = Mimetypes_import(); check(rc == 0, "Failed to import default mimetypes."); Value *mime = AST_get(settings, settings, &MIMETYPES_VAR, VAL_HASH); if(mime) { AST_walk_hash(settings, mime, Mimetypes_load); check(rc == 0, "Failed to load the mimetypes. Aborting."); } rc = Config_commit(); check(rc == 0, "Failed to commit config db: %s", db_file); AST_destroy(settings); DB_close(); return 0; error: AST_destroy(settings); DB_close(); return -1; }
bstring AST_get_bstr(tst_t *settings, tst_t *fr, bstring name, ValueType type) { Value *val = AST_get(settings, fr, name, type); check(val != NULL, "The server is missing the '%s' variable.", bdata(name)); return val->as.string->data; error: return NULL; }
int Server_load(tst_t *settings, Value *val) { CONFIRM_TYPE("Server"); Class *cls = val->as.cls; int rc = 0; char *sql = NULL; struct tagbstring HOSTS_VAR = bsStatic("hosts"); const char *bind_addr = NULL; if(tst_search(cls->params, bdata(&BIND_ADDR), blength(&BIND_ADDR))) { bind_addr = AST_str(settings, cls->params, "bind_addr", VAL_QSTRING); } else { bind_addr = "0.0.0.0"; } sql = sqlite3_mprintf(bdata(&SERVER_SQL), AST_str(settings, cls->params, "uuid", VAL_QSTRING), AST_str(settings, cls->params, "access_log", VAL_QSTRING), AST_str(settings, cls->params, "error_log", VAL_QSTRING), AST_str(settings, cls->params, "pid_file", VAL_QSTRING), AST_str(settings, cls->params, "chroot", VAL_QSTRING), AST_str(settings, cls->params, "default_host", VAL_QSTRING), AST_str(settings, cls->params, "name", VAL_QSTRING), bind_addr, AST_str(settings, cls->params, "port", VAL_NUMBER)); rc = DB_exec(sql, NULL, NULL); check(rc == 0, "Failed to exec SQL: %s", sql); cls->id = SERVER_ID = DB_lastid(); Value *hosts = AST_get(settings, cls->params, &HOSTS_VAR, VAL_LIST); check(hosts != NULL, "Could not find Server.hosts setting in host %s:%s", AST_str(settings, cls->params, "uuid", VAL_QSTRING), AST_str(settings, cls->params, "name", VAL_QSTRING)); AST_walk_list(settings, hosts->as.list, Host_load); sqlite3_free(sql); return 0; error: if(sql) sqlite3_free(sql); return -1; }