The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Loading...
Searching...
No Matches
xlat.h
Go to the documentation of this file.
1#pragma once
2/*
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
16 */
17
18/**
19 * $Id: 6eaa613fc9694ec5fda12dc74d47aea1571659a3 $
20 *
21 * @file lib/unlang/xlat.h
22 * @brief xlat expansion parsing and evaluation API.
23 *
24 * @copyright 2015 The FreeRADIUS server project
25 */
26RCSIDH(xlat_h, "$Id: 6eaa613fc9694ec5fda12dc74d47aea1571659a3 $")
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32#include <freeradius-devel/util/retry.h>
33
34/*
35 * Forward declarations
36 */
37typedef enum {
38 XLAT_ACTION_PUSH_CHILD = 1, //!< A deeper level of nesting needs to be evaluated.
39 XLAT_ACTION_PUSH_UNLANG, //!< An xlat function pushed an unlang frame onto the unlang stack.
40 ///< This frame needs to be evaluated, and then we need to call
41 ///< the xlat's resume function.
42 XLAT_ACTION_YIELD, //!< An xlat function pushed a resume frame onto the stack.
43 XLAT_ACTION_DONE, //!< We're done evaluating this level of nesting.
44 XLAT_ACTION_FAIL //!< An xlat function failed.
46
47typedef struct xlat_inst_s xlat_inst_t;
49
50#include <freeradius-devel/server/request.h>
51
52typedef ssize_t (*xlat_escape_legacy_t)(request_t *request, char *out, size_t outlen, char const *in, void *arg);
53
54#include <freeradius-devel/server/cf_util.h>
55#include <freeradius-devel/server/signal.h>
56#include <freeradius-devel/server/tmpl.h>
57
58#include <freeradius-devel/util/heap.h>
59#include <freeradius-devel/util/pair.h>
60#include <freeradius-devel/util/sbuff.h>
61#include <freeradius-devel/util/time.h>
62#include <freeradius-devel/util/value.h>
63
64#include <freeradius-devel/unlang/call_env.h>
65#include <freeradius-devel/unlang/xlat_ctx.h>
66#include <freeradius-devel/unlang/interpret.h>
67
68/** Instance data for an xlat expansion node
69 *
70 */
72 fr_heap_index_t idx; //!< Entry in heap of xlat instances.
73 ///< Identical instances are used for
74 ///< global instance data and thread-specific
75 ///< instance data.
76
77 xlat_exp_t *node; //!< Node this data relates to.
78 void *data; //!< xlat node specific instance data.
79 call_env_t const *call_env; //!< Per call environment.
80};
81
82/** Thread specific instance data for xlat expansion node
83 *
84 */
86 fr_heap_index_t idx; //!< Entry in heap of xlat thread instances.
87 ///< Identical instances are used for
88 ///< global instance data and thread-specific
89 ///< instance data.
90
91 fr_event_list_t *el; //!< Event list associated with this thread.
92
93 xlat_exp_t const *node; //!< Node this data relates to.
94 void *data; //!< Thread specific instance data.
95
96 module_ctx_t const *mctx; //!< A synthesised module calling ctx containing
97 ///< module global and thread instance data.
98
99 uint64_t total_calls; //! total number of times we've been called
100 uint64_t active_callers; //! number of active callers. i.e. number of current yields
101};
102
103typedef struct xlat_s xlat_t;
104
105/** Flags that control resolution and evaluation
106 *
107 */
108typedef struct {
109 uint8_t needs_resolving : 1; //!< Needs pass2 resolution.
110 uint8_t pure : 1; //!< has no external side effects, true for BOX, LITERAL, and some functions
111 uint8_t impure_func : 1; //!< xlat contains an impure function
112 uint8_t can_purify : 1; //!< if the xlat has a pure function with pure arguments.
113
114 uint8_t constant : 1; //!< xlat is just tmpl_attr_tail_data, or XLAT_BOX
115 uint8_t xlat : 1; //!< it's an xlat wrapper
117
118#define XLAT_FLAGS_INIT ((xlat_flags_t) { .pure = true, .can_purify = true, .constant = true, })
119
121extern size_t xlat_action_table_len;
122
123/** A function used to escape an argument passed to an xlat
124 *
125 * @param[in] request being processed. Used mostly for debugging.
126 * @param[in,out] vb to escape
127 * @param[in] uctx a "context" for the escaping
128 * @return
129 * - 0 on success.
130 * - -1 on failure.
131 */
132typedef int (*xlat_escape_func_t)(request_t *request, fr_value_box_t *vb, void *uctx);
133
134typedef enum {
136 XLAT_ARG_VARIADIC_EMPTY_SQUASH = 1, //!< Empty argument groups are removed.
137 XLAT_ARG_VARIADIC_EMPTY_KEEP = 2, //!< Empty argument groups are left alone,
138 ///< and either passed through as empty groups
139 ///< or null boxes.
141
142/** Definition for a single argument consumend by an xlat function
143 *
144 */
145typedef struct {
146 uint8_t required : 1; //!< Argument must be present, and non-empty.
147 uint8_t concat : 1; //!< Concat boxes together.
148 uint8_t single : 1; //!< Argument must only contain a single box
149 uint8_t allow_wildcard : 1; //!< For parsing the cursor
150 uint8_t will_escape : 1; //!< the function will do escaping and concatenation.
151 uint8_t always_escape : 1; //!< Pass all arguments to escape function not just
152 ///< tainted ones.
153 xlat_arg_parser_variadic_t variadic; //!< All additional boxes should be processed
154 ///< using this definition.
155 fr_type_t type; //!< Type to cast argument to.
156 xlat_escape_func_t func; //!< Function to handle tainted values.
157 fr_value_box_safe_for_t safe_for; //!< Escaped value to set for boxes processed by
158 ///< this escape function.
159 void *uctx; //!< Argument to pass to escape callback.
161
162#define XLAT_ARG_PARSER_CURSOR { .required = true, .single = true, .allow_wildcard = true, .type = FR_TYPE_PAIR_CURSOR, .safe_for = FR_VALUE_BOX_SAFE_FOR_ANY }
163
164typedef struct {
165 tmpl_res_rules_t const *tr_rules; //!< tmpl resolution rules.
166 bool allow_unresolved; //!< If false, all resolution steps must be completed
167 ///< this round, otherwise an error will be produced.
169
170#define XLAT_ARG_PARSER_TERMINATOR { .required = false, .concat = false, .single = false, .variadic = false, \
171 .type = FR_TYPE_NULL, .func = NULL, .uctx = NULL }
172
173/** A callback when the the timeout occurs
174 *
175 * Used when a xlat needs wait for an event.
176 * Typically the callback is set, and then the xlat returns unlang_xlat_yield().
177 *
178 * @note The callback is automatically removed on unlang_interpret_mark_runnable(), i.e. if an event
179 * on a registered FD occurs before the timeout event fires.
180 *
181 * @param[in] xctx xlat calling ctx. Contains all instance data.
182 * @param[in] request the request.
183 * @param[in] fired the time the timeout event actually fired.
184 */
185typedef void (*fr_unlang_xlat_timeout_t)(xlat_ctx_t const *xctx, request_t *request, fr_time_t fired);
186
187/** A callback when the the timeout occurs
188 *
189 * Used when a xlat needs wait for an event.
190 * Typically the callback is set, and then the xlat returns unlang_xlat_yield().
191 *
192 * @note The callback is automatically removed on unlang_interpret_mark_runnable(), i.e. if an event
193 * on a registered FD occurs before the timeout event fires.
194 *
195 * @param[in] xctx xlat calling ctx. Contains all instance data.
196 * @param[in] request the request.
197 * @param[in] retry retry status. "now" is in retry->updated
198 */
199typedef void (*fr_unlang_xlat_retry_t)(xlat_ctx_t const *xctx, request_t *request, fr_retry_t const *retry);
200
201/** A callback when the FD is ready for reading
202 *
203 * Used when a xlat needs to read from an FD. Typically the callback is set, and then the
204 * xlat returns unlang_xlat_yield().
205 *
206 * @note The callback is automatically removed on unlang_interpret_mark_runnable(), so
207 *
208 * @param[in] xctx xlat calling ctx. Contains all instance data.
209 * @param[in] request the current request.
210 * @param[in] fd the file descriptor.
211 */
212typedef void (*fr_unlang_xlat_fd_event_t)(xlat_ctx_t const *xctx, request_t *request, int fd);
213
214/** xlat callback function
215 *
216 * Ingests a list of value boxes as arguments.
217 *
218 * @param[in] ctx to allocate any fr_value_box_t in.
219 * @param[out] out Where to append #fr_value_box_t containing the output of
220 * this function.
221 * @param[in] xctx xlat calling ctx. Contains all instance data and the resume
222 * ctx if this function is being resumed.
223 * @param[in] request The current request.
224 * @param[in] in Input arguments.
225 * @return
226 * - XLAT_ACTION_YIELD xlat function is waiting on an I/O event and
227 * has pushed a resumption function onto the stack.
228 * - XLAT_ACTION_DONE xlat function completed. This does not necessarily
229 * mean it turned a result.
230 * - XLAT_ACTION_FAIL the xlat function failed.
231 */
232typedef xlat_action_t (*xlat_func_t)(TALLOC_CTX *ctx, fr_dcursor_t *out,
233 xlat_ctx_t const *xctx, request_t *request, fr_value_box_list_t *in);
234
235/** A callback when the request gets a fr_signal_t.
236 *
237 * @note The callback is automatically removed on unlang_interpret_mark_runnable().
238 *
239 * @param[in] request The current request.
240 * @param[in] xctx xlat calling ctx. Contains all instance data.
241 * @param[in] action which is signalling the request.
242 */
243typedef void (*xlat_func_signal_t)(xlat_ctx_t const *xctx, request_t *request, fr_signal_t action);
244
245/** Allocate new instance data for an xlat instance
246 *
247 * @param[in] xctx instantiate/detach calling ctx.
248
249 * @return
250 * - 0 on success.
251 * - -1 on failure.
252 */
253typedef int (*xlat_instantiate_t)(xlat_inst_ctx_t const *xctx);
254
255/** Allocate new thread instance data for an xlat instance
256 *
257 * @param[in] xctx thread instantiate/detach ctx.
258 * @return
259 * - 0 on success.
260 * - -1 on failure.
261 */
263
264/** xlat detach callback
265 *
266 * Is called whenever an xlat_node_t is freed.
267 *
268 * Detach should close all handles associated with the xlat instance, and
269 * free any memory allocated during instantiate.
270 *
271 * @param[in] xctx instantiate/detach calling ctx.
272 * @return
273 * - 0 on success.
274 * - -1 if detach failed.
275 */
276typedef int (*xlat_detach_t)(xlat_inst_ctx_t const *xctx);
277
278/** xlat thread detach callback
279 *
280 * Is called whenever an xlat_node_t is freed (if ephemeral),
281 * or when a thread exits.
282 *
283 * Detach should close all handles associated with the xlat instance, and
284 * free any memory allocated during instantiate.
285 *
286 * @param[in] xctx thread instantiate/detach calling ctx.
287 * @return
288 * - 0 on success.
289 * - -1 if detach failed.
290 */
292
293/** Set the next argument to the next item in the input list or NULL
294 *
295 * @param[in] _list we're extracting arguments from.
296 * @param[in] _prev argument.
297 * @param[in] _curr argument we're populating.
298 */
299#define XLAT_ARGS_NEXT(_list, _prev, _curr) *(_curr) = likely(*(_prev) != NULL) ? fr_value_box_list_next(_list, *(_prev)) : NULL
300
301#define XLAT_ARGS_1(_list, _a) \
302 *(_a) = fr_value_box_list_head(_list)
303
304#define XLAT_ARGS_2(_list, _a, _b) \
305 do { \
306 *(_a) = fr_value_box_list_head(_list); \
307 XLAT_ARGS_NEXT(_list, _a, _b); \
308 } while (0)
309
310#define XLAT_ARGS_3(_list, _a, _b, _c) \
311 do { \
312 *(_a) = fr_value_box_list_head(_list); \
313 XLAT_ARGS_NEXT(_list, _a, _b); \
314 XLAT_ARGS_NEXT(_list, _b, _c); \
315 } while (0)
316
317#define XLAT_ARGS_4(_list, _a, _b, _c, _d) \
318 do { \
319 *(_a) = fr_value_box_list_head(_list); \
320 XLAT_ARGS_NEXT(_list, _a, _b); \
321 XLAT_ARGS_NEXT(_list, _b, _c); \
322 XLAT_ARGS_NEXT(_list, _c, _d); \
323 } while (0)
324
325#define XLAT_ARGS_5(_list, _a, _b, _c, _d, _e) \
326 do { \
327 *(_a) = fr_value_box_list_head(_list); \
328 XLAT_ARGS_NEXT(_list, _a, _b); \
329 XLAT_ARGS_NEXT(_list, _b, _c); \
330 XLAT_ARGS_NEXT(_list, _c, _d); \
331 XLAT_ARGS_NEXT(_list, _d, _e); \
332 } while (0)
333
334#define XLAT_ARGS_6(_list, _a, _b, _c, _d, _e, _f) \
335 do { \
336 *(_a) = fr_value_box_list_head(_list); \
337 XLAT_ARGS_NEXT(_list, _a, _b); \
338 XLAT_ARGS_NEXT(_list, _b, _c); \
339 XLAT_ARGS_NEXT(_list, _c, _d); \
340 XLAT_ARGS_NEXT(_list, _d, _e); \
341 XLAT_ARGS_NEXT(_list, _e, _f); \
342 } while (0)
343
344#define XLAT_ARGS_7(_list, _a, _b, _c, _d, _e, _f, _g) \
345 do { \
346 *(_a) = fr_value_box_list_head(_list); \
347 XLAT_ARGS_NEXT(_list, _a, _b); \
348 XLAT_ARGS_NEXT(_list, _b, _c); \
349 XLAT_ARGS_NEXT(_list, _c, _d); \
350 XLAT_ARGS_NEXT(_list, _d, _e); \
351 XLAT_ARGS_NEXT(_list, _e, _f); \
352 XLAT_ARGS_NEXT(_list, _f, _g); \
353 } while (0)
354
355#define XLAT_ARGS_8(_list, _a, _b, _c, _d, _e, _f, _g, _h) \
356 do { \
357 *(_a) = fr_value_box_list_head(_list); \
358 XLAT_ARGS_NEXT(_list, _a, _b); \
359 XLAT_ARGS_NEXT(_list, _b, _c); \
360 XLAT_ARGS_NEXT(_list, _c, _d); \
361 XLAT_ARGS_NEXT(_list, _d, _e); \
362 XLAT_ARGS_NEXT(_list, _e, _f); \
363 XLAT_ARGS_NEXT(_list, _f, _g); \
364 XLAT_ARGS_NEXT(_list, _g, _h); \
365 } while (0)
366
367/** Trampoline macro for selecting which ``XLAT_ARGS_<num>`` macro to expand
368 *
369 *
370 * @param[in] XLAT_ARGS_N the name of the macro to expand.
371 * Created by concatenating ``XLAT_ARGS_ + <number of variadic arguments>``.
372 * @param[in] _list The input list of value boxes.
373 * @param[in] ... The variadic arguments themselves.
374 */
375#define _XLAT_ARGS_X(XLAT_ARGS_N, _list, ...) XLAT_ARGS_N(_list, __VA_ARGS__)
376
377/** Populate local variables with value boxes from the input list
378 *
379 * @param[in] _list input list to pull arguments from.
380 * @param[in] ... 1-8 output boxes pointers `fr_value_box_t **`
381 * e.g. `XLAT_ARGS(in, &arg0, &arg1, &argN)``.
382 */
383#define XLAT_ARGS(_list, ...) _XLAT_ARGS_X(JOIN(XLAT_ARGS_, VA_NARG(__VA_ARGS__)), _list, __VA_ARGS__)
384
385ssize_t xlat_eval(char *out, size_t outlen, request_t *request, char const *fmt, xlat_escape_legacy_t escape,
386 void const *escape_ctx)
387 CC_HINT(nonnull (1 ,3 ,4));
388
389ssize_t xlat_eval_compiled(char *out, size_t outlen, request_t *request, xlat_exp_head_t const *head,
390 xlat_escape_legacy_t escape, void const *escape_ctx)
391 CC_HINT(nonnull (1 ,3 ,4));
392
393ssize_t xlat_aeval(TALLOC_CTX *ctx, char **out, request_t *request,
394 char const *fmt, xlat_escape_legacy_t escape, void const *escape_ctx)
395 CC_HINT(nonnull(2, 3, 4));
396
397ssize_t xlat_aeval_compiled(TALLOC_CTX *ctx, char **out, request_t *request,
398 xlat_exp_head_t const *head, xlat_escape_legacy_t escape, void const *escape_ctx)
399 CC_HINT(nonnull (2, 3, 4));
400
401int xlat_flatten_to_argv(TALLOC_CTX *ctx, xlat_exp_head_t ***argv, xlat_exp_head_t *head);
402
404 fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules) CC_HINT(nonnull(1,2,3));
405
407 fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules) CC_HINT(nonnull(1,2,3));
408
410 xlat_t const *xlat, fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules,
411 bool spaces) CC_HINT(nonnull(1,2,3,6));
412
414 fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules);
415
417
418static inline fr_slen_t xlat_aprint(TALLOC_CTX *ctx, char **out, xlat_exp_head_t const *head,
419 fr_sbuff_escape_rules_t const *e_rules)
421
422bool xlat_is_truthy(xlat_exp_head_t const *head, bool *out);
423
425
426void xlat_debug(xlat_exp_t const *node);
427
429
431
433
434bool xlat_to_string(TALLOC_CTX *ctx, char **str, xlat_exp_head_t **head);
435
437
438void xlat_debug_attr_list(request_t *request, fr_pair_list_t const *list);
439void xlat_debug_attr_vp(request_t *request, fr_pair_t *vp, tmpl_t const *vpt);
440
442 UNUSED xlat_ctx_t const *xctx,
443 request_t *request, fr_value_box_list_t *args);
444
445/*
446 * xlat_tokenize.c
447 */
448tmpl_t *xlat_to_tmpl_attr(TALLOC_CTX *ctx, xlat_exp_head_t *xlat);
449
450bool xlat_impure_func(xlat_exp_head_t const *head) CC_HINT(nonnull);
451
453
454/*
455 * xlat_alloc.c
456 */
458#define xlat_copy(_ctx, _out, _in) _xlat_copy(NDEBUG_LOCATION_EXP _ctx, _out, _in)
459#ifdef WITH_VERIFY_PTR
460void xlat_exp_verify(xlat_exp_t const *node);
461void xlat_exp_head_verify(xlat_exp_head_t const *head);
462
463# define XLAT_VERIFY(_node) xlat_exp_verify(_node)
464# define XLAT_HEAD_VERIFY(_head) xlat_exp_head_verify(_head)
465#else
466# define XLAT_VERIFY(_node)
467# define XLAT_HEAD_VERIFY(_head)
468#endif
469
470/*
471 * xlat_inst.c
472 */
474
475int xlat_thread_instantiate(TALLOC_CTX *ctx, fr_event_list_t *el);
476
477int xlat_instantiate(void);
478
479void xlat_thread_detach(void);
480
482
484
485int xlat_finalize(xlat_exp_head_t *head, fr_event_list_t *runtime_el); /* xlat_instance_register() or xlat_instantiate_ephemeral() */
486
487void xlat_instances_free(void);
488
489/*
490 * xlat_purify.c
491 */
494
495int xlat_purify_op(TALLOC_CTX *ctx, xlat_exp_t **out, xlat_exp_t *lhs, fr_token_t op, xlat_exp_t *rhs);
496
497/*
498 * xlat.c
499 */
501 void const *rctx, fr_time_t when);
502
503#define XLAT_RESULT_SUCCESS(_p_result) ((_p_result)->rcode == RLM_MODULE_OK)
504
505int unlang_xlat_push(TALLOC_CTX *ctx, unlang_result_t *p_result, fr_value_box_list_t *out,
506 request_t *request, xlat_exp_head_t const *head, bool top_frame)
507 CC_HINT(warn_unused_result);
508
509int unlang_xlat_eval(TALLOC_CTX *ctx, fr_value_box_list_t *out,
510 request_t *request, xlat_exp_head_t const *head)
511 CC_HINT(warn_unused_result);
512
513int unlang_xlat_eval_type(TALLOC_CTX *ctx, fr_value_box_t *out, fr_type_t type, fr_dict_attr_t const *enumv,
514 request_t *request, xlat_exp_head_t const *head)
515 CC_HINT(warn_unused_result);
516
518 xlat_func_t callback, xlat_func_signal_t signal, fr_signal_t sigmask,
519 void *rctx);
520
522 xlat_func_signal_t signal, fr_signal_t sigmask, void *rctx,
523 fr_retry_config_t const *retry_cfg);
524
525/*
526 * xlat_builtin.c
527 */
529int xlat_global_init(void);
531
532#ifdef __cplusplus
533}
534#endif
va_list args
Definition acutest.h:770
static int const char * fmt
Definition acutest.h:573
#define RCSIDH(h, id)
Definition build.h:486
#define NDEBUG_LOCATION_ARGS
Pass caller information to the function.
Definition build.h:263
#define UNUSED
Definition build.h:317
Structure containing both a talloc pool, a list of parsed call_env_pairs.
Definition call_env.h:252
static char const * spaces
Definition dependency.c:370
static fr_slen_t in
Definition dict.h:841
unsigned int fr_heap_index_t
Definition heap.h:80
Stores all information relating to an event list.
Definition event.c:377
fr_type_t
long int ssize_t
unsigned char uint8_t
ssize_t fr_slen_t
Temporary structure to hold arguments for module calls.
Definition module_ctx.h:41
#define SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(_func,...)
static fr_slen_t vpt
Definition tmpl.h:1269
Similar to tmpl_rules_t, but used to specify parameters that may change during subsequent resolution ...
Definition tmpl.h:364
Optional arguments passed to vp_tmpl functions.
Definition tmpl.h:332
fr_signal_t
Signals that can be generated/processed by request signal handlers.
Definition signal.h:38
fr_aka_sim_id_type_t type
fr_pair_t * vp
Stores an attribute, a value and various bits of other data.
Definition pair.h:68
An element in a lexicographically sorted array of name to num mappings.
Definition table.h:49
"server local" time.
Definition time.h:69
enum fr_token fr_token_t
static fr_event_list_t * el
bool xlat_needs_resolving(xlat_exp_head_t const *head)
Check to see if the expansion needs resolving.
fr_heap_index_t idx
Entry in heap of xlat instances.
Definition xlat.h:72
tmpl_res_rules_t const * tr_rules
tmpl resolution rules.
Definition xlat.h:165
tmpl_t * xlat_to_tmpl_attr(TALLOC_CTX *ctx, xlat_exp_head_t *xlat)
Try to convert an xlat to a tmpl for efficiency.
fr_type_t type
Type to cast argument to.
Definition xlat.h:155
int(* xlat_thread_detach_t)(xlat_thread_inst_ctx_t const *xctx)
xlat thread detach callback
Definition xlat.h:291
xlat_exp_t * node
Node this data relates to.
Definition xlat.h:77
uint8_t single
Argument must only contain a single box.
Definition xlat.h:148
int unlang_xlat_eval(TALLOC_CTX *ctx, fr_value_box_list_t *out, request_t *request, xlat_exp_head_t const *head)
Evaluate a "pure" (or not impure) xlat.
Definition xlat.c:728
void * data
Thread specific instance data.
Definition xlat.h:94
uint8_t xlat
it's an xlat wrapper
Definition xlat.h:115
xlat_thread_inst_t * xlat_thread_instance_find(xlat_exp_t const *node)
Retrieve xlat/thread specific instance data.
Definition xlat_inst.c:405
bool xlat_is_literal(xlat_exp_head_t const *head)
Check to see if the expansion consists entirely of value-box elements.
xlat_exp_t const * node
Node this data relates to.
Definition xlat.h:93
int(* xlat_detach_t)(xlat_inst_ctx_t const *xctx)
xlat detach callback
Definition xlat.h:276
void(* fr_unlang_xlat_fd_event_t)(xlat_ctx_t const *xctx, request_t *request, int fd)
A callback when the FD is ready for reading.
Definition xlat.h:212
fr_slen_t xlat_tokenize_condition(TALLOC_CTX *ctx, xlat_exp_head_t **head, fr_sbuff_t *in, fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules))
Definition xlat_expr.c:3152
fr_heap_index_t idx
Entry in heap of xlat thread instances.
Definition xlat.h:86
int xlat_validate_function_args(xlat_exp_t *node)
int xlat_instance_register_func(xlat_exp_t *node)
Callback for creating "permanent" instance data for a xlat_exp_t.
Definition xlat_inst.c:593
uint64_t active_callers
total number of times we've been called
Definition xlat.h:100
static fr_slen_t e_rules bool xlat_is_truthy(xlat_exp_head_t const *head, bool *out)
Allow callers to see if an xlat is truthy.
Definition xlat_expr.c:3187
fr_slen_t xlat_print(fr_sbuff_t *in, xlat_exp_head_t const *node, fr_sbuff_escape_rules_t const *e_rules)
Reconstitute an xlat expression from its constituent nodes.
void * uctx
Argument to pass to escape callback.
Definition xlat.h:159
void xlat_debug_head(xlat_exp_head_t const *head)
void xlat_thread_detach(void)
Destroy any thread specific xlat instances.
Definition xlat_inst.c:487
fr_table_num_sorted_t const xlat_action_table[]
Definition xlat_eval.c:78
bool xlat_impure_func(xlat_exp_head_t const *head)
xlat_escape_func_t func
Function to handle tainted values.
Definition xlat.h:156
fr_event_list_t * el
Event list associated with this thread.
Definition xlat.h:91
fr_slen_t xlat_tokenize(TALLOC_CTX *ctx, xlat_exp_head_t **head, fr_sbuff_t *in, fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules)
Tokenize an xlat expansion.
ssize_t(* xlat_escape_legacy_t)(request_t *request, char *out, size_t outlen, char const *in, void *arg)
Definition xlat.h:52
uint8_t always_escape
Pass all arguments to escape function not just tainted ones.
Definition xlat.h:151
ssize_t xlat_eval_compiled(char *out, size_t outlen, request_t *request, xlat_exp_head_t const *head, xlat_escape_legacy_t escape, void const *escape_ctx))
Definition xlat_eval.c:1811
bool allow_unresolved
If false, all resolution steps must be completed.
Definition xlat.h:166
ssize_t xlat_eval(char *out, size_t outlen, request_t *request, char const *fmt, xlat_escape_legacy_t escape, void const *escape_ctx))
xlat_action_t xlat_transparent(UNUSED TALLOC_CTX *ctx, fr_dcursor_t *out, UNUSED xlat_ctx_t const *xctx, request_t *request, fr_value_box_list_t *args)
xlat_arg_parser_variadic_t
Definition xlat.h:134
@ XLAT_ARG_VARIADIC_EMPTY_KEEP
Empty argument groups are left alone, and either passed through as empty groups or null boxes.
Definition xlat.h:137
@ XLAT_ARG_VARIADIC_EMPTY_SQUASH
Empty argument groups are removed.
Definition xlat.h:136
@ XLAT_ARG_VARIADIC_DISABLED
Definition xlat.h:135
static fr_slen_t head
Definition xlat.h:420
xlat_arg_parser_variadic_t variadic
All additional boxes should be processed using this definition.
Definition xlat.h:153
int xlat_instantiate(void)
Call instantiation functions for all registered, "permanent" xlats.
Definition xlat_inst.c:511
xlat_action_t unlang_xlat_yield_to_retry(request_t *request, xlat_func_t resume, fr_unlang_xlat_retry_t retry, xlat_func_signal_t signal, fr_signal_t sigmask, void *rctx, fr_retry_config_t const *retry_cfg)
Yield a request back to the interpreter, with retries.
Definition xlat.c:680
size_t xlat_action_table_len
Definition xlat_eval.c:84
int xlat_protocols_register(void)
Register xlats for any loaded dictionaries.
void xlat_debug_attr_list(request_t *request, fr_pair_list_t const *list)
void(* xlat_func_signal_t)(xlat_ctx_t const *xctx, request_t *request, fr_signal_t action)
A callback when the request gets a fr_signal_t.
Definition xlat.h:243
uint8_t will_escape
the function will do escaping and concatenation.
Definition xlat.h:150
static fr_slen_t xlat_aprint(TALLOC_CTX *ctx, char **out, xlat_exp_head_t const *head, fr_sbuff_escape_rules_t const *e_rules) 1(xlat_print
ssize_t xlat_aeval_compiled(TALLOC_CTX *ctx, char **out, request_t *request, xlat_exp_head_t const *head, xlat_escape_legacy_t escape, void const *escape_ctx))
Definition xlat_eval.c:1828
fr_value_box_safe_for_t safe_for
Escaped value to set for boxes processed by this escape function.
Definition xlat.h:157
bool xlat_to_string(TALLOC_CTX *ctx, char **str, xlat_exp_head_t **head)
Convert an xlat node to an unescaped literal string and free the original node.
fr_slen_t xlat_tokenize_argv(TALLOC_CTX *ctx, xlat_exp_head_t **head, fr_sbuff_t *in, xlat_t const *xlat, fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules, bool spaces))
Tokenize an xlat expansion into a series of XLAT_TYPE_CHILD arguments.
int xlat_global_init(void)
uint8_t required
Argument must be present, and non-empty.
Definition xlat.h:146
uint8_t allow_wildcard
For parsing the cursor.
Definition xlat.h:149
int xlat_thread_instantiate(TALLOC_CTX *ctx, fr_event_list_t *el)
Create thread specific instance tree and create thread instances.
Definition xlat_inst.c:442
int xlat_purify_op(TALLOC_CTX *ctx, xlat_exp_t **out, xlat_exp_t *lhs, fr_token_t op, xlat_exp_t *rhs)
void(* fr_unlang_xlat_retry_t)(xlat_ctx_t const *xctx, request_t *request, fr_retry_t const *retry)
A callback when the the timeout occurs.
Definition xlat.h:199
int xlat_purify(xlat_exp_head_t *head, unlang_interpret_t *intp)
Purify an xlat.
xlat_action_t(* xlat_func_t)(TALLOC_CTX *ctx, fr_dcursor_t *out, xlat_ctx_t const *xctx, request_t *request, fr_value_box_list_t *in)
xlat callback function
Definition xlat.h:232
void xlat_debug(xlat_exp_t const *node)
int xlat_flatten_to_argv(TALLOC_CTX *ctx, xlat_exp_head_t ***argv, xlat_exp_head_t *head)
Turn am xlat list into an argv[] array, and nuke the input list.
Definition xlat_eval.c:1842
int _xlat_copy(NDEBUG_LOCATION_ARGS TALLOC_CTX *ctx, xlat_exp_head_t *out, xlat_exp_head_t const *in)
Definition xlat_alloc.c:434
uint8_t concat
Concat boxes together.
Definition xlat.h:147
void * data
xlat node specific instance data.
Definition xlat.h:78
uint8_t needs_resolving
Needs pass2 resolution.
Definition xlat.h:109
void xlat_debug_attr_vp(request_t *request, fr_pair_t *vp, tmpl_t const *vpt)
int unlang_xlat_eval_type(TALLOC_CTX *ctx, fr_value_box_t *out, fr_type_t type, fr_dict_attr_t const *enumv, request_t *request, xlat_exp_head_t const *head)
Evaluate a "pure" (or not impure) xlat.
Definition xlat.c:758
uint8_t can_purify
if the xlat has a pure function with pure arguments.
Definition xlat.h:112
xlat_action_t unlang_xlat_yield(request_t *request, xlat_func_t callback, xlat_func_signal_t signal, fr_signal_t sigmask, void *rctx)
Yield a request back to the interpreter from within a module.
Definition xlat.c:560
uint8_t pure
has no external side effects, true for BOX, LITERAL, and some functions
Definition xlat.h:110
void xlat_instances_free(void)
Walk over all registered instance data and free them explicitly.
Definition xlat_inst.c:707
int unlang_xlat_push(TALLOC_CTX *ctx, unlang_result_t *p_result, fr_value_box_list_t *out, request_t *request, xlat_exp_head_t const *head, bool top_frame)
Push a pre-compiled xlat onto the stack for evaluation.
Definition xlat.c:282
int(* xlat_thread_instantiate_t)(xlat_thread_inst_ctx_t const *xctx)
Allocate new thread instance data for an xlat instance.
Definition xlat.h:262
void(* fr_unlang_xlat_timeout_t)(xlat_ctx_t const *xctx, request_t *request, fr_time_t fired)
A callback when the the timeout occurs.
Definition xlat.h:185
int xlat_resolve(xlat_exp_head_t *head, xlat_res_rules_t const *xr_rules)
Walk over an xlat tree recursively, resolving any unresolved functions or references.
uint64_t total_calls
Definition xlat.h:99
uint8_t impure_func
xlat contains an impure function
Definition xlat.h:111
int unlang_xlat_timeout_add(request_t *request, fr_unlang_xlat_timeout_t callback, void const *rctx, fr_time_t when)
Add a timeout for an xlat handler.
Definition xlat.c:151
int xlat_finalize(xlat_exp_head_t *head, fr_event_list_t *runtime_el)
Bootstrap static xlats, or instantiate ephemeral ones.
Definition xlat_inst.c:693
xlat_action_t
Definition xlat.h:37
@ XLAT_ACTION_FAIL
An xlat function failed.
Definition xlat.h:44
@ XLAT_ACTION_YIELD
An xlat function pushed a resume frame onto the stack.
Definition xlat.h:42
@ XLAT_ACTION_PUSH_UNLANG
An xlat function pushed an unlang frame onto the unlang stack.
Definition xlat.h:39
@ XLAT_ACTION_PUSH_CHILD
A deeper level of nesting needs to be evaluated.
Definition xlat.h:38
@ XLAT_ACTION_DONE
We're done evaluating this level of nesting.
Definition xlat.h:43
call_env_t const * call_env
Per call environment.
Definition xlat.h:79
int(* xlat_escape_func_t)(request_t *request, fr_value_box_t *vb, void *uctx)
A function used to escape an argument passed to an xlat.
Definition xlat.h:132
uint8_t constant
xlat is just tmpl_attr_tail_data, or XLAT_BOX
Definition xlat.h:114
fr_slen_t xlat_tokenize_expression(TALLOC_CTX *ctx, xlat_exp_head_t **head, fr_sbuff_t *in, fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules))
Definition xlat_expr.c:3124
int xlat_instance_unregister_func(xlat_exp_t *node)
Remove a node from the list of xlat instance data.
Definition xlat_inst.c:548
ssize_t xlat_aeval(TALLOC_CTX *ctx, char **out, request_t *request, char const *fmt, xlat_escape_legacy_t escape, void const *escape_ctx))
Definition xlat_eval.c:1819
void xlat_global_free(void)
int(* xlat_instantiate_t)(xlat_inst_ctx_t const *xctx)
Allocate new instance data for an xlat instance.
Definition xlat.h:253
module_ctx_t const * mctx
A synthesised module calling ctx containing module global and thread instance data.
Definition xlat.h:96
fr_type_t xlat_data_type(xlat_exp_head_t const *head)
Definition for a single argument consumend by an xlat function.
Definition xlat.h:145
Flags that control resolution and evaluation.
Definition xlat.h:108
Instance data for an xlat expansion node.
Definition xlat.h:71
Thread specific instance data for xlat expansion node.
Definition xlat.h:85
uintptr_t fr_value_box_safe_for_t
Escaping that's been applied to a value box.
Definition value.h:160
int nonnull(2, 5))
static size_t char ** out
Definition value.h:1020
An xlat calling ctx.
Definition xlat_ctx.h:49
An xlat instantiation ctx.
Definition xlat_ctx.h:62
An xlat thread instantiation ctx.
Definition xlat_ctx.h:73
An xlat expansion node.
Definition xlat_priv.h:148