/* * free the memory used by a starter_config_t object */ void confread_free(starter_config_t *cfg) { starter_conn_t *conn = cfg->conn_first; starter_ca_t *ca = cfg->ca_first; free_args(KW_SETUP_FIRST, KW_SETUP_LAST, (char *)cfg); confread_free_conn(&cfg->conn_default); while (conn != NULL) { starter_conn_t *conn_aux = conn; conn = conn->next; confread_free_conn(conn_aux); free(conn_aux); } confread_free_ca(&cfg->ca_default); while (ca != NULL) { starter_ca_t *ca_aux = ca; ca = ca->next; confread_free_ca(ca_aux); free(ca_aux); } free(cfg); }
void confread_free(struct starter_config *cfg) { int i; struct starter_conn *conn, *c; FREE_LIST(cfg->setup.interfaces); pfreeany(cfg->setup.virtual_private); pfreeany(cfg->setup.listen); for(i=0 ;i<KSF_MAX; i++) { pfreeany(cfg->setup.strings[i]); } confread_free_conn(&(cfg->conn_default)); for(conn = cfg->conns.tqh_first; conn != NULL; ) { c = conn; conn = conn->link.tqe_next; confread_free_conn(c); pfree(c); } pfree(cfg); }
void confread_free(struct starter_config *cfg) { FREE_LIST(cfg->setup.interfaces); pfree(cfg->ctlbase); int i; for (i = 0; i < KSF_MAX; i++) pfreeany(cfg->setup.strings[i]); confread_free_conn(&cfg->conn_default); struct starter_conn *conn; for (conn = cfg->conns.tqh_first; conn != NULL; ) { struct starter_conn *c = conn; conn = conn->link.tqe_next; confread_free_conn(c); pfree(c); } pfree(cfg); }
/* * load and parse an IPsec configuration file */ starter_config_t* confread_load(const char *file) { starter_config_t *cfg = NULL; config_parsed_t *cfgp; section_list_t *sconn, *sca; starter_conn_t *conn; starter_ca_t *ca; u_int total_err; u_int visit = 0; /* load IPSec configuration file */ cfgp = parser_load_conf(file); if (!cfgp) { return NULL; } cfg = malloc_thing(starter_config_t); /* set default values */ default_values(cfg); /* load config setup section */ load_setup(cfg, cfgp); /* in the first round parse also statements */ cfg->parse_also = TRUE; /* find %default ca section */ for (sca = cfgp->ca_first; sca; sca = sca->next) { if (streq(sca->name, "%default")) { DBG2(DBG_APP, "Loading ca %%default"); load_ca(&cfg->ca_default, sca->kw, cfg); } } /* parameters defined in ca %default sections can be overloads */ cfg->ca_default.seen = SEEN_NONE; /* load other ca sections */ for (sca = cfgp->ca_first; sca; sca = sca->next) { u_int previous_err; /* skip %default ca section */ if (streq(sca->name, "%default")) continue; DBG2(DBG_APP, "Loading ca '%s'", sca->name); ca = malloc_thing(starter_ca_t); ca_default(sca->name, ca, &cfg->ca_default); ca->kw = sca->kw; ca->next = NULL; previous_err = cfg->err; load_ca(ca, ca->kw, cfg); if (cfg->err > previous_err) { /* errors occurred - free the ca */ confread_free_ca(ca); cfg->non_fatal_err += cfg->err - previous_err; cfg->err = previous_err; } else { /* success - insert the ca into the chained list */ if (cfg->ca_last) cfg->ca_last->next = ca; cfg->ca_last = ca; if (!cfg->ca_first) cfg->ca_first = ca; } } for (ca = cfg->ca_first; ca; ca = ca->next) { also_t *also = ca->also; while (also != NULL) { kw_list_t *kw = find_also_ca(also->name, cfg->ca_first, cfg); load_ca(ca, kw, cfg); also = also->next; } if (ca->startup != STARTUP_NO) ca->state = STATE_TO_ADD; } /* find %default conn sections */ for (sconn = cfgp->conn_first; sconn; sconn = sconn->next) { if (streq(sconn->name, "%default")) { DBG2(DBG_APP, "Loading conn %%default"); load_conn(&cfg->conn_default, sconn->kw, cfg); } } /* parameters defined in conn %default sections can be overloaded */ cfg->conn_default.seen = SEEN_NONE; cfg->conn_default.right.seen = SEEN_NONE; cfg->conn_default.left.seen = SEEN_NONE; /* load other conn sections */ for (sconn = cfgp->conn_first; sconn; sconn = sconn->next) { u_int previous_err; /* skip %default conn section */ if (streq(sconn->name, "%default")) continue; DBG2(DBG_APP, "Loading conn '%s'", sconn->name); conn = malloc_thing(starter_conn_t); conn_default(sconn->name, conn, &cfg->conn_default); conn->kw = sconn->kw; conn->next = NULL; previous_err = cfg->err; load_conn(conn, conn->kw, cfg); if (cfg->err > previous_err) { /* error occurred - free the conn */ confread_free_conn(conn); cfg->non_fatal_err += cfg->err - previous_err; cfg->err = previous_err; } else { /* success - insert the conn into the chained list */ if (cfg->conn_last) cfg->conn_last->next = conn; cfg->conn_last = conn; if (!cfg->conn_first) cfg->conn_first = conn; } } /* in the second round do not parse also statements */ cfg->parse_also = FALSE; for (ca = cfg->ca_first; ca; ca = ca->next) { ca->visit = ++visit; load_also_cas(ca, ca->also, cfg); if (ca->startup != STARTUP_NO) ca->state = STATE_TO_ADD; } for (conn = cfg->conn_first; conn; conn = conn->next) { conn->visit = ++visit; load_also_conns(conn, conn->also, cfg); if (conn->startup != STARTUP_NO) conn->state = STATE_TO_ADD; } parser_free_conf(cfgp); total_err = cfg->err + cfg->non_fatal_err; if (total_err > 0) { DBG1(DBG_APP, "### %d parsing error%s (%d fatal) ###", total_err, (total_err > 1)?"s":"", cfg->err); } return cfg; }