+/** 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;