int AST_walk(tst_t *settings, ast_walk_cb cb) { Pair *n = tst_search(settings, bdata(&DEFAULT_ROOT), blength(&DEFAULT_ROOT)); check(n, "You didn't set a %s variable to say what servers you want.", bdata(&DEFAULT_ROOT)); Value *val = Pair_value(n); check(val->type == VAL_LIST, "servers variable should be a list of server configs to load."); return AST_walk_list(settings, val->as.list, cb); error: return -1; }
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; }