typedef struct {
char const *namespace; //!< Namespace function is registered to.
- char const *proto_dict; //!< Dictionary name to load for this namespace.
- char const *proto_dir; //!< Override proto_dict and specify a dictionary off of
- //!< the dictionary root directory (may be NULL).
+ fr_dict_t const *dict; //!< dictionary to use
fr_virtual_server_compile_t func; //!< Function to call to compile sections.
} fr_virtual_namespace_t;
static void virtual_server_dict_set(CONF_SECTION *server_cs, fr_dict_t const *dict, bool do_free)
{
- virtual_server_dict_t *cd;
+ virtual_server_dict_t *p;
+ CONF_DATA const *cd;
+
+ cd = cf_data_find(server_cs, virtual_server_dict_t, "dictionary");
+ if (cd) {
+ p = (virtual_server_dict_t *) cf_data_value(cd);
+ if (p->dict == dict) return;
+
+ cf_log_warn(server_cs, "Attempt to add multiple different dictionaries %s and %s",
+ fr_dict_root(p->dict)->name, fr_dict_root(dict)->name);
+ return;
+ }
- cd = talloc_zero(server_cs, virtual_server_dict_t);
- cd->do_free = do_free;
- cd->dict = dict;
- talloc_set_destructor(cd, _virtual_server_dict_free);
+ p = talloc_zero(server_cs, virtual_server_dict_t);
+ p->do_free = do_free;
+ p->dict = dict;
+ talloc_set_destructor(p, _virtual_server_dict_free);
- cf_data_add(server_cs, cd, "dictionary", true);
+ cf_data_add(server_cs, p, "dictionary", true);
}
/** dl_open a proto_* module
*/
if (!cf_data_find(server_cs, virtual_server_dict_t, "dictionary")) {
fr_dict_t *dict = NULL;
+ fr_virtual_namespace_t *found = NULL;
if (vns_tree) {
- fr_virtual_namespace_t *found;
-
found = rbtree_finddata(vns_tree, &(fr_virtual_namespace_t){ .namespace = cf_pair_value(ns) });
if (found) {
+ virtual_server_dict_set(server_cs, found->dict, true);
- if (fr_dict_protocol_afrom_file(&dict, found->proto_dict, found->proto_dir) < 0) return -1;
- virtual_server_dict_set(server_cs, dict, true);
-
- if ((found->func(server_cs) < 0)) return -1;
+ if ((found->func(server_cs) < 0)) {
+ PERROR("Failed compiling %s", cf_section_name2(server_cs));
+ return -1;
+ }
}
}
* just don't have a dictionary for it.
* Load the dictionary now.
*/
- if (!dict) {
+ if (!found) {
char const *value = cf_pair_value(ns);
- if (fr_dict_protocol_afrom_file(&dict, value, NULL) < 0) return -1;
+ if (fr_dict_protocol_afrom_file(&dict, value, NULL) < 0) {
+ PERROR("Failed loading dictionary %s", value);
+ return -1;
+ }
virtual_server_dict_set(server_cs, dict, true);
}
}
* This allows modules to register unlang compilation functions for specific namespaces
*
* @param[in] namespace to register.
- * @param[in] proto_dict Dictionary name to load for this namespace.
- * @param[in] proto_dir Override proto_dict and specify a dictionary off of
- * the dictionary root directory (may be NULL).
+ * @param[in] dict Dictionary name to use for this namespace
* @param[in] func to call to compile sections in the virtual server.
* @return
* - 0 on success.
* - -1 on failure.
*/
-int virtual_namespace_register(char const *namespace,
- char const *proto_dict, char const *proto_dir, fr_virtual_server_compile_t func)
+int virtual_namespace_register(char const *namespace, fr_dict_t const *dict,
+ fr_virtual_server_compile_t func)
{
rbtree_t *vns_tree;
fr_virtual_namespace_t *vns;
MEM(vns = talloc_zero(NULL, fr_virtual_namespace_t));
vns->namespace = talloc_strdup(vns, namespace);
- vns->proto_dict = talloc_strdup(vns, proto_dict);
- vns->proto_dir = talloc_strdup(vns, proto_dir);
+ vns->dict = dict;
vns->func = func;
vns_tree = cf_data_value(cf_data_find(virtual_server_root, rbtree_t, "vns_tree"));
int virtual_server_cf_parse(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent,
CONF_ITEM *ci, UNUSED CONF_PARSER const *rule);
-int virtual_namespace_register(char const *namespace,
- char const *proto_dict, char const *proto_dir,
+int virtual_namespace_register(char const *namespace, fr_dict_t const *dict,
fr_virtual_server_compile_t func);
fr_dict_t const *virtual_server_namespace(char const *virtual_server);
RCSID("$Id$")
#include <freeradius-devel/eap/base.h>
+#include <freeradius-devel/eap_aka_sim/attrs.h>
#include <freeradius-devel/eap_aka_sim/state_machine.h>
-#include <freeradius-devel/util/debug.h>
#include <freeradius-devel/unlang/compile.h>
#include <freeradius-devel/unlang/module.h>
+#include <freeradius-devel/util/debug.h>
static CONF_PARSER submodule_config[] = {
{ FR_CONF_OFFSET("request_identity", FR_TYPE_UINT32, eap_aka_sim_common_conf_t, request_identity ),
CONF_PARSER_TERMINATOR
};
-static fr_dict_t const *dict_eap_aka_sim;
-
-extern fr_dict_autoload_t rlm_eap_aka_dict[];
-fr_dict_autoload_t rlm_eap_aka_dict[] = {
- { .out = &dict_eap_aka_sim, .base_dir="eap/aka-sim", .proto = "eap-aka-sim" },
- { NULL }
-};
-
static virtual_server_compile_t compile_list[] = {
/*
* Identity negotiation
static int mod_load(void)
{
- if (virtual_namespace_register("eap-aka", "eap-aka-sim", "eap/aka-sim", mod_namespace_load) < 0) return -1;
-
if (fr_aka_sim_init() < 0) return -1;
+ if (virtual_namespace_register("eap-aka", dict_eap_aka_sim, mod_namespace_load) < 0) return -1;
+
fr_aka_sim_xlat_register();
return 0;
RCSID("$Id$")
#include <freeradius-devel/eap/base.h>
+#include <freeradius-devel/eap_aka_sim/attrs.h>
#include <freeradius-devel/eap_aka_sim/state_machine.h>
-#include <freeradius-devel/util/debug.h>
#include <freeradius-devel/unlang/compile.h>
#include <freeradius-devel/unlang/module.h>
+#include <freeradius-devel/util/debug.h>
static CONF_PARSER submodule_config[] = {
{ FR_CONF_OFFSET("network_name", FR_TYPE_STRING, eap_aka_sim_common_conf_t, network_name ) },
CONF_PARSER_TERMINATOR
};
-static fr_dict_t const *dict_eap_aka_sim;
-
-extern fr_dict_autoload_t rlm_eap_aka_dict[];
-fr_dict_autoload_t rlm_eap_aka_dict[] = {
- { .out = &dict_eap_aka_sim, .base_dir="eap/aka-sim", .proto = "eap-aka-sim" },
- { NULL }
-};
-
static virtual_server_compile_t compile_list[] = {
/*
* Identity negotiation
static int mod_load(void)
{
- if (virtual_namespace_register("eap-aka-prime", "eap-aka-sim", "eap/aka-sim", mod_namespace_load) < 0) return -1;
-
if (fr_aka_sim_init() < 0) return -1;
+ if (virtual_namespace_register("eap-aka-prime", dict_eap_aka_sim, mod_namespace_load) < 0) return -1;
+
fr_aka_sim_xlat_register();
return 0;
/**
* $Id$
- * @file rlm_eap_aka.c
- * @brief Implements EAP-AKA
+ * @file rlm_eap_sim.c
+ * @brief Implements EAP-SIM
*
* @author Arran Cudbard-Bell <a.cudbardb@freeradius.org>
*
RCSID("$Id$")
#include <freeradius-devel/eap/base.h>
+#include <freeradius-devel/eap_aka_sim/attrs.h>
#include <freeradius-devel/eap_aka_sim/state_machine.h>
-#include <freeradius-devel/util/debug.h>
#include <freeradius-devel/unlang/compile.h>
#include <freeradius-devel/unlang/module.h>
+#include <freeradius-devel/util/debug.h>
static CONF_PARSER submodule_config[] = {
{ FR_CONF_OFFSET("request_identity", FR_TYPE_UINT32, eap_aka_sim_common_conf_t, request_identity ),
CONF_PARSER_TERMINATOR
};
-static fr_dict_t const *dict_eap_aka_sim;
-
-extern fr_dict_autoload_t rlm_eap_aka_dict[];
-fr_dict_autoload_t rlm_eap_aka_dict[] = {
- { .out = &dict_eap_aka_sim, .base_dir="eap/aka-sim", .proto = "eap-aka-sim" },
- { NULL }
-};
-
static virtual_server_compile_t compile_list[] = {
/*
* Identity negotiation
static int mod_load(void)
{
- if (virtual_namespace_register("eap-sim", "eap-aka-sim", "eap/aka-sim", mod_namespace_load) < 0) return -1;
-
if (fr_aka_sim_init() < 0) return -1;
+ if (virtual_namespace_register("eap-sim", dict_eap_aka_sim, mod_namespace_load) < 0) return -1;
+
fr_aka_sim_xlat_register();
return 0;
static int mod_load(void)
{
- if (virtual_namespace_register("eap-tls", "eap-tls", NULL, mod_namespace_load) < 0) return -1;
+ if (virtual_namespace_register("eap-tls", dict_freeradius, mod_namespace_load) < 0) return -1;
return 0;
}