return 0;
}
+/** Return top root module, in a hierarchy of modules
+ *
+ */
+dl_module_inst_t const *dl_module_instance_root(dl_module_inst_t const *dl_inst)
+{
+ if (!dl_inst) return NULL;
+
+ while (dl_inst->parent) dl_inst = dl_inst->parent;
+
+ return dl_inst;
+}
+
+/** Return the prefix string for the deepest module
+ *
+ * This is useful for submodules which don't have a prefix of their own.
+ * In this case we need to use the prefix of the shallowest module, which
+ * will be a proto or rlm module.
+ *
+ * @param[in] dl_inst Instance to get the prefix for.
+ * @return The prefix string for the shallowest module.
+ */
+char const *dl_module_instance_root_prefix_str(dl_module_inst_t const *dl_inst)
+{
+ dl_module_inst_t const *root = dl_module_instance_root(dl_inst);
+
+ return fr_table_str_by_value(dl_module_type_prefix, root->module->type, "<INVALID>");
+}
+
/** Lookup a module's parent
*
*/
dl_module_t const *dl_module(dl_module_t const *parent, char const *name, dl_module_type_t type);
+dl_module_inst_t const *dl_module_instance_root(dl_module_inst_t const *dl_inst);
+
+char const *dl_module_instance_root_prefix_str(dl_module_inst_t const *dl_inst);
+
dl_module_inst_t const *dl_module_parent_instance(dl_module_inst_t const *child);
dl_module_inst_t const *dl_module_instance_by_data(void const *data);
*/
if (mi->module->instantiate) {
cf_log_debug(cs, "Instantiating %s_%s \"%s\"",
- fr_table_str_by_value(dl_module_type_prefix, mi->dl_inst->module->type, "<INVALID>"),
+ dl_module_instance_root_prefix_str(mi->dl_inst),
mi->dl_inst->module->common->name,
mi->name);
CONF_SECTION *cs = mi->dl_inst->conf;
cf_log_debug(cs, "Bootstrapping %s_%s \"%s\"",
- fr_table_str_by_value(dl_module_type_prefix, mi->dl_inst->module->type, "<INVALID>"),
+ dl_module_instance_root_prefix_str(mi->dl_inst),
mi->dl_inst->module->common->name,
mi->name);