}
-int realms_home_server_add(home_server_t *home, CONF_SECTION *cs, int dual)
-{
- CONF_SECTION *parent = NULL;
- const char * name2 = home->name;
-
- /*
- * Make sure that this is set.
- */
- if (home->src_ipaddr.af == AF_UNSPEC) {
- home->src_ipaddr.af = home->ipaddr.af;
- }
-
- hs_srcipaddr = NULL;
-
- if (rbtree_finddata(home_servers_byname, home) != NULL) {
- cf_log_err_cs(cs,
- "Duplicate home server name %s.", name2);
- goto error;
- }
-
- if (!home->server &&
- (rbtree_finddata(home_servers_byaddr, home) != NULL)) {
- cf_log_err_cs(cs,
- "Duplicate home server IP %s.", name2);
- goto error;
- }
-
- if (!rbtree_insert(home_servers_byname, home)) {
- cf_log_err_cs(cs,
- "Internal error %d adding home server %s.",
- __LINE__, name2);
- goto error;
- }
-
- if (!home->server &&
- !rbtree_insert(home_servers_byaddr, home)) {
- rbtree_deletebydata(home_servers_byname, home);
- cf_log_err_cs(cs,
- "Internal error %d adding home server %s.",
- __LINE__, name2);
- goto error;
- }
-
-#ifdef WITH_STATS
- home->number = home_server_max_number++;
- if (!rbtree_insert(home_servers_bynumber, home)) {
- rbtree_deletebydata(home_servers_byname, home);
- if (home->ipaddr.af != AF_UNSPEC) {
- rbtree_deletebydata(home_servers_byname, home);
- }
- cf_log_err_cs(cs,
- "Internal error %d adding home server %s.",
- __LINE__, name2);
- goto error;
- }
-#endif
-
- FR_INTEGER_BOUND_CHECK("max_outstanding", home->max_outstanding, >=, 8);
- FR_INTEGER_BOUND_CHECK("max_outstanding", home->max_outstanding, <=, 65536*16);
-
- FR_INTEGER_BOUND_CHECK("ping_interval", home->ping_interval, >=, 6);
- FR_INTEGER_BOUND_CHECK("ping_interval", home->ping_interval, <=, 120);
-
- FR_TIMEVAL_BOUND_CHECK("response_window", &home->response_window, >=, 0, 1000);
- FR_TIMEVAL_BOUND_CHECK("response_window", &home->response_window, <=, 60, 0);
- FR_TIMEVAL_BOUND_CHECK("response_window", &home->response_window, <=,
- main_config.max_request_time, 0);
-
- /*
- * Track the minimum response window, so that we can
- * correctly set the timers in process.c
- */
- if (timercmp(&main_config.init_delay, &home->response_window, >)) {
- main_config.init_delay = home->response_window;
- }
-
- FR_INTEGER_BOUND_CHECK("zombie_period", home->zombie_period, >=, 1);
- FR_INTEGER_BOUND_CHECK("zombie_period", home->zombie_period, <=, 120);
- FR_INTEGER_BOUND_CHECK("zombie_period", home->zombie_period, >=, (uint32_t) home->response_window.tv_sec);
-
- FR_INTEGER_BOUND_CHECK("num_pings_to_alive", home->num_pings_to_alive, >=, 3);
- FR_INTEGER_BOUND_CHECK("num_pings_to_alive", home->num_pings_to_alive, <=, 10);
-
- FR_INTEGER_BOUND_CHECK("ping_timeout", home->ping_timeout, >=, 3);
- FR_INTEGER_BOUND_CHECK("ping_timeout", home->ping_timeout, <=, 10);
-
- FR_INTEGER_BOUND_CHECK("revive_interval", home->revive_interval, >=, 60);
- FR_INTEGER_BOUND_CHECK("revive_interval", home->revive_interval, <=, 3600);
-
-#ifdef WITH_COA
- FR_INTEGER_BOUND_CHECK("coa_irt", home->coa_irt, >=, 1);
- FR_INTEGER_BOUND_CHECK("coa_irt", home->coa_irt, <=, 5);
-
- FR_INTEGER_BOUND_CHECK("coa_mrc", home->coa_mrc, <=, 20);
-
- FR_INTEGER_BOUND_CHECK("coa_mrt", home->coa_mrt, <=, 30);
-
- FR_INTEGER_BOUND_CHECK("coa_mrd", home->coa_mrd, >=, 5);
- FR_INTEGER_BOUND_CHECK("coa_mrd", home->coa_mrd, <=, 60);
-#endif
-
- FR_INTEGER_BOUND_CHECK("max_connections", home->limit.max_connections, <=, 1024);
-
-#ifdef WITH_TCP
- /*
- * UDP sockets can't be connection limited.
- */
- if (home->proto != IPPROTO_TCP) home->limit.max_connections = 0;
-#endif
-
- if ((home->limit.idle_timeout > 0) && (home->limit.idle_timeout < 5))
- home->limit.idle_timeout = 5;
- if ((home->limit.lifetime > 0) && (home->limit.lifetime < 5))
- home->limit.lifetime = 5;
- if ((home->limit.lifetime > 0) && (home->limit.idle_timeout > home->limit.lifetime))
- home->limit.idle_timeout = 0;
-
- parent = cf_item_parent(cf_sectiontoitem(cs));
- if (parent && strcmp(cf_section_name1(parent), "server") == 0) {
- home->parent_server = cf_section_name2(parent);
- }
-
- if (dual) {
- home_server_t *home2 = talloc(home, home_server_t);
-
- memcpy(home2, home, sizeof(*home2));
-
- home2->type = HOME_TYPE_ACCT;
- home2->port++;
- home2->ping_user_password = NULL;
- home2->cs = cs;
- home2->parent_server = home->parent_server;
-
- if (!rbtree_insert(home_servers_byname, home2)) {
- cf_log_err_cs(cs,
- "Internal error %d adding home server %s.",
- __LINE__, name2);
- free(home2);
- return 0;
- }
-
- if (!home->server &&
- !rbtree_insert(home_servers_byaddr, home2)) {
- rbtree_deletebydata(home_servers_byname, home2);
- cf_log_err_cs(cs,
- "Internal error %d adding home server %s.",
- __LINE__, name2);
- free(home2);
- return 0;
- }
-
-#ifdef WITH_STATS
- home2->number = home_server_max_number++;
- if (!rbtree_insert(home_servers_bynumber, home2)) {
- rbtree_deletebydata(home_servers_byname, home2);
- if (!home2->server) {
- rbtree_deletebydata(home_servers_byname, home2);
- }
- cf_log_err_cs(cs,
- "Internal error %d adding home server %s.",
- __LINE__, name2);
- free(home2);
- return 0;
- }
-#endif
- }
-
- return 1;
- error:
- return 0;
-}
-
-
static int home_server_add(realm_config_t *rc, CONF_SECTION *cs)
{
char const *name2;
#endif
-int realms_realm_add (REALM *r, CONF_SECTION *cs)
-{
- #ifdef HAVE_REGEX_H
- /*
- * It's a regex. Add it to a separate list.
- */
- if (r->name[0] == '~') {
- realm_regex_t *rr, **last;
-
- rr = rad_malloc(sizeof(*rr));
-
- last = &realms_regex;
- while (*last) last = &((*last)->next); /* O(N^2)... sue me. */
-
- rr->realm = r;
- rr->next = NULL;
-
- *last = rr;
-
- return 1;
- }
-#endif
-
- if (!rbtree_insert(realms_byname, r)) {
- rad_assert("Internal sanity check failed");
- return 0;
- }
-
- return 1;
-}
-
-
static int realm_add(realm_config_t *rc, CONF_SECTION *cs)
{
char const *name2;