summaryrefslogtreecommitdiff
path: root/lib/radsec.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/radsec.c')
-rw-r--r--lib/radsec.c111
1 files changed, 64 insertions, 47 deletions
diff --git a/lib/radsec.c b/lib/radsec.c
index a05a22b..6ff047d 100644
--- a/lib/radsec.c
+++ b/lib/radsec.c
@@ -28,14 +28,9 @@
/* Public functions. */
int
-rs_context_create (struct rs_context **ctx, const char *dict)
+rs_context_create (struct rs_context **ctx)
{
- int err = RSE_OK;
struct rs_context *h;
- char *buf1 = NULL, *buf2 = NULL;
- char *dir, *fn;
-
- assert (dict);
if (ctx)
*ctx = NULL;
@@ -43,26 +38,6 @@ rs_context_create (struct rs_context **ctx, const char *dict)
if (!h)
return RSE_NOMEM;
- /* Initialize freeradius dictionary. */
- buf1 = malloc (strlen (dict) + 1);
- buf2 = malloc (strlen (dict) + 1);
- if (!buf1 || !buf2)
- {
- err = RSE_NOMEM;
- goto err_out;
- }
- strcpy (buf1, dict);
- dir = dirname (buf1);
- strcpy (buf2, dict);
- fn = basename (buf2);
- if (dict_init (dir, fn) < 0)
- {
- err = RSE_FR;
- goto err_out;
- }
- free (buf1);
- free (buf2);
-
#if defined (RS_ENABLE_TLS)
ssl_init ();
#endif
@@ -80,15 +55,48 @@ rs_context_create (struct rs_context **ctx, const char *dict)
*ctx = h;
return RSE_OK;
+}
- err_out:
- if (buf1)
- free (buf1);
- if (buf2)
- free (buf2);
- if (h)
- free (h);
- return err;
+/** Initialize freeradius dictionary. */
+int
+rs_context_init_freeradius_dict (struct rs_context *ctx, const char *dict)
+{
+ int r = RSE_OK;
+ size_t dictlen;
+ char *dir = NULL;
+ char *fn = NULL;
+
+ if (dict == NULL)
+ if (ctx->config != NULL)
+ dict = ctx->config->dictionary;
+
+ if (dict == NULL)
+ return rs_err_ctx_push_fl (ctx, RSE_INVAL, __FILE__, __LINE__,
+ "missing dictionary");
+
+ dictlen = strlen (dict);
+ dir = rs_calloc (ctx, 1, dictlen + 1);
+ fn = rs_calloc (ctx, 1, dictlen + 1);
+ if (dir == NULL || fn == NULL)
+ {
+ r = rs_err_ctx_push_fl (ctx, RSE_NOMEM, __FILE__, __LINE__, NULL);
+ goto out;
+ }
+ strncpy (dir, dict, dictlen);
+ strncpy (fn, dict, dictlen);
+
+ if (dict_init (dirname (dir), basename (fn)) < 0)
+ {
+ r = rs_err_ctx_push_fl (ctx, RSE_FR, __FILE__, __LINE__, "dict_init");
+ goto out;
+ }
+
+ out:
+ if (dir)
+ rs_free (ctx, dir);
+ if (fn)
+ rs_free (ctx, fn);
+ return r;
}
struct rs_error * /* FIXME: Return int as all the others? */
@@ -137,25 +145,34 @@ rs_context_destroy (struct rs_context *ctx)
struct rs_realm *r = NULL;
struct rs_peer *p = NULL;
- for (r = ctx->realms; r; )
+ if (ctx->config)
{
- struct rs_realm *tmp = r;
- for (p = r->peers; p; )
+ for (r = ctx->config->realms; r; )
{
- struct rs_peer *tmp = p;
- if (p->addr)
- evutil_freeaddrinfo (p->addr);
- p = p->next;
+ struct rs_realm *tmp = r;
+ for (p = r->peers; p; )
+ {
+ struct rs_peer *tmp = p;
+ if (p->addr)
+ evutil_freeaddrinfo (p->addr);
+ p = p->next;
+ rs_free (ctx, tmp);
+ }
+ rs_free (ctx, r->name); /* FIXME: Stop freeing once we stop strdup in rs_context_read_config(). */
+ r = r->next;
rs_free (ctx, tmp);
}
- rs_free (ctx, r->name);
- r = r->next;
- rs_free (ctx, tmp);
}
- if (ctx->cfg)
- cfg_free (ctx->cfg);
- ctx->cfg = NULL;
+ if (ctx->config)
+ {
+ if (ctx->config->cfg)
+ {
+ cfg_free (ctx->config->cfg);
+ ctx->config->cfg = NULL;
+ }
+ rs_free (ctx, ctx->config);
+ }
rs_free (ctx, ctx);
}