unlang_thread_instantiate(thread_ctx);
- if (!xlat_register(NULL, "test", xlat_test, FR_TYPE_NULL, NULL)) {
+ if (!xlat_register(NULL, "test", xlat_test, FR_TYPE_NULL)) {
ERROR("Failed registering xlat");
EXIT_WITH_FAILURE;
}
return;
}
- xlat = xlat_register(NULL, "aka_sim_id_method", aka_sim_xlat_id_method_xlat, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, aka_sim_xlat_id_method_xlat_args);
- xlat = xlat_register(NULL, "aka_sim_id_type", aka_sim_xlat_id_type_xlat, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, aka_sim_xlat_id_type_xlat_args);
- xlat = xlat_register(NULL, "3gpp_temporary_id_key_index", aka_sim_id_3gpp_temporary_id_key_index_xlat, FR_TYPE_UINT8, NULL);
- xlat_func_args(xlat, aka_sim_id_3gpp_temporary_id_key_index_xlat_args);
- xlat = xlat_register(NULL, "3gpp_temporary_id_decrypt", aka_sim_3gpp_temporary_id_decrypt_xlat, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, aka_sim_3gpp_temporary_id_decrypt_xlat_args);
- xlat = xlat_register(NULL, "3gpp_temporary_id_encrypt", aka_sim_3gpp_temporary_id_encrypt_xlat, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, aka_sim_3gpp_temporary_id_encrypt_xlat_args);
+ xlat = xlat_register(NULL, "aka_sim_id_method", aka_sim_xlat_id_method_xlat, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, aka_sim_xlat_id_method_xlat_args);
+ xlat = xlat_register(NULL, "aka_sim_id_type", aka_sim_xlat_id_type_xlat, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, aka_sim_xlat_id_type_xlat_args);
+ xlat = xlat_register(NULL, "3gpp_temporary_id_key_index", aka_sim_id_3gpp_temporary_id_key_index_xlat, FR_TYPE_UINT8);
+ xlat_func_args_set(xlat, aka_sim_id_3gpp_temporary_id_key_index_xlat_args);
+ xlat = xlat_register(NULL, "3gpp_temporary_id_decrypt", aka_sim_3gpp_temporary_id_decrypt_xlat, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, aka_sim_3gpp_temporary_id_decrypt_xlat_args);
+ xlat = xlat_register(NULL, "3gpp_temporary_id_encrypt", aka_sim_3gpp_temporary_id_encrypt_xlat, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, aka_sim_3gpp_temporary_id_encrypt_xlat_args);
aka_sim_xlat_refs = 1;
}
* @copyright 2002,2006-2007 The FreeRADIUS server project
* @copyright 2002 Alan DeKok (aland@freeradius.org)
*/
+#include "lib/unlang/xlat.h"
RCSID("$Id$")
#include <freeradius-devel/server/cf_file.h>
/*
* Register the %(config:section.subsection) xlat function.
*/
- xlat = xlat_register(NULL, "config", xlat_config, FR_TYPE_STRING, XLAT_FLAG_PURE);
- xlat_func_args(xlat, xlat_config_args);
+ xlat = xlat_register(NULL, "config", xlat_config, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, xlat_config_args);
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE);
/*
* Ensure cwd is inside the chroot.
xlat_t *x;
x = xlat_register(NULL, xlat_foreach_names[i],
- unlang_foreach_xlat, FR_TYPE_VOID, 0);
+ unlang_foreach_xlat, FR_TYPE_VOID);
fr_assert(x);
x->uctx = &xlat_foreach_inst[i];
xlat_internal(x);
* Should be void, but someone decided not to register multiple xlats
* breaking the convention we use everywhere else in the server...
*/
- xlat = xlat_register(NULL, "interpreter", unlang_interpret_xlat, FR_TYPE_VOID, NULL);
- xlat_func_args(xlat, unlang_interpret_xlat_args);
+ xlat = xlat_register(NULL, "interpreter", unlang_interpret_xlat, FR_TYPE_VOID);
+ xlat_func_args_set(xlat, unlang_interpret_xlat_args);
- xlat = xlat_register(NULL, "cancel", unlang_cancel_xlat, FR_TYPE_VOID, NULL);
- xlat_func_args(xlat, unlang_cancel_xlat_args);
+ xlat = xlat_register(NULL, "cancel", unlang_cancel_xlat, FR_TYPE_VOID);
+ xlat_func_args_set(xlat, unlang_cancel_xlat_args);
}
fr_sbuff_escape_rules_t const *e_rules)
SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(xlat_print, head, e_rules)
+bool xlat_is_truthy(xlat_exp_head_t const *head, bool *out);
+
int xlat_validate_function_mono(xlat_exp_t *node);
int xlat_validate_function_args(xlat_exp_t *node);
int xlat_resolve(xlat_exp_head_t *head, xlat_res_rules_t const *xr_rules);
xlat_t *xlat_register_module(TALLOC_CTX *ctx, module_inst_ctx_t const *mctx,
- char const *name, xlat_func_t func, fr_type_t return_type, xlat_flags_t const *flags);
-xlat_t *xlat_register(TALLOC_CTX *ctx, char const *name, xlat_func_t func, fr_type_t return_type, xlat_flags_t const *flags) CC_HINT(nonnull(2));
+ char const *name, xlat_func_t func, fr_type_t return_type);
+xlat_t *xlat_register(TALLOC_CTX *ctx, char const *name, xlat_func_t func, fr_type_t return_type) CC_HINT(nonnull(2));
-int xlat_func_args(xlat_t *xlat, xlat_arg_parser_t const args[]) CC_HINT(nonnull);
+int xlat_func_args_set(xlat_t *xlat, xlat_arg_parser_t const args[]) CC_HINT(nonnull);
-int xlat_func_mono(xlat_t *xlat, xlat_arg_parser_t const *arg) CC_HINT(nonnull);
+int xlat_func_mono_set(xlat_t *xlat, xlat_arg_parser_t const *arg) CC_HINT(nonnull);
-bool xlat_is_truthy(xlat_exp_head_t const *head, bool *out);
+void xlat_func_flags_set(xlat_t *x, xlat_flags_t const *flags) CC_HINT(nonnull);
/** Set a callback for global instantiation of xlat functions
*
#include <freeradius-devel/server/base.h>
#include <freeradius-devel/server/tmpl_dcursor.h>
#include <freeradius-devel/unlang/xlat_priv.h>
+#include <freeradius-devel/unlang/xlat.h>
#include <freeradius-devel/io/test_point.h>
talloc_free(xlat);
}
+#if 0
+/** Compare two argument entries to see if they're equivalent
+ *
+ * @note Does not check escape function or uctx pointers.
+ *
+ * @param[in] a First argument structure.
+ * @param[in] b Second argument structure.
+ * @return
+ * - 1 if a > b
+ * - 0 if a == b
+ * - -1 if a < b
+ */
+static int xlat_arg_cmp_no_escape(xlat_arg_parser_t const *a, xlat_arg_parser_t const *b)
+{
+ int8_t ret;
+
+ ret = CMP(a->required, b->required);
+ if (ret != 0) return ret;
+
+ ret = CMP(a->concat, b->concat);
+ if (ret != 0) return ret;
+
+ ret = CMP(a->single, b->single);
+ if (ret != 0) return ret;
+
+ ret = CMP(a->variadic, b->variadic);
+ if (ret != 0) return ret;
+
+ ret = CMP(a->always_escape, b->always_escape);
+ if (ret != 0) return ret;
+
+ return CMP(a->type, b->type);
+}
+
+/** Compare two argument lists to see if they're equivalent
+ *
+ * @note Does not check escape function or uctx pointers.
+ *
+ * @param[in] a First argument structure.
+ * @param[in] b Second argument structure.
+ * @return
+ * - 1 if a > b
+ * - 0 if a == b
+ * - -1 if a < b
+ */
+static int xlat_arg_cmp_list_no_escape(xlat_arg_parser_t const a[], xlat_arg_parser_t const b[])
+{
+ xlat_arg_parser_t const *arg_a_p;
+ xlat_arg_parser_t const *arg_b_p;
+
+ for (arg_a_p = a, arg_b_p = b;
+ (arg_a_p->type != FR_TYPE_NULL) && (arg_b_p->type != FR_TYPE_NULL);
+ arg_a_p++, arg_b_p++) {
+ int8_t ret;
+
+ ret = xlat_arg_cmp_no_escape(arg_a_p, arg_b_p);
+ if (ret != 0) return ret;
+ }
+
+ return CMP(arg_a_p, arg_b_p); /* Check we ended at the same point */
+}
+#endif
+
/** Register an xlat function for a module
*
* @param[in] ctx Used to automate deregistration of the xlat fnction.
* @param[in] name of the xlat.
* @param[in] func to register.
* @param[in] return_type what type of output the xlat function will produce.
- * @param[in] flags various function flags
* @return
* - A handle for the newly registered xlat function on success.
* - NULL on failure.
*/
xlat_t *xlat_register_module(TALLOC_CTX *ctx, module_inst_ctx_t const *mctx,
- char const *name, xlat_func_t func, fr_type_t return_type, xlat_flags_t const *flags)
+ char const *name, xlat_func_t func, fr_type_t return_type)
{
- static const xlat_flags_t default_flags;
xlat_t *c;
module_inst_ctx_t *our_mctx = NULL;
return NULL;
}
- if (!flags) {
- flags = &default_flags;
- } else {
- fr_assert(!flags->needs_resolving);
- }
-
/*
* If it already exists, replace the instance.
*/
.func = func,
.return_type = return_type,
.mctx = our_mctx,
- .flags = *flags,
.input_type = XLAT_INPUT_UNPROCESSED /* set default - will be overridden if args are registered */
};
talloc_set_destructor(c, _xlat_func_talloc_free);
return NULL;
}
- /*
- * If the function is async, it can't be pure. But
- * non-pure functions don't need to be async.
- */
- fr_assert(!flags->needs_resolving);
-
return c;
}
* @param[in] name of the xlat.
* @param[in] func to register.
* @param[in] return_type what type of output the xlat function will produce.
- * @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, fr_type_t return_type, xlat_flags_t const *flags)
-{
- return xlat_register_module(ctx, NULL, name, func, return_type, flags);
-}
-
-#if 0
-/** Compare two argument entries to see if they're equivalent
- *
- * @note Does not check escape function or uctx pointers.
- *
- * @param[in] a First argument structure.
- * @param[in] b Second argument structure.
- * @return
- * - 1 if a > b
- * - 0 if a == b
- * - -1 if a < b
- */
-static int xlat_arg_cmp_no_escape(xlat_arg_parser_t const *a, xlat_arg_parser_t const *b)
+xlat_t *xlat_register(TALLOC_CTX *ctx, char const *name, xlat_func_t func, fr_type_t return_type)
{
- int8_t ret;
-
- ret = CMP(a->required, b->required);
- if (ret != 0) return ret;
-
- ret = CMP(a->concat, b->concat);
- if (ret != 0) return ret;
-
- ret = CMP(a->single, b->single);
- if (ret != 0) return ret;
-
- ret = CMP(a->variadic, b->variadic);
- if (ret != 0) return ret;
-
- ret = CMP(a->always_escape, b->always_escape);
- if (ret != 0) return ret;
-
- return CMP(a->type, b->type);
+ return xlat_register_module(ctx, NULL, name, func, return_type);
}
-/** Compare two argument lists to see if they're equivalent
- *
- * @note Does not check escape function or uctx pointers.
- *
- * @param[in] a First argument structure.
- * @param[in] b Second argument structure.
- * @return
- * - 1 if a > b
- * - 0 if a == b
- * - -1 if a < b
- */
-static int xlat_arg_cmp_list_no_escape(xlat_arg_parser_t const a[], xlat_arg_parser_t const b[])
-{
- xlat_arg_parser_t const *arg_a_p;
- xlat_arg_parser_t const *arg_b_p;
-
- for (arg_a_p = a, arg_b_p = b;
- (arg_a_p->type != FR_TYPE_NULL) && (arg_b_p->type != FR_TYPE_NULL);
- arg_a_p++, arg_b_p++) {
- int8_t ret;
-
- ret = xlat_arg_cmp_no_escape(arg_a_p, arg_b_p);
- if (ret != 0) return ret;
- }
-
- return CMP(arg_a_p, arg_b_p); /* Check we ended at the same point */
-}
-#endif
-
/** Verify xlat arg specifications are valid
*
* @param[in] arg specification to validate.
* - 0 on success.
* - < 0 on failure.
*/
-int xlat_func_args(xlat_t *x, xlat_arg_parser_t const args[])
+int xlat_func_args_set(xlat_t *x, xlat_arg_parser_t const args[])
{
xlat_arg_parser_t const *arg_p = args;
bool seen_optional = false;
* - 0 on success.
* - < 0 on failure.
*/
-int xlat_func_mono(xlat_t *x, xlat_arg_parser_t const args[])
+int xlat_func_mono_set(xlat_t *x, xlat_arg_parser_t const args[])
{
- if (xlat_func_args(x, args) < 0) return -1;
+ if (xlat_func_args_set(x, args) < 0) return -1;
x->input_type = XLAT_INPUT_MONO;
return 0;
}
+/** Specify flags that alter the xlat's behaviour
+ *
+ * @param[in] x xlat to set flags for.
+ * @param[in] flags to set.
+ */
+void xlat_func_flags_set(xlat_t *x, xlat_flags_t const *flags)
+{
+ /*
+ * If the function is async, it can't be pure. But
+ * non-pure functions don't need to be async.
+ */
+ fr_assert(!flags->needs_resolving);
+
+ x->flags = *flags;
+}
+
/** Set global instantiation/detach callbacks
*
* @param[in] xlat to set instantiation callbacks for.
c->uctx = uctx;
}
-
/** Register an async xlat
*
* All functions registered must be !pure
c->thread_uctx = uctx;
}
-
/** Unregister an xlat function
*
* We can only have one function to call per name, so the passing of "func"
talloc_free(c); /* Should also remove from tree */
}
-
void xlat_unregister_module(dl_module_inst_t const *inst)
{
xlat_t *c;
}
}
-
/*
* Internal redundant handler for xlats
*/
return 1;
}
- xlat = xlat_register(NULL, name2, xlat_redundant, return_type, &flags);
+ xlat = xlat_register(NULL, name2, xlat_redundant, return_type);
if (!xlat) {
ERROR("Registering xlat for %s section failed",
fr_table_str_by_value(xlat_redundant_type_table, xr->type, "<INVALID>"));
talloc_free(xr);
return -1;
}
+ xlat_func_flags_set(xlat, &flags);
xlat_async_instantiate_set(xlat, xlat_redundant_instantiate, xlat_redundant_inst_t, NULL, xr);
- if (args) xlat_func_args(xlat, xlat_redundant_args);
+ if (args) xlat_func_args_set(xlat, xlat_redundant_args);
return 0;
}
if (tp_decode) {
snprintf(buffer, sizeof(buffer), "decode.%s", name);
- xlat = xlat_register(NULL, buffer, protocol_decode_xlat, FR_TYPE_UINT32, NULL);
+ xlat = xlat_register(NULL, buffer, protocol_decode_xlat, FR_TYPE_UINT32);
if (!xlat) return -1;
- xlat_func_args(xlat, protocol_decode_xlat_args);
+ xlat_func_args_set(xlat, protocol_decode_xlat_args);
/* coverity[suspicious_sizeof] */
xlat_async_instantiate_set(xlat, protocol_xlat_instantiate, fr_test_point_pair_decode_t *, NULL, tp_decode);
xlat_internal(xlat);
if (tp_encode) {
snprintf(buffer, sizeof(buffer), "encode.%s", name);
- xlat = xlat_register(NULL, buffer, protocol_encode_xlat, FR_TYPE_OCTETS, NULL);
+ xlat = xlat_register(NULL, buffer, protocol_encode_xlat, FR_TYPE_OCTETS);
if (!xlat) return -1;
- xlat_func_args(xlat, protocol_encode_xlat_args);
+ xlat_func_args_set(xlat, protocol_encode_xlat_args);
/* coverity[suspicious_sizeof] */
xlat_async_instantiate_set(xlat, protocol_xlat_instantiate, fr_test_point_pair_encode_t *, NULL, tp_encode);
xlat_internal(xlat);
*/
#define XLAT_REGISTER_ARGS(_xlat, _func, _return_type, _args) \
do { \
- if (!(xlat = xlat_register(NULL, _xlat, _func, _return_type, XLAT_FLAG_PURE))) return -1; \
- xlat_func_args(xlat, _args); \
+ if (!(xlat = xlat_register(NULL, _xlat, _func, _return_type))) return -1; \
+ xlat_func_args_set(xlat, _args); \
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE); \
xlat_internal(xlat); \
} while (0)
#undef XLAT_REGISTER_ARGS
#define XLAT_REGISTER_ARGS(_xlat, _func, _return_type, _args) \
do { \
- if (!(xlat = xlat_register(NULL, _xlat, _func, _return_type, NULL))) return -1; \
- xlat_func_args(xlat, _args); \
+ if (!(xlat = xlat_register(NULL, _xlat, _func, _return_type))) return -1; \
+ xlat_func_args_set(xlat, _args); \
xlat_internal(xlat); \
} while (0)
XLAT_REGISTER_ARGS("flatten", xlat_func_flatten, FR_TYPE_NULL, xlat_func_debug_attr_args); /* takes an attribute reference */
XLAT_REGISTER_ARGS("unflatten", xlat_func_unflatten, FR_TYPE_NULL, xlat_func_debug_attr_args); /* takes an attribute reference */
- xlat = xlat_register(NULL, "untaint", xlat_func_untaint, FR_TYPE_VOID, NULL);
+ xlat = xlat_register(NULL, "untaint", xlat_func_untaint, FR_TYPE_VOID);
xlat_internal(xlat);
- xlat = xlat_register(NULL, "taint", xlat_func_taint, FR_TYPE_VOID, NULL);
+ xlat = xlat_register(NULL, "taint", xlat_func_taint, FR_TYPE_VOID);
xlat_internal(xlat);
/*
*/
#define XLAT_REGISTER_MONO(_xlat, _func, _return_type, _arg) \
do { \
- if (!(xlat = xlat_register(NULL, _xlat, _func, _return_type, XLAT_FLAG_PURE))) return -1; \
- xlat_func_mono(xlat, _arg); \
+ if (!(xlat = xlat_register(NULL, _xlat, _func, _return_type))) return -1; \
+ xlat_func_mono_set(xlat, _arg); \
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE); \
xlat_internal(xlat); \
} while (0)
XLAT_REGISTER_MONO("md5", xlat_func_md5, FR_TYPE_OCTETS, xlat_func_md5_arg);
XLAT_REGISTER_MONO("pack", xlat_func_pack, FR_TYPE_OCTETS, xlat_func_pack_arg);
#if defined(HAVE_REGEX_PCRE) || defined(HAVE_REGEX_PCRE2)
- xlat = xlat_register(NULL, "regex", xlat_func_regex, FR_TYPE_STRING, NULL);
+ xlat = xlat_register(NULL, "regex", xlat_func_regex, FR_TYPE_STRING);
xlat_internal(xlat);
#endif
XLAT_REGISTER_MONO("sha1", xlat_func_sha1, FR_TYPE_OCTETS, xlat_func_sha_arg);
#undef XLAT_REGISTER_MONO
#define XLAT_REGISTER_MONO(_xlat, _func, _return_type, _arg) \
do { \
- if (!(xlat = xlat_register(NULL, _xlat, _func, _return_type, NULL))) return -1; \
- xlat_func_mono(xlat, _arg); \
+ if (!(xlat = xlat_register(NULL, _xlat, _func, _return_type))) return -1; \
+ xlat_func_mono_set(xlat, _arg); \
xlat_internal(xlat); \
} while (0)
XLAT_REGISTER_MONO("rand", xlat_func_rand, FR_TYPE_UINT64, xlat_func_rand_arg);
XLAT_REGISTER_MONO("randstr", xlat_func_randstr, FR_TYPE_STRING, xlat_func_randstr_arg);
- xlat = xlat_register(NULL, "module", xlat_func_module, FR_TYPE_STRING, NULL);
+ xlat = xlat_register(NULL, "module", xlat_func_module, FR_TYPE_STRING);
xlat_internal(xlat);
return xlat_register_expressions();
}
/*
- * The argument isn't required. Just omit it. xlat_func_args() enforces
+ * The argument isn't required. Just omit it. xlat_func_args_set() enforces
* that optional arguments are at the end of the argument list.
*/
return XLAT_ACTION_DONE;
#undef XLAT_REGISTER_BINARY_OP
#define XLAT_REGISTER_BINARY_OP(_op, _name) \
do { \
- if (!(xlat = xlat_register(NULL, "op_" STRINGIFY(_name), xlat_func_op_ ## _name, FR_TYPE_VOID, XLAT_FLAG_PURE))) return -1; \
- xlat_func_args(xlat, binary_op_xlat_args); \
+ if (!(xlat = xlat_register(NULL, "op_" STRINGIFY(_name), xlat_func_op_ ## _name, FR_TYPE_VOID))) return -1; \
+ xlat_func_args_set(xlat, binary_op_xlat_args); \
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE); \
xlat_internal(xlat); \
xlat_print_set(xlat, xlat_expr_print_binary); \
xlat_async_instantiate_set(xlat, xlat_function_args_to_tmpl, NULL, NULL, NULL); \
#undef XLAT_REGISTER_BINARY_CMP
#define XLAT_REGISTER_BINARY_CMP(_op, _name) \
do { \
- if (!(xlat = xlat_register(NULL, "cmp_" STRINGIFY(_name), xlat_func_cmp_ ## _name, FR_TYPE_VOID, XLAT_FLAG_PURE))) return -1; \
- xlat_func_args(xlat, binary_op_xlat_args); \
+ if (!(xlat = xlat_register(NULL, "cmp_" STRINGIFY(_name), xlat_func_cmp_ ## _name, FR_TYPE_VOID))) return -1; \
+ xlat_func_args_set(xlat, binary_op_xlat_args); \
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE); \
xlat_internal(xlat); \
xlat_print_set(xlat, xlat_expr_print_binary); \
xlat_resolve_set(xlat, xlat_expr_resolve_binary); \
#undef XLAT_REGISTER_NARY_OP
#define XLAT_REGISTER_NARY_OP(_op, _name, _func_name) \
do { \
- if (!(xlat = xlat_register(NULL, STRINGIFY(_name), xlat_func_ ## _func_name, FR_TYPE_VOID, XLAT_FLAG_PURE))) return -1; \
+ if (!(xlat = xlat_register(NULL, STRINGIFY(_name), xlat_func_ ## _func_name, FR_TYPE_VOID))) return -1; \
xlat_async_instantiate_set(xlat, xlat_instantiate_ ## _func_name, xlat_ ## _func_name ## _inst_t, NULL, NULL); \
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE); \
xlat_internal(xlat); \
xlat_print_set(xlat, xlat_expr_print_ ## _func_name); \
xlat_purify_set(xlat, xlat_expr_logical_purify); \
#undef XLAT_REGISTER_REGEX_OP
#define XLAT_REGISTER_REGEX_OP(_op, _name) \
do { \
- if (!(xlat = xlat_register(NULL, STRINGIFY(_name), xlat_func_ ## _name, FR_TYPE_VOID, XLAT_FLAG_PURE))) return -1; \
- xlat_func_args(xlat, regex_op_xlat_args); \
+ if (!(xlat = xlat_register(NULL, STRINGIFY(_name), xlat_func_ ## _name, FR_TYPE_VOID))) return -1; \
+ xlat_func_args_set(xlat, regex_op_xlat_args); \
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE); \
xlat_async_instantiate_set(xlat, xlat_instantiate_regex, xlat_regex_inst_t, NULL, NULL); \
xlat_print_set(xlat, xlat_expr_print_regex); \
xlat_internal(xlat); \
#define XLAT_REGISTER_MONO(_xlat, _func, _arg) \
do { \
- if (!(xlat = xlat_register(NULL, _xlat, _func, FR_TYPE_VOID, NULL))) return -1; \
- xlat_func_mono(xlat, _arg); \
+ if (!(xlat = xlat_register(NULL, _xlat, _func, FR_TYPE_VOID))) return -1; \
+ xlat_func_mono_set(xlat, _arg); \
xlat_internal(xlat); \
} while (0)
#define XLAT_REGISTER_UNARY(_op, _xlat, _func) \
do { \
- if (!(xlat = xlat_register(NULL, _xlat, _func, FR_TYPE_VOID, XLAT_FLAG_PURE))) return -1; \
- xlat_func_args(xlat, unary_op_xlat_args); \
+ if (!(xlat = xlat_register(NULL, _xlat, _func, FR_TYPE_VOID))) return -1; \
+ xlat_func_args_set(xlat, unary_op_xlat_args); \
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE); \
xlat_internal(xlat); \
xlat_print_set(xlat, xlat_expr_print_unary); \
xlat->token = _op; \
/*
* Callback wrapper around old paircmp() API.
*/
- if (!(xlat = xlat_register(NULL, "paircmp", xlat_paircmp_func, FR_TYPE_VOID, NULL))) return -1; /* never pure! */
- xlat_func_args(xlat, xlat_paircmp_xlat_args);
+ if (!(xlat = xlat_register(NULL, "paircmp", xlat_paircmp_func, FR_TYPE_VOID))) return -1; /* never pure! */
+ xlat_func_args_set(xlat, xlat_paircmp_xlat_args);
xlat_internal(xlat);
return 0;
return -1;
}
- xlat = xlat_register_module(inst, mctx, mctx->inst->name, always_xlat, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, always_xlat_args);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, always_xlat, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, always_xlat_args);
return 0;
}
/*
* Register the cache xlat function
*/
- xlat = xlat_register_module(inst, mctx, mctx->inst->name, cache_xlat, FR_TYPE_VOID, 0);
- xlat_func_args(xlat, cache_xlat_args);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, cache_xlat, FR_TYPE_VOID);
+ xlat_func_args_set(xlat, cache_xlat_args);
return 0;
}
{
xlat_t *xlat;
- xlat = xlat_register(NULL, "chap_password", xlat_func_chap_password, FR_TYPE_OCTETS, NULL);
+ xlat = xlat_register(NULL, "chap_password", xlat_func_chap_password, FR_TYPE_OCTETS);
if (!xlat) return -1;
- xlat_func_args(xlat, xlat_func_chap_password_args);
+ xlat_func_args_set(xlat, xlat_func_chap_password_args);
return 0;
}
* Register decrypt xlat
*/
xlat_name = talloc_asprintf(inst, "%s_decrypt", mctx->inst->name);
- xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_decrypt_xlat, FR_TYPE_STRING, NULL);
- xlat_func_mono(xlat, cipher_rsa_decrypt_xlat_arg);
+ xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_decrypt_xlat, FR_TYPE_STRING);
+ xlat_func_mono_set(xlat, cipher_rsa_decrypt_xlat_arg);
talloc_free(xlat_name);
/*
* Verify sign xlat
*/
xlat_name = talloc_asprintf(inst, "%s_verify", mctx->inst->name);
- xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_verify_xlat, FR_TYPE_BOOL, NULL);
- xlat_func_args(xlat, cipher_rsa_verify_xlat_arg);
+ xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_verify_xlat, FR_TYPE_BOOL);
+ xlat_func_args_set(xlat, cipher_rsa_verify_xlat_arg);
talloc_free(xlat_name);
}
* Register encrypt xlat
*/
xlat_name = talloc_asprintf(inst, "%s_encrypt", mctx->inst->name);
- xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_encrypt_xlat, FR_TYPE_OCTETS, NULL);
- xlat_func_mono(xlat, cipher_rsa_encrypt_xlat_arg);
+ xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_encrypt_xlat, FR_TYPE_OCTETS);
+ xlat_func_mono_set(xlat, cipher_rsa_encrypt_xlat_arg);
talloc_free(xlat_name);
/*
* Register sign xlat
*/
xlat_name = talloc_asprintf(inst, "%s_sign", mctx->inst->name);
- xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_sign_xlat, FR_TYPE_OCTETS, NULL);
- xlat_func_mono(xlat, cipher_rsa_sign_xlat_arg);
+ xlat = xlat_register_module(inst, mctx, xlat_name, cipher_rsa_sign_xlat, FR_TYPE_OCTETS);
+ xlat_func_mono_set(xlat, cipher_rsa_sign_xlat_arg);
talloc_free(xlat_name);
/*
* so we can optimise for return types.
*/
xlat_name = talloc_asprintf(inst, "%s_certificate", mctx->inst->name);
- xlat = xlat_register_module(inst, mctx, xlat_name, cipher_certificate_xlat, FR_TYPE_VOID, NULL);
- xlat_func_args(xlat, cipher_certificate_xlat_args);
+ xlat = xlat_register_module(inst, mctx, xlat_name, cipher_certificate_xlat, FR_TYPE_VOID);
+ xlat_func_args_set(xlat, cipher_certificate_xlat_args);
talloc_free(xlat_name);
}
{
xlat_t *xlat;
- xlat = xlat_register(NULL, "client", xlat_client, FR_TYPE_STRING, NULL);
+ xlat = xlat_register(NULL, "client", xlat_client, FR_TYPE_STRING);
if (!xlat) return -1;
- xlat_func_args(xlat, xlat_client_args);
+ xlat_func_args_set(xlat, xlat_client_args);
map_proc_register(NULL, "client", map_proc_client, NULL, 0);
rlm_date_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_date_t );
xlat_t *xlat;
- xlat = xlat_register_module(inst, mctx, mctx->inst->name, xlat_date_convert, FR_TYPE_VOID, NULL);
- xlat_func_args(xlat, xlat_date_convert_args);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, xlat_date_convert, FR_TYPE_VOID);
+ xlat_func_args_set(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_module(inst, mctx, mctx->inst->name, xlat_delay, FR_TYPE_TIME_DELTA, 0);
- xlat_func_args(xlat, xlat_delay_args);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, xlat_delay, FR_TYPE_TIME_DELTA);
+ xlat_func_args_set(xlat, xlat_delay_args);
return 0;
}
*/
if (cf_section_name2(mctx->inst->conf) != NULL) return 0;
- xlat = xlat_register_module(inst, mctx, "attr_by_num", xlat_dict_attr_by_num, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, xlat_dict_attr_by_num_args);
- xlat = xlat_register_module(inst, mctx, "attr_by_oid", xlat_dict_attr_by_oid, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, xlat_dict_attr_by_oid_args);
- xlat = xlat_register_module(inst, mctx, "vendor", xlat_vendor, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, xlat_vendor_args);
- xlat = xlat_register_module(inst, mctx, "vendor_num", xlat_vendor_num, FR_TYPE_UINT32, NULL);
- xlat_func_args(xlat, xlat_vendor_num_args);
- xlat = xlat_register_module(inst, mctx, "attr", xlat_attr, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, xlat_attr_args);
- xlat = xlat_register_module(inst, mctx, "attr_num", xlat_attr_num, FR_TYPE_UINT32, NULL);
- xlat_func_args(xlat, xlat_attr_num_args);
+ xlat = xlat_register_module(inst, mctx, "attr_by_num", xlat_dict_attr_by_num, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, xlat_dict_attr_by_num_args);
+ xlat = xlat_register_module(inst, mctx, "attr_by_oid", xlat_dict_attr_by_oid, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, xlat_dict_attr_by_oid_args);
+ xlat = xlat_register_module(inst, mctx, "vendor", xlat_vendor, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, xlat_vendor_args);
+ xlat = xlat_register_module(inst, mctx, "vendor_num", xlat_vendor_num, FR_TYPE_UINT32);
+ xlat_func_args_set(xlat, xlat_vendor_num_args);
+ xlat = xlat_register_module(inst, mctx, "attr", xlat_attr, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, xlat_attr_args);
+ xlat = xlat_register_module(inst, mctx, "attr_num", xlat_attr_num, FR_TYPE_UINT32);
+ xlat_func_args_set(xlat, xlat_attr_num_args);
return 0;
}
xlat_t *xlat;
MEM(unescape = talloc_asprintf(NULL, "un%s", mctx->inst->name));
- xlat = xlat_register_module(NULL, mctx, mctx->inst->name, escape_xlat, FR_TYPE_STRING, XLAT_FLAG_PURE);
- xlat_func_mono(xlat, escape_xlat_arg);
+ xlat = xlat_register_module(NULL, mctx, mctx->inst->name, escape_xlat, FR_TYPE_STRING);
+ xlat_func_mono_set(xlat, escape_xlat_arg);
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE);
- xlat = xlat_register_module(NULL, mctx, unescape, unescape_xlat, FR_TYPE_STRING, XLAT_FLAG_PURE);
- xlat_func_mono(xlat, unescape_xlat_arg);
+ xlat = xlat_register_module(NULL, mctx, unescape, unescape_xlat, FR_TYPE_STRING);
+ xlat_func_mono_set(xlat, unescape_xlat_arg);
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE);
talloc_free(unescape);
return 0;
}
};
- xlat = xlat_register_module(NULL, mctx, mctx->inst->name, exec_xlat, FR_TYPE_STRING, 0);
- xlat_func_args(xlat, exec_xlat_args);
+ xlat = xlat_register_module(NULL, mctx, mctx->inst->name, exec_xlat, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, exec_xlat_args);
if (inst->input) {
if ((tmpl_afrom_attr_substr(inst, NULL, &inst->input_list,
rlm_icmp_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_icmp_t);
xlat_t *xlat;
- xlat = xlat_register_module(inst, mctx, mctx->inst->name, xlat_icmp, FR_TYPE_BOOL, 0);
- xlat_func_args(xlat, xlat_icmp_args);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, xlat_icmp, FR_TYPE_BOOL);
+ xlat_func_args_set(xlat, xlat_icmp_args);
FR_TIME_DELTA_BOUND_CHECK("timeout", inst->timeout, >=, fr_time_delta_from_msec(100)); /* 1/10s minimum timeout */
FR_TIME_DELTA_BOUND_CHECK("timeout", inst->timeout, <=, fr_time_delta_from_sec(10));
rlm_idn_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_idn_t);
xlat_t *xlat;
- xlat = xlat_register_module(inst, mctx, mctx->inst->name, xlat_idna, FR_TYPE_STRING, XLAT_FLAG_PURE);
- xlat_func_mono(xlat, xlat_idna_arg);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, xlat_idna, FR_TYPE_STRING);
+ xlat_func_mono_set(xlat, xlat_idna_arg);
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE);
return 0;
}
char *name;
fr_json_format_t *format = inst->format;
- xlat = xlat_register_module(inst, mctx, "jsonquote", json_quote_xlat, FR_TYPE_STRING, NULL);
- if (xlat) xlat_func_mono(xlat, json_quote_xlat_arg);
- xlat = xlat_register_module(inst, mctx, "jpathvalidate", jpath_validate_xlat, FR_TYPE_STRING, NULL);
- if (xlat) xlat_func_mono(xlat, jpath_validate_xlat_arg);
+ xlat = xlat_register_module(inst, mctx, "jsonquote", json_quote_xlat, FR_TYPE_STRING);
+ if (xlat) xlat_func_mono_set(xlat, json_quote_xlat_arg);
+ xlat = xlat_register_module(inst, mctx, "jpathvalidate", jpath_validate_xlat, FR_TYPE_STRING);
+ if (xlat) xlat_func_mono_set(xlat, jpath_validate_xlat_arg);
name = talloc_asprintf(inst, "%s_encode", mctx->inst->name);
- xlat = xlat_register_module(inst, mctx, name, json_encode_xlat, FR_TYPE_STRING, NULL);
- xlat_func_mono(xlat, json_encode_xlat_arg);
+ xlat = xlat_register_module(inst, mctx, name, json_encode_xlat, FR_TYPE_STRING);
+ xlat_func_mono_set(xlat, json_encode_xlat_arg);
talloc_free(name);
/*
inst->cache_da = inst->group_da; /* Default to the group_da */
}
- xlat = xlat_register_module(NULL, mctx, mctx->inst->name, ldap_xlat, FR_TYPE_STRING, NULL);
- xlat_func_mono(xlat, ldap_xlat_arg);
+ xlat = xlat_register_module(NULL, mctx, mctx->inst->name, ldap_xlat, FR_TYPE_STRING);
+ xlat_func_mono_set(xlat, ldap_xlat_arg);
- xlat = xlat_register_module(NULL, mctx, "ldap_escape", ldap_escape_xlat, FR_TYPE_STRING, XLAT_FLAG_PURE);
- if (xlat) xlat_func_mono(xlat, ldap_escape_xlat_arg);
- xlat = xlat_register_module(NULL, mctx, "ldap_unescape", ldap_unescape_xlat, FR_TYPE_STRING, XLAT_FLAG_PURE);
- if (xlat) xlat_func_mono(xlat, ldap_escape_xlat_arg);
+ xlat = xlat_register_module(NULL, mctx, "ldap_escape", ldap_escape_xlat, FR_TYPE_STRING);
+ if (xlat) {
+ xlat_func_mono_set(xlat, ldap_escape_xlat_arg);
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE);
+ }
+ xlat = xlat_register_module(NULL, mctx, "ldap_unescape", ldap_unescape_xlat, FR_TYPE_STRING);
+ if (xlat) {
+ xlat_func_mono_set(xlat, ldap_escape_xlat_arg);
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE);
+ }
map_proc_register(inst, mctx->inst->name, mod_map_proc, ldap_map_verify, 0);
XLAT_ARG_PARSER_TERMINATOR
};
- xlat = xlat_register_module(inst, mctx, mctx->inst->name, linelog_xlat, FR_TYPE_SIZE, 0);
- xlat_func_mono(xlat, linelog_xlat_args);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, linelog_xlat, FR_TYPE_SIZE);
+ xlat_func_mono_set(xlat, linelog_xlat_args);
return 0;
}
rlm_mschap_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_mschap_t);
xlat_t *xlat;
- xlat = xlat_register_module(inst, mctx, mctx->inst->name, mschap_xlat, FR_TYPE_VOID, NULL);
- xlat_func_args(xlat, mschap_xlat_args);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, mschap_xlat, FR_TYPE_VOID);
+ xlat_func_args_set(xlat, mschap_xlat_args);
return 0;
}
{
xlat_t *xlat;
- xlat = xlat_register_module(NULL, mctx, mctx->inst->name, perl_xlat, FR_TYPE_VOID, NULL);
- xlat_func_args(xlat, perl_xlat_args);
+ xlat = xlat_register_module(NULL, mctx, mctx->inst->name, perl_xlat, FR_TYPE_VOID);
+ xlat_func_args_set(xlat, perl_xlat_args);
return 0;
}
char *name;
xlat_t *xlat;
- xlat = xlat_register_module(inst, mctx, mctx->inst->name, redis_xlat, FR_TYPE_VOID, NULL);
- xlat_func_args(xlat, redis_args);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, redis_xlat, FR_TYPE_VOID);
+ xlat_func_args_set(xlat, redis_args);
/*
* %(redis_node:<key>[ idx])
*/
name = talloc_asprintf(NULL, "%s_node", mctx->inst->name);
- xlat = xlat_register_module(inst, mctx, name, redis_node_xlat, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, redis_node_xlat_args);
+ xlat = xlat_register_module(inst, mctx, name, redis_node_xlat, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, redis_node_xlat_args);
talloc_free(name);
name = talloc_asprintf(NULL, "%s_remap", mctx->inst->name);
- xlat = xlat_register_module(inst, mctx, name, redis_remap_xlat, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, redis_remap_xlat_args);
+ xlat = xlat_register_module(inst, mctx, name, redis_remap_xlat, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, redis_remap_xlat_args);
talloc_free(name);
return 0;
rlm_rest_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_rest_t);
xlat_t *xlat;
- xlat = xlat_register_module(inst, mctx, mctx->inst->name, rest_xlat, FR_TYPE_STRING, 0);
- xlat_func_args(xlat, rest_xlat_args);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, rest_xlat, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, rest_xlat_args);
return 0;
}
rlm_soh_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_soh_t);
xlat_t *xlat;
- xlat = xlat_register_module(inst, mctx, mctx->inst->name, soh_xlat, FR_TYPE_STRING, NULL);
- xlat_func_args(xlat, soh_xlat_args);
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, soh_xlat, FR_TYPE_STRING);
+ xlat_func_args_set(xlat, soh_xlat_args);
return 0;
}
/*
* Register the SQL xlat function
*/
- xlat = xlat_register_module(inst, mctx, mctx->inst->name, sql_xlat, FR_TYPE_VOID, NULL); /* Returns an integer sometimes */
+ xlat = xlat_register_module(inst, mctx, mctx->inst->name, sql_xlat, FR_TYPE_VOID); /* Returns an integer sometimes */
/*
* The xlat escape function needs access to inst - so
sql_xlat_arg[0].uctx = inst;
sql_xlat_arg[1] = (xlat_arg_parser_t)XLAT_ARG_PARSER_TERMINATOR;
- xlat_func_mono(xlat, sql_xlat_arg);
+ xlat_func_mono_set(xlat, sql_xlat_arg);
/*
* Register the SQL map processor function
}
if (!cf_section_name2(mctx->inst->conf)) {
- if (!(xlat = xlat_register_module(inst, mctx, "test_trigger", trigger_test_xlat, FR_TYPE_BOOL, NULL))) return -1;
- xlat_func_args(xlat, trigger_test_xlat_args);
+ if (!(xlat = xlat_register_module(inst, mctx, "test_trigger", trigger_test_xlat, FR_TYPE_BOOL))) return -1;
+ xlat_func_args_set(xlat, trigger_test_xlat_args);
- if (!(xlat = xlat_register_module(inst, mctx, "test", test_xlat, FR_TYPE_STRING, NULL))) return -1;
- xlat_func_args(xlat, test_xlat_args);
+ if (!(xlat = xlat_register_module(inst, mctx, "test", test_xlat, FR_TYPE_STRING))) return -1;
+ xlat_func_args_set(xlat, test_xlat_args);
} else {
- if (!(xlat = xlat_register_module(inst, mctx, mctx->inst->name, test_xlat, FR_TYPE_VOID, NULL))) return -1;
- xlat_func_args(xlat, test_xlat_args);
+ if (!(xlat = xlat_register_module(inst, mctx, mctx->inst->name, test_xlat, FR_TYPE_VOID))) return -1;
+ xlat_func_args_set(xlat, test_xlat_args);
}
return 0;
return -1;
}
- if(!(xlat = xlat_register_module(NULL, mctx, mctx->inst->name, xlat_unbound, FR_TYPE_VOID, 0))) return -1;
- xlat_func_args(xlat, xlat_unbound_args);
+ if(!(xlat = xlat_register_module(NULL, mctx, mctx->inst->name, xlat_unbound, FR_TYPE_VOID))) return -1;
+ xlat_func_args_set(xlat, xlat_unbound_args);
return 0;
}
{
xlat_t *xlat;
- xlat = xlat_register_module(NULL, mctx, "unpack", unpack_xlat, FR_TYPE_VOID, XLAT_FLAG_PURE);
- if (xlat) xlat_func_args(xlat, unpack_xlat_args);
+ xlat = xlat_register_module(NULL, mctx, "unpack", unpack_xlat, FR_TYPE_VOID);
+ if (xlat) {
+ xlat_func_args_set(xlat, unpack_xlat_args);
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE);
+ }
return 0;
}
}
#endif
- xlat = xlat_register_module(inst, mctx, "modhextohex", modhex_to_hex_xlat, FR_TYPE_STRING, XLAT_FLAG_PURE);
- if (xlat) xlat_func_mono(xlat, modhex_to_hex_xlat_arg);
-
+ xlat = xlat_register_module(inst, mctx, "modhextohex", modhex_to_hex_xlat, FR_TYPE_STRING);
+ if (xlat) {
+ xlat_func_mono_set(xlat, modhex_to_hex_xlat_arg);
+ xlat_func_flags_set(xlat, XLAT_FLAG_PURE);
+ }
return 0;
}