xlat_instantiate_t instantiate, size_t inst_size,
size_t buf_len);
+xlat_t *xlat_register_module(TALLOC_CTX *ctx, module_inst_ctx_t const *mctx,
+ char const *name, xlat_func_t func, xlat_flags_t const *flags);
xlat_t *xlat_register(TALLOC_CTX *ctx, char const *name, xlat_func_t func, xlat_flags_t const *flags) CC_HINT(nonnull(2));
int xlat_func_args(xlat_t *xlat, xlat_arg_parser_t const args[]) CC_HINT(nonnull);
}
-/** Register an xlat function
+/** Register an xlat function for a module
*
* @param[in] ctx Used to automate deregistration of the xlat fnction.
+ * @param[in] mctx Instantiation context from the module.
+ * Will be duplicated and passed to future xlat calls.
* @param[in] name of the xlat.
* @param[in] func to register.
* @param[in] flags various function flags
* - A handle for the newly registered xlat function on success.
* - NULL on failure.
*/
-xlat_t *xlat_register(TALLOC_CTX *ctx, char const *name, xlat_func_t func, xlat_flags_t const *flags)
+xlat_t *xlat_register_module(TALLOC_CTX *ctx, module_inst_ctx_t const *mctx,
+ char const *name, xlat_func_t func, xlat_flags_t const *flags)
{
+ static const xlat_flags_t default_flags;
xlat_t *c;
- static const xlat_flags_t my_flags = (xlat_flags_t) { 0 };
+ module_inst_ctx_t *our_mctx = NULL;
if (!xlat_root) xlat_init();
return NULL;
}
- if (!flags) flags = &my_flags;
+ if (!flags) flags = &default_flags;
/*
* If it already exists, replace the instance.
* Doesn't exist. Create it.
*/
MEM(c = talloc(ctx, xlat_t));
+ if (mctx) {
+ MEM(our_mctx = talloc_zero(c, module_inst_ctx_t)); /* Original won't stick around */
+ memcpy(our_mctx, mctx, sizeof(*our_mctx));
+ }
*c = (xlat_t){
.name = talloc_typed_strdup(c, name),
.func = {
.async = func
},
+ .mctx = our_mctx,
.type = XLAT_FUNC_NORMAL,
.flags = *flags,
.input_type = XLAT_INPUT_UNPROCESSED /* set default - will be overridden if args are registered */
return c;
}
+/** Register an xlat function
+ *
+ * @param[in] ctx Used to automate deregistration of the xlat fnction.
+ * @param[in] name of the xlat.
+ * @param[in] func to register.
+ * @param[in] flags various function flags
+ * @return
+ * - A handle for the newly registered xlat function on success.
+ * - NULL on failure.
+ */
+xlat_t *xlat_register(TALLOC_CTX *ctx, char const *name, xlat_func_t func, xlat_flags_t const *flags)
+{
+ return xlat_register_module(ctx, NULL, name, func, flags);
+}
/** Verify xlat arg specifications are valid
*
bool internal; //!< If true, cannot be redefined.
+ module_inst_ctx_t const *mctx; //!< Original module instantiation ctx if this
+ ///< xlat was registered by a module.
+
xlat_instantiate_t instantiate; //!< Instantiation function.
xlat_detach_t detach; //!< Destructor for when xlat instances are freed.
char const *inst_type; //!< C type of instance structure.
return -1;
}
- xlat = xlat_register(inst, mctx->inst->name, always_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, always_xlat, NULL);
xlat_func_args(xlat, always_xlat_args);
xlat_async_instantiate_set(xlat, always_xlat_instantiate, rlm_always_t *, NULL, inst);
/*
* Register the cache xlat function
*/
- xlat = xlat_register(inst, mctx->inst->name, cache_xlat, XLAT_FLAG_NEEDS_ASYNC);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, cache_xlat, XLAT_FLAG_NEEDS_ASYNC);
xlat_func_args(xlat, cache_xlat_args);
xlat_async_thread_instantiate_set(xlat, mod_xlat_thread_instantiate, cache_xlat_thread_inst_t, NULL, inst);
* Register decrypt xlat
*/
xlat_name = talloc_asprintf(inst, "%s_decrypt", mctx->inst->name);
- xlat = xlat_register(inst, xlat_name, cipher_rsa_decrypt_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_decrypt_xlat, NULL);
xlat_func_mono(xlat, &cipher_rsa_decrypt_xlat_arg);
xlat_async_instantiate_set(xlat, cipher_xlat_instantiate,
rlm_cipher_t *,
* Verify sign xlat
*/
xlat_name = talloc_asprintf(inst, "%s_verify", mctx->inst->name);
- xlat = xlat_register(inst, xlat_name, cipher_rsa_verify_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_verify_xlat, NULL);
xlat_func_args(xlat, cipher_rsa_verify_xlat_arg);
xlat_async_instantiate_set(xlat, cipher_xlat_instantiate,
rlm_cipher_t *,
* Register encrypt xlat
*/
xlat_name = talloc_asprintf(inst, "%s_encrypt", mctx->inst->name);
- xlat = xlat_register(inst, xlat_name, cipher_rsa_encrypt_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_encrypt_xlat, NULL);
xlat_func_mono(xlat, &cipher_rsa_encrypt_xlat_arg);
xlat_async_instantiate_set(xlat, cipher_xlat_instantiate,
rlm_cipher_t *,
* Register sign xlat
*/
xlat_name = talloc_asprintf(inst, "%s_sign", mctx->inst->name);
- xlat = xlat_register(inst, xlat_name, cipher_rsa_sign_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_sign_xlat, NULL);
xlat_func_mono(xlat, &cipher_rsa_sign_xlat_arg);
xlat_async_instantiate_set(xlat, cipher_xlat_instantiate,
rlm_cipher_t *,
talloc_free(xlat_name);
xlat_name = talloc_asprintf(inst, "%s_certificate", mctx->inst->name);
- xlat = xlat_register(inst, xlat_name, cipher_certificate_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, xlat_name, cipher_certificate_xlat, NULL);
xlat_func_args(xlat, cipher_certificate_xlat_args);
xlat_async_instantiate_set(xlat, cipher_xlat_instantiate,
rlm_cipher_t *,
rlm_date_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_date_t );
xlat_t *xlat;
- xlat = xlat_register(inst, mctx->inst->name, xlat_date_convert, NULL);
- xlat_func_args(xlat,xlat_date_convert_args);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, xlat_date_convert, NULL);
xlat_async_instantiate_set(xlat, mod_xlat_instantiate, rlm_date_t *, NULL, inst);
+ xlat_func_args(xlat, xlat_date_convert_args);
return 0;
}
rlm_delay_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_delay_t);
xlat_t *xlat;
- xlat = xlat_register(inst, mctx->inst->name, xlat_delay, XLAT_FLAG_NEEDS_ASYNC);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, xlat_delay, XLAT_FLAG_NEEDS_ASYNC);
xlat_func_args(xlat, xlat_delay_args);
xlat_async_instantiate_set(xlat, mod_xlat_instantiate, rlm_delay_t *, NULL, inst);
return 0;
*/
if (cf_section_name2(mctx->inst->conf) != NULL) return 0;
- xlat = xlat_register(inst, "attr_by_num", xlat_dict_attr_by_num, NULL);
+ xlat = xlat_register_module(inst, mctx, "attr_by_num", xlat_dict_attr_by_num, NULL);
xlat_func_args(xlat, xlat_dict_attr_by_num_args);
- xlat = xlat_register(inst, "attr_by_oid", xlat_dict_attr_by_oid, NULL);
+ xlat = xlat_register_module(inst, mctx, "attr_by_oid", xlat_dict_attr_by_oid, NULL);
xlat_func_args(xlat, xlat_dict_attr_by_oid_args);
- xlat = xlat_register(inst, "vendor", xlat_vendor, NULL);
+ xlat = xlat_register_module(inst, mctx, "vendor", xlat_vendor, NULL);
xlat_func_args(xlat, xlat_vendor_args);
- xlat = xlat_register(inst, "vendor_num", xlat_vendor_num, NULL);
+ xlat = xlat_register_module(inst, mctx, "vendor_num", xlat_vendor_num, NULL);
xlat_func_args(xlat, xlat_vendor_num_args);
- xlat = xlat_register(inst, "attr", xlat_attr, NULL);
+ xlat = xlat_register_module(inst, mctx, "attr", xlat_attr, NULL);
xlat_func_args(xlat, xlat_attr_args);
- xlat = xlat_register(inst, "attr_num", xlat_attr_num, NULL);
+ xlat = xlat_register_module(inst, mctx, "attr_num", xlat_attr_num, NULL);
xlat_func_args(xlat, xlat_attr_num_args);
return 0;
xlat_t *xlat;
MEM(unescape = talloc_asprintf(NULL, "un%s", mctx->inst->name));
- xlat = xlat_register(NULL, mctx->inst->name, escape_xlat, XLAT_FLAG_PURE);
+ xlat = xlat_register_module(NULL, mctx, mctx->inst->name, escape_xlat, XLAT_FLAG_PURE);
xlat_func_mono(xlat, &escape_xlat_arg);
xlat_async_instantiate_set(xlat, mod_xlat_instantiate, rlm_escape_t *, NULL, inst);
- xlat = xlat_register(NULL, unescape, unescape_xlat, XLAT_FLAG_PURE);
+ xlat = xlat_register_module(NULL, mctx, unescape, unescape_xlat, XLAT_FLAG_PURE);
xlat_func_mono(xlat, &unescape_xlat_arg);
talloc_free(unescape);
xlat_t *xlat;
char const *p;
- xlat = xlat_register(NULL, mctx->inst->name, exec_xlat, XLAT_FLAG_NEEDS_ASYNC);
+ xlat = xlat_register_module(NULL, mctx, mctx->inst->name, exec_xlat, XLAT_FLAG_NEEDS_ASYNC);
xlat_func_args(xlat, exec_xlat_args);
xlat_async_instantiate_set(xlat, mod_xlat_instantiate, rlm_exec_t *, NULL, inst);
{
xlat_t *xlat;
- xlat = xlat_register(mctx->inst->data, mctx->inst->name, expr_xlat, NULL);
+ xlat = xlat_register_module(mctx->inst->data, mctx, mctx->inst->name, expr_xlat, NULL);
xlat_func_mono(xlat, &expr_xlat_arg);
return 0;
rlm_icmp_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_icmp_t);
xlat_t *xlat;
- xlat = xlat_register(inst, mctx->inst->name, xlat_icmp, XLAT_FLAG_NEEDS_ASYNC);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, xlat_icmp, XLAT_FLAG_NEEDS_ASYNC);
xlat_func_args(xlat, xlat_icmp_args);
xlat_async_instantiate_set(xlat, mod_xlat_instantiate, rlm_icmp_t *, NULL, inst);
xlat_async_thread_instantiate_set(xlat, mod_xlat_thread_instantiate, xlat_icmp_thread_inst_t, NULL, inst);
rlm_idn_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_idn_t);
xlat_t *xlat;
- xlat = xlat_register(inst, mctx->inst->name, xlat_idna, XLAT_FLAG_PURE);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, xlat_idna, XLAT_FLAG_PURE);
xlat_func_mono(xlat, &xlat_idna_arg);
xlat_async_instantiate_set(xlat, mod_xlat_instantiate, rlm_idn_t *, NULL, inst);
char *name;
fr_json_format_t *format = inst->format;
- xlat = xlat_register(inst, "jsonquote", json_quote_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, "jsonquote", json_quote_xlat, NULL);
if (xlat) xlat_func_mono(xlat, &json_quote_xlat_arg);
- xlat = xlat_register(inst, "jpathvalidate", jpath_validate_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, "jpathvalidate", jpath_validate_xlat, NULL);
if (xlat) xlat_func_mono(xlat, &jpath_validate_xlat_arg);
name = talloc_asprintf(inst, "%s_encode", mctx->inst->name);
- xlat = xlat_register(inst, name, json_encode_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, name, json_encode_xlat, NULL);
xlat_func_mono(xlat, &json_encode_xlat_arg);
xlat_async_instantiate_set(xlat, json_xlat_instantiate,
rlm_json_t *, NULL, inst);
inst->cache_da = inst->group_da; /* Default to the group_da */
}
- xlat = xlat_register(NULL, mctx->inst->name, ldap_xlat, NULL);
+ xlat = xlat_register_module(NULL, mctx, mctx->inst->name, ldap_xlat, NULL);
xlat_func_mono(xlat, &ldap_xlat_arg);
xlat_async_thread_instantiate_set(xlat, mod_xlat_thread_instantiate, ldap_xlat_thread_inst_t, NULL, inst);
- xlat = xlat_register(NULL, "ldap_escape", ldap_escape_xlat, XLAT_FLAG_PURE);
+ xlat = xlat_register_module(NULL, mctx, "ldap_escape", ldap_escape_xlat, XLAT_FLAG_PURE);
if (xlat) xlat_func_mono(xlat, &ldap_escape_xlat_arg);
- xlat = xlat_register(NULL, "ldap_unescape", ldap_unescape_xlat, XLAT_FLAG_PURE);
+ xlat = xlat_register_module(NULL, mctx, "ldap_unescape", ldap_unescape_xlat, XLAT_FLAG_PURE);
if (xlat) xlat_func_mono(xlat, &ldap_escape_xlat_arg);
map_proc_register(inst, mctx->inst->name, mod_map_proc, ldap_map_verify, 0);
rlm_mschap_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_mschap_t);
xlat_t *xlat;
- xlat = xlat_register(inst, mctx->inst->name, mschap_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, mschap_xlat, NULL);
xlat_func_args(xlat, mschap_xlat_args);
xlat_async_instantiate_set(xlat, mod_xlat_instantiate, rlm_mschap_t *, NULL, inst);
rlm_perl_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_perl_t);
xlat_t *xlat;
- xlat = xlat_register(NULL, mctx->inst->name, perl_xlat, NULL);
+ xlat = xlat_register_module(NULL, mctx, mctx->inst->name, perl_xlat, NULL);
xlat_func_args(xlat, perl_xlat_args);
xlat_async_instantiate_set(xlat, mod_xlat_instantiate, rlm_perl_xlat_t, NULL, inst);
char *name;
xlat_t *xlat;
- xlat = xlat_register(inst, mctx->inst->name, redis_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, redis_xlat, NULL);
xlat_func_args(xlat, redis_args);
xlat_async_instantiate_set(xlat, redis_xlat_instantiate, rlm_redis_t *, NULL, inst);
* %(redis_node:<key>[ idx])
*/
name = talloc_asprintf(NULL, "%s_node", mctx->inst->name);
- xlat = xlat_register(inst, name, redis_node_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, name, redis_node_xlat, NULL);
xlat_func_args(xlat, redis_node_xlat_args);
xlat_async_instantiate_set(xlat, redis_xlat_instantiate, rlm_redis_t *, NULL, inst);
talloc_free(name);
name = talloc_asprintf(NULL, "%s_remap", mctx->inst->name);
- xlat = xlat_register(inst, name, redis_remap_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, name, redis_remap_xlat, NULL);
xlat_func_args(xlat, redis_remap_xlat_args);
xlat_async_instantiate_set(xlat, redis_xlat_instantiate, rlm_redis_t *, NULL, inst);
talloc_free(name);
rlm_rest_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_rest_t);
xlat_t *xlat;
- xlat = xlat_register(inst, mctx->inst->name, rest_xlat, XLAT_FLAG_NEEDS_ASYNC);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, rest_xlat, XLAT_FLAG_NEEDS_ASYNC);
xlat_func_args(xlat, rest_xlat_args);
xlat_async_thread_instantiate_set(xlat, mod_xlat_thread_instantiate, rest_xlat_thread_inst_t, NULL, inst);
rlm_soh_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_soh_t);
xlat_t *xlat;
- xlat = xlat_register(inst, mctx->inst->name, soh_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, soh_xlat, NULL);
xlat_func_args(xlat, soh_xlat_args);
return 0;
/*
* Register the SQL xlat function
*/
- xlat = xlat_register(inst, inst->name, sql_xlat, NULL);
+ xlat = xlat_register_module(inst, mctx, inst->name, sql_xlat, NULL);
/*
* The xlat escape function needs access to inst - so
}
if (!cf_section_name2(mctx->inst->conf)) {
- if (!(xlat = xlat_register(inst, "test_trigger", trigger_test_xlat, NULL))) return -1;
+ if (!(xlat = xlat_register_module(inst, mctx, "test_trigger", trigger_test_xlat, NULL))) return -1;
xlat_func_args(xlat, trigger_test_xlat_args);
- if (!(xlat = xlat_register(inst, "test", test_xlat, NULL))) return -1;
+ if (!(xlat = xlat_register_module(inst, mctx, "test", test_xlat, NULL))) return -1;
xlat_func_args(xlat, test_xlat_args);
} else {
- if (!(xlat = xlat_register(inst, mctx->inst->name, test_xlat, NULL))) return -1;
+ if (!(xlat = xlat_register_module(inst, mctx, mctx->inst->name, test_xlat, NULL))) return -1;
xlat_func_args(xlat, test_xlat_args);
}
return -1;
}
- if(!(xlat = xlat_register(NULL, mctx->inst->name, xlat_unbound, XLAT_FLAG_NEEDS_ASYNC))) return -1;
+ if(!(xlat = xlat_register_module(NULL, mctx, mctx->inst->name, xlat_unbound, XLAT_FLAG_NEEDS_ASYNC))) return -1;
xlat_func_args(xlat, xlat_unbound_args);
xlat_async_thread_instantiate_set(xlat, mod_xlat_thread_instantiate, unbound_xlat_thread_inst_t, NULL, inst);
/*
* Register the xlats
*/
-static int mod_bootstrap(UNUSED module_inst_ctx_t const *mctx)
+static int mod_bootstrap(module_inst_ctx_t const *mctx)
{
xlat_t *xlat;
- xlat = xlat_register(NULL, "unpack", unpack_xlat, XLAT_FLAG_PURE);
+ xlat = xlat_register_module(NULL, mctx, "unpack", unpack_xlat, XLAT_FLAG_PURE);
if (xlat) xlat_func_args(xlat, unpack_xlat_args);
return 0;
}
#endif
- xlat = xlat_register(inst, "modhextohex", modhex_to_hex_xlat, XLAT_FLAG_PURE);
+ xlat = xlat_register_module(inst, mctx, "modhextohex", modhex_to_hex_xlat, XLAT_FLAG_PURE);
if (xlat) xlat_func_mono(xlat, &modhex_to_hex_xlat_arg);
return 0;