3 #include <radsec/radsec.h>
4 #include <radsec/radsec-impl.h>
13 timeout = INT /* optional */
14 tries = INT /* optional */
20 rs_context_read_config(struct rs_handle *ctx, const char *config_file)
22 #warning "Missing some error handling in rs_context_config_read()"
23 cfg_opt_t server_opts[] =
25 CFG_STR ("hostname", NULL, CFGF_NONE),
26 CFG_STR ("service", "radius", CFGF_NONE),
27 CFG_STR ("secret", NULL, CFGF_NONE),
28 CFG_INT ("timeout", 3, CFGF_NONE),
29 CFG_INT ("tries", 1, CFGF_NONE),
32 cfg_opt_t realm_opts[] =
34 CFG_STR ("type", "UDP", CFGF_NONE),
35 CFG_SEC ("server", server_opts, CFGF_MULTI),
40 CFG_SEC ("realm", realm_opts, CFGF_TITLE | CFGF_MULTI),
43 cfg_t *cfg, *cfg_realm, *cfg_server;
46 cfg = cfg_init (opts, CFGF_NONE);
47 if (cfg_parse (cfg, config_file) == CFG_PARSE_ERROR)
48 return rs_err_ctx_push (ctx, RSE_CONFIG, "%s: invalid configuration file",
50 for (i = 0; i < cfg_size (cfg, "realm"); i++)
52 struct rs_realm *r = rs_malloc (ctx, sizeof(*r));
54 enum rs_conn_type type;
57 return rs_err_ctx_push_fl (ctx, RSE_NOMEM, __FILE__, __LINE__, NULL);
58 memset (r, 0, sizeof(*r));
60 ctx->realms->next = r;
63 cfg_realm = cfg_getnsec (cfg, "realm", i);
64 r->name = strdup (cfg_title (cfg_realm));
65 typestr = cfg_getstr (cfg_realm, "type");
66 if (!strcmp (typestr, "UDP"))
67 type = RS_CONN_TYPE_UDP;
68 else if (!strcmp (typestr, "TCP"))
69 type = RS_CONN_TYPE_TCP;
70 else if (!strcmp (typestr, "TLS"))
71 type = RS_CONN_TYPE_TLS;
72 else if (!strcmp (typestr, "DTLS"))
73 type = RS_CONN_TYPE_DTLS;
75 return rs_err_ctx_push_fl (ctx, RSE_CONFIG, __FILE__, __LINE__,
76 "%s: invalid connection type", typestr);
77 for (j = 0; j < cfg_size (cfg_realm, "server"); j++)
79 struct rs_peer *p = _rs_peer_create (ctx, &r->peers);
81 return rs_err_ctx_push_fl (ctx, RSE_NOMEM, __FILE__, __LINE__,
84 cfg_server = cfg_getnsec (cfg_realm, "server", j);
85 _rs_resolv (&p->addr, type, cfg_getstr (cfg_server, "hostname"),
86 cfg_getstr (cfg_server, "service"));
87 p->secret = strdup (cfg_getstr (cfg_server, "secret"));
88 p->timeout = cfg_getint (cfg_server, "timeout");
89 p->tries = cfg_getint (cfg_server, "tries");
96 *rs_conf_find_realm(struct rs_handle *ctx, const char *name)
100 for (r = ctx->realms; r; r = r->next)
101 if (!strcmp (r->name, name))