Rename struct rs_handle --> rs_context.
[radsecproxy.git] / lib / conf.c
1 #include <confuse.h>
2 #include <string.h>
3 #include <radsec/radsec.h>
4 #include <radsec/radsec-impl.h>
5
6 #if 0
7   # example of client config
8   config NAME {
9       type = "UDP|TCP|TLS|DTLS"
10       server {
11           hostname = STRING
12           service = STRING
13           secret = STRING
14           timeout = INT         /* optional */
15           tries = INT           /* optional */
16       }
17   }
18 #endif
19
20 int
21 rs_context_read_config(struct rs_context *ctx, const char *config_file)
22 {
23 #warning "Missing some error handling in rs_context_config_read()"
24   cfg_opt_t server_opts[] =
25     {
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),
31       CFG_END ()
32     };
33   cfg_opt_t config_opts[] =
34     {
35       CFG_STR ("type", "UDP", CFGF_NONE),
36       CFG_SEC ("server", server_opts, CFGF_MULTI),
37       CFG_END ()
38     };
39   cfg_opt_t opts[] =
40     {
41       CFG_SEC ("config", config_opts, CFGF_TITLE | CFGF_MULTI),
42       CFG_END ()
43     };
44   cfg_t *cfg, *cfg_config, *cfg_server;
45   int i, j;
46
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",
50                             config_file);
51   for (i = 0; i < cfg_size (cfg, "config"); i++)
52     {
53       struct rs_realm *r = rs_malloc (ctx, sizeof(*r));
54       const char *typestr;
55       enum rs_conn_type type;
56
57       if (!r)
58         return rs_err_ctx_push_fl (ctx, RSE_NOMEM, __FILE__, __LINE__, NULL);
59       memset (r, 0, sizeof(*r));
60       if (ctx->realms)
61         ctx->realms->next = r;
62       else
63         ctx->realms = 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;
75       else
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++)
79         {
80           struct rs_peer *p = _rs_peer_create (ctx, &r->peers);
81           if (!p)
82             return rs_err_ctx_push_fl (ctx, RSE_NOMEM, __FILE__, __LINE__,
83                                        NULL);
84
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");
91         }
92     }
93   return RSE_OK;
94 }
95
96 struct rs_realm
97 *rs_conf_find_realm(struct rs_context *ctx, const char *name)
98 {
99   struct rs_realm *r;
100
101   for (r = ctx->realms; r; r = r->next)
102     if (!strcmp (r->name, name))
103         return r;
104   return NULL;
105 }