3 #include <radsec/radsec.h>
4 #include <radsec/radsec-impl.h>
7 # example of client config
9 type = "UDP|TCP|TLS|DTLS"
14 timeout = INT /* optional */
15 tries = INT /* optional */
21 rs_context_read_config(struct rs_context *ctx, const char *config_file)
23 #warning "Missing some error handling in rs_context_config_read()"
24 cfg_opt_t server_opts[] =
26 CFG_STR ("hostname", NULL, CFGF_NONE),
27 CFG_STR ("service", "radius", CFGF_NONE),
28 CFG_STR ("secret", NULL, CFGF_NONE),
29 CFG_INT ("timeout", 3, CFGF_NONE),
30 CFG_INT ("tries", 1, CFGF_NONE),
33 cfg_opt_t config_opts[] =
35 CFG_STR ("type", "UDP", CFGF_NONE),
36 CFG_SEC ("server", server_opts, CFGF_MULTI),
41 CFG_SEC ("config", config_opts, CFGF_TITLE | CFGF_MULTI),
44 cfg_t *cfg, *cfg_config, *cfg_server;
47 cfg = cfg_init (opts, CFGF_NONE);
48 if (cfg_parse (cfg, config_file) == CFG_PARSE_ERROR)
49 return rs_err_ctx_push (ctx, RSE_CONFIG, "%s: invalid configuration file",
51 for (i = 0; i < cfg_size (cfg, "config"); i++)
53 struct rs_realm *r = rs_malloc (ctx, sizeof(*r));
55 enum rs_conn_type type;
58 return rs_err_ctx_push_fl (ctx, RSE_NOMEM, __FILE__, __LINE__, NULL);
59 memset (r, 0, sizeof(*r));
61 ctx->realms->next = r;
64 cfg_config = cfg_getnsec (cfg, "config", i);
65 r->name = strdup (cfg_title (cfg_config));
66 typestr = cfg_getstr (cfg_config, "type");
67 if (!strcmp (typestr, "UDP"))
68 type = RS_CONN_TYPE_UDP;
69 else if (!strcmp (typestr, "TCP"))
70 type = RS_CONN_TYPE_TCP;
71 else if (!strcmp (typestr, "TLS"))
72 type = RS_CONN_TYPE_TLS;
73 else if (!strcmp (typestr, "DTLS"))
74 type = RS_CONN_TYPE_DTLS;
76 return rs_err_ctx_push_fl (ctx, RSE_CONFIG, __FILE__, __LINE__,
77 "%s: invalid connection type", typestr);
78 for (j = 0; j < cfg_size (cfg_config, "server"); j++)
80 struct rs_peer *p = _rs_peer_create (ctx, &r->peers);
82 return rs_err_ctx_push_fl (ctx, RSE_NOMEM, __FILE__, __LINE__,
85 cfg_server = cfg_getnsec (cfg_config, "server", j);
86 _rs_resolv (&p->addr, type, cfg_getstr (cfg_server, "hostname"),
87 cfg_getstr (cfg_server, "service"));
88 p->secret = strdup (cfg_getstr (cfg_server, "secret"));
89 p->timeout = cfg_getint (cfg_server, "timeout");
90 p->tries = cfg_getint (cfg_server, "tries");
97 *rs_conf_find_realm(struct rs_context *ctx, const char *name)
101 for (r = ctx->realms; r; r = r->next)
102 if (!strcmp (r->name, name))