The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Loading...
Searching...
No Matches
cf_util.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: f8a95ce4a0a6a22a3420bcb23b535081ec7928f8 $
20 *
21 * @file lib/server/cf_util.h
22 * @brief API to create and manipulate internal format configurations.
23 *
24 * @copyright 2017 The FreeRADIUS server project
25 */
26RCSIDH(conf_file_h, "$Id: f8a95ce4a0a6a22a3420bcb23b535081ec7928f8 $")
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32/*
33 * Export the minimum amount of information about these structs
34 */
35typedef struct cf_item CONF_ITEM; //!< Generic configuration element, extended to become
36 ///< a #CONF_PAIR, a #CONF_SECTION or #CONF_DATA.
37typedef struct cf_section CONF_SECTION; //!< #CONF_ITEM used to group multiple #CONF_PAIR and #CONF_SECTION, together.
38typedef struct cf_pair CONF_PAIR; //!< #CONF_ITEM with an attribute, an operator and a value.
39typedef struct cf_data CONF_DATA; //!< #CONF_ITEM used to associate arbitrary data
40 ///< with a #CONF_PAIR or #CONF_SECTION.
41typedef struct cf_comment CONF_COMMENT; //!< #CONF_ITEM holding a literal `# ...` comment line.
42 ///< Only created when the parser is asked to preserve
43 ///< comments (utilities opt in; the runtime parser does not).
44
45#include <unistd.h>
46#include <sys/time.h>
47
48#include <freeradius-devel/util/rb.h>
49#include <freeradius-devel/util/table.h>
50#include <freeradius-devel/util/token.h>
51#include <freeradius-devel/util/log.h>
52
53#define FR_TIMEVAL_TO_MS(_x) (((_x)->tv_usec / 1000) + ((_x)->tv_sec * (uint64_t)1000))
54#define FR_TIMESPEC_TO_MS(_x) (((_x)->tv_usec / 1000000) + ((_x)->tv_sec * (uint64_t)1000))
55
56/** Auto cast from the input type to CONF_ITEM (which is the base type)
57 *
58 * Automatically casts:
59 * - #CONF_SECTION
60 * - #CONF_PAIR
61 * - #CONF_DATA
62 *
63 * To a #CONF_ITEM, whilst performing talloc type checks.
64 */
65#define CF_TO_ITEM(_cf) \
66_Generic((_cf), \
67 CONF_SECTION * : cf_section_to_item((CONF_SECTION const *)_cf), \
68 CONF_SECTION const * : cf_section_to_item((CONF_SECTION const *)_cf), \
69 CONF_PAIR * : cf_pair_to_item((CONF_PAIR const *)_cf), \
70 CONF_PAIR const * : cf_pair_to_item((CONF_PAIR const *)_cf), \
71 CONF_DATA * : cf_data_to_item((CONF_DATA const *)_cf), \
72 CONF_DATA const * : cf_data_to_item((CONF_DATA const *)_cf), \
73 CONF_COMMENT * : cf_comment_to_item((CONF_COMMENT const *)_cf), \
74 CONF_COMMENT const * : cf_comment_to_item((CONF_COMMENT const *)_cf), \
75 default: _cf \
76)
77
78typedef int (*cf_walker_t)(void *data, void *ctx);
79
80#define CF_IDENT_ANY ((void *) (-1))
81
82/*
83 * Generic functions that apply to all types of #CONF_ITEM
84 */
85#define cf_item_add(_parent, _child) _cf_item_add(CF_TO_ITEM(_parent), CF_TO_ITEM(_child))
87
88#define cf_item_insert_after(_parent, _prev, _child) _cf_item_insert_after(CF_TO_ITEM(_parent), CF_TO_ITEM(_prev), CF_TO_ITEM(_child))
90
91#define cf_item_remove(_parent, _child) _cf_item_remove(CF_TO_ITEM(_parent), CF_TO_ITEM(_child))
93
94#define cf_item_next(_parent, _curr) _cf_item_next(CF_TO_ITEM(_parent), _curr)
96
97/** Iterate over every child item of a CONF_SECTION (or any CONF_ITEM that has
98 * children).
99 *
100 * @param[in] _parent to iterate over. Any type CF_TO_ITEM() accepts.
101 * @param[in] _iter Name of the iteration variable. Declared in the
102 * scope of the loop with type `CONF_ITEM *`.
103 *
104 * Example:
105 * cf_item_foreach(my_section, ci) {
106 * if (cf_item_is_pair(ci)) { ... }
107 * }
108 */
109#define cf_item_foreach(_parent, _iter) \
110 for (CONF_ITEM *_iter = cf_item_next(_parent, NULL); _iter != NULL; _iter = cf_item_next(_parent, _iter))
111
112#define cf_item_prev(_parent, _curr) _cf_item_prev(CF_TO_ITEM(_parent), _curr)
113CONF_ITEM *_cf_item_prev(CONF_ITEM const *parent, CONF_ITEM const *prev);
114
115#define cf_root(_cf) _cf_root(CF_TO_ITEM(_cf))
117
118#define cf_parent(_cf) _cf_parent(CF_TO_ITEM(_cf))
119CONF_ITEM *_cf_parent(CONF_ITEM const *ci);
120
121#define cf_lineno(_cf) _cf_lineno(CF_TO_ITEM(_cf))
122int _cf_lineno(CONF_ITEM const *ci);
123
124#define cf_filename(_cf) _cf_filename(CF_TO_ITEM(_cf))
125char const *_cf_filename(CONF_ITEM const *ci);
126
127bool cf_item_is_section(CONF_ITEM const *ci);
128bool cf_item_is_pair(CONF_ITEM const *ci);
129bool cf_item_is_data(CONF_ITEM const *ci);
130bool cf_item_is_comment(CONF_ITEM const *ci);
131
132/** @hidecallergraph */
134/** @hidecallergraph */
136/** @hidecallergraph */
138/** @hidecallergraph */
140
141/** @hidecallergraph */
143/** @hidecallergraph */
145/** @hidecallergraph */
147/** @hidecallergraph */
149
150/** Allocate a new comment item attached to `parent`.
151 *
152 * Inserted into the parent's ordered children list so it appears between
153 * the surrounding pairs/sections at output time. Not indexed by name -
154 * comment lookup isn't meaningful.
155 *
156 * `text` is `talloc_strdup`ed onto the new node so the caller can free their
157 * copy. Returns NULL if allocation fails.
158 */
160
161/** @hidecallergraph */
162char const *cf_comment_text(CONF_COMMENT const *c);
163
164/** Control whether the CF parser preserves `# ...` comments.
165 *
166 * Defaults to off (historical behaviour: comments are dropped at parse
167 * time). Utilities that want comments to round-trip through the CF tree
168 * should call the setter before `cf_file_read()`. The runtime server
169 * parser never opts in.
170 */
171void cf_preserve_comments_set(bool preserve);
172
173/** Opt out of `${var}` expansion when reading config (default: enabled).
174 *
175 * Utilities that round-trip the source - e.g. radjson2conf rebuilding
176 * a fragment from JSON - call this with `false` so values containing
177 * `${...}` survive verbatim instead of being resolved against an
178 * incomplete tree. $INCLUDE handling is a separate parser path and
179 * is unaffected.
180 */
181void cf_expand_variables_set(bool expand);
182
183#define cf_filename_set(_ci, _filename) _cf_filename_set(CF_TO_ITEM(_ci), _filename)
184void _cf_filename_set(CONF_ITEM *cs, char const *filename);
185
186#define cf_lineno_set(_ci, _lineno) _cf_lineno_set(CF_TO_ITEM(_ci), _lineno)
187void _cf_lineno_set(CONF_ITEM *cs, int lineno);
188
190
191#define cf_item_mark_parsed(_cf) _cf_item_mark_parsed(CF_TO_ITEM(_cf))
193
194#define cf_item_is_parsed(_cf) _cf_item_is_parsed(CF_TO_ITEM(_cf))
196
197/*
198 * Section manipulation and searching
199 */
200#ifndef NDEBUG
201# define cf_section_alloc(_ctx, _parent, _name1, _name2) \
202 _cf_section_alloc(_ctx, _parent, _name1, _name2, __FILE__, __LINE__)
203#else
204# define cf_section_alloc(_ctx, _parent, _name1, _name2) \
205 _cf_section_alloc(_ctx, _parent, _name1, _name2, NULL, 0)
206#endif
208 char const *name1, char const *name2,
209 char const *filename, int lineno);
210CONF_SECTION *cf_section_dup(TALLOC_CTX *ctx, CONF_SECTION *parent, CONF_SECTION const *cs,
211 char const *name1, char const *name2, bool copy_meta);
212
213#define cf_section_foreach(_parent, _iter) \
214 for (CONF_SECTION *_iter = cf_section_first(_parent); _iter; _iter = cf_section_next(_parent, _iter))
215
216/** @hidecallergraph */
218
219/** @hidecallergraph */
221
222/** @hidecallergraph */
224
225/** @hidecallergraph */
226CONF_SECTION *cf_section_find(CONF_SECTION const *cs, char const *name1, char const *name2);
227/** @hidecallergraph */
229 char const *name1, char const *name2);
230
231#define cf_section_find_in_parent(_cf, _name1, _name2) \
232 _cf_section_find_in_parent(CF_TO_ITEM(_cf), _name1, _name2)
234 char const *name1, char const *name2);
235
236#define cf_section_find_parent(_cf, _name1, _name2) \
237 _cf_section_find_parent(CF_TO_ITEM(_cf), _name1, _name2)
239 char const *name1, char const *name2);
240
241char const *cf_section_value_find(CONF_SECTION const *, char const *attr);
242
243int8_t cf_section_name_cmp(CONF_SECTION const *cs, char const *name1, char const *name2);
244/** @hidecallergraph */
245char const *cf_section_name1(CONF_SECTION const *cs);
246/** @hidecallergraph */
247char const *cf_section_name2(CONF_SECTION const *cs);
248/** @hidecallergraph */
249char const *cf_section_name(CONF_SECTION const *cs);
250char const *cf_section_argv(CONF_SECTION const *cs, int argc);
253
254#define cf_section_free_children(_x) cf_item_free_children(cf_section_to_item(_x))
255
256
257/*
258 * Pair manipulation and searching
259 */
260CONF_PAIR *cf_pair_alloc(CONF_SECTION *parent, char const *attr, char const *value,
261 fr_token_t op, fr_token_t lhs_type, fr_token_t rhs_type);
262
263CONF_PAIR *cf_pair_dup(CONF_SECTION *parent, CONF_PAIR *cp, bool copy_meta);
264
265int cf_pair_replace(CONF_SECTION *cs, CONF_PAIR *cp, char const *value);
266
268
269CONF_PAIR *cf_pair_next(CONF_SECTION const *cs, CONF_PAIR const *curr);
270
271CONF_PAIR *cf_pair_prev(CONF_SECTION const *cs, CONF_PAIR const *curr);
272
273CONF_PAIR *cf_pair_find(CONF_SECTION const *cs, char const *name);
274
275CONF_PAIR *cf_pair_find_next(CONF_SECTION const *cs, CONF_PAIR const *prev, char const *name);
276
277CONF_PAIR *cf_pair_find_in_parent(CONF_SECTION const *cs, char const *attr);
278
279int cf_pair_replace_or_add(CONF_SECTION *cs, char *ref, char const *value) CC_HINT(nonnull);
280
281unsigned int cf_pair_count_descendents(CONF_SECTION const *cs);
282
283unsigned int cf_pair_count(CONF_SECTION const *cs, char const *attr);
284
285fr_slen_t cf_pair_values_concat(fr_sbuff_t *sbuff, CONF_SECTION const *cs, char const *attr, char const *sep);
286
287/** @hidecallergraph */
288char const *cf_pair_attr(CONF_PAIR const *pair);
289/** @hidecallergraph */
290char const *cf_pair_value(CONF_PAIR const *pair);
291/** @hidecallergraph */
293
296
297/*
298 * Data manipulation and searching
299 */
300#define cf_data_find(_cf, _type, _name) _cf_data_find(CF_TO_ITEM(_cf), #_type, _name)
301CONF_DATA const *_cf_data_find(CONF_ITEM const *ci, char const *type, char const *name);
302
303#define cf_data_find_next(_cf, _prev, _type, _name) _cf_data_find_next(CF_TO_ITEM(_cf), CF_TO_ITEM(_prev), #_type, _name)
304CONF_DATA const *_cf_data_find_next(CONF_ITEM const *ci, CONF_ITEM const *prev, char const *type, char const *name);
305
306#define cf_data_find_in_parent(_cf, _type, _name) _cf_data_find_in_parent(CF_TO_ITEM(_cf), #_type, _name)
307CONF_DATA *_cf_data_find_in_parent(CONF_ITEM const *ci, char const *type, char const *name);
308
309void *cf_data_value(CONF_DATA const *cd);
310
311#define cf_data_add(_cf, _data, _name, _free) _cf_data_add(CF_TO_ITEM(_cf), (void const *) _data, _name, _free, __FILE__, __LINE__)
312CONF_DATA const *_cf_data_add(CONF_ITEM *ci, void const *data, char const *name, bool free, char const *filename, int lineno);
313
314#define cf_data_add_static(_cf, _data, _type, _name) _cf_data_add_static(CF_TO_ITEM(_cf), _data, #_type, _name, __FILE__, __LINE__)
315CONF_DATA const *_cf_data_add_static(CONF_ITEM *ci, void const *data, char const *type, char const *name, char const *filename, int lineno);
316
317/** Remove an item from a parent by type and name
318 *
319 * @param[in] _cf conf section or pair to remove data from.
320 * @param[in] _type of data to remove.
321 * @param[in] _name of data to remove.
322 */
323#define cf_data_remove(_cf, _type, _name) _cf_data_remove(CF_TO_ITEM(_cf), cf_data_find(_cf, _type, _name))
324
325/** Remove an item from a parent
326 *
327 * @param[in] _cf conf section or pair to remove data from.
328 * @param[in] _cd conf data to remove.
329 */
330#define cf_data_remove_by_data(_cf, _cd) _cf_data_remove(CF_TO_ITEM(_cf), _cd)
331void *_cf_data_remove(CONF_ITEM *ci, CONF_DATA const *_cd);
332
333#define cf_data_walk(_cf, _type, _cb, _ctx) _cf_data_walk(CF_TO_ITEM(_cf), #_type, _cb, _ctx)
334int _cf_data_walk(CONF_ITEM *ci, char const *type, cf_walker_t cb, void *ctx);
335
336/*
337 * Validation
338 */
339int cf_pair_in_table(int32_t *out, fr_table_num_sorted_t const *table, size_t table_len, CONF_PAIR *cp);
340
341/*
342 * Error logging
343 */
344
345#define cf_log_err(_cf, _fmt, ...) _cf_log(L_ERR, CF_TO_ITEM(_cf), __FILE__, __LINE__, _fmt, ## __VA_ARGS__)
346#define cf_log_warn(_cf, _fmt, ...) _cf_log(L_WARN, CF_TO_ITEM(_cf), __FILE__, __LINE__, _fmt, ## __VA_ARGS__)
347#define cf_log_info(_cf, _fmt, ...) _cf_log(L_INFO, CF_TO_ITEM(_cf), __FILE__, __LINE__, _fmt, ## __VA_ARGS__)
348#define cf_log_debug(_cf, _fmt, ...) _cf_log(L_DBG, CF_TO_ITEM(_cf), __FILE__, __LINE__, _fmt, ## __VA_ARGS__)
349void _cf_vlog(fr_log_type_t type, CONF_ITEM const *ci, char const *file, int line, char const *fmt, va_list ap) CC_HINT(format (printf, 5, 0));
350void _cf_log(fr_log_type_t type, CONF_ITEM const *ci, char const *file, int line, char const *fmt, ...) CC_HINT(format (printf, 5, 6));
351
352#define cf_log_perr(_cf, _fmt, ...) _cf_log_perr(L_ERR, CF_TO_ITEM(_cf), __FILE__, __LINE__, NULL, _fmt, ## __VA_ARGS__)
353#define cf_log_pwarn(_cf, _fmt, ...) _cf_log_perr(L_WARN, CF_TO_ITEM(_cf), __FILE__, __LINE__, NULL, _fmt, ## __VA_ARGS__)
354
355void _cf_vlog_perr(fr_log_type_t type, CONF_ITEM const *ci, char const *file, int line,
356 fr_log_perror_format_t const *f_rules, char const *fmt, va_list ap)
357 CC_HINT(format (printf, 6, 0));
358void _cf_log_perr(fr_log_type_t type, CONF_ITEM const *ci, char const *file, int line,
359 fr_log_perror_format_t const *f_rules, char const *fmt, ...)
360 CC_HINT(format (printf, 6, 7));
361
362#define cf_log_debug_prefix(_cf, _fmt, ...) _cf_log_with_filename(L_DBG, CF_TO_ITEM(_cf), __FILE__, __LINE__, _fmt, ## __VA_ARGS__)
363void _cf_log_with_filename(fr_log_type_t type, CONF_ITEM const *ci, char const *file, int line, char const *fmt, ...) CC_HINT(format (printf, 5, 6));
364
365/** Log an error message against a specified child
366 *
367 * @param[in] _parent CONF_SECTION.
368 * @param[in] _child string identifier.
369 * @param[in] _fmt of message.
370 * @param[in] ... arguments.
371 */
372#define cf_log_err_by_child(_parent, _child, _fmt, ...) _cf_log_by_child(L_ERR, _parent, _child, __FILE__, __LINE__, _fmt, ## __VA_ARGS__)
373
374/** Log an error message against a specified child, draining the thread local error stack
375 *
376 * @param[in] _parent CONF_SECTION.
377 * @param[in] _child string identifier.
378 * @param[in] _f_rules Line prefixes.
379 * @param[in] _fmt of message.
380 * @param[in] ... arguments.
381 */
382#define cf_log_perr_by_child(_parent, _child, _f_rules, _fmt, ...) _cf_log_perr_by_child(L_ERR, _parent, _child, __FILE__, __LINE__, _f_rules, _fmt, ## __VA_ARGS__)
383
384/** Log a warning message against a specified child
385 *
386 * @param[in] _parent CONF_SECTION.
387 * @param[in] _child string identifier.
388 * @param[in] _fmt of message.
389 * @param[in] ... arguments.
390 */
391#define cf_log_warn_by_child(_parent, _child, _fmt, ...) _cf_log_by_child(L_WARN, _parent, _child, __FILE__, __LINE__, _fmt, ## __VA_ARGS__)
392
393/** Log an info message against a specified child
394 *
395 * @param[in] _parent CONF_SECTION.
396 * @param[in] _child string identifier.
397 * @param[in] _fmt of message.
398 * @param[in] ... arguments.
399 */
400#define cf_log_info_by_child(_parent, _child, _fmt, ...) _cf_log_by_child(L_INFO, _parent, _child, __FILE__, __LINE__, _fmt, ## __VA_ARGS__)
401
402/** Log a debug message against a specified child
403 *
404 * @param[in] _parent CONF_SECTION.
405 * @param[in] _child string identifier.
406 * @param[in] _fmt of message.
407 * @param[in] ... arguments.
408 */
409#define cf_log_debug_by_child(_parent, _child, _fmt, ...) _cf_log_by_child(L_DBG, _parent, _child, __FILE__, __LINE__, _fmt, ## __VA_ARGS__)
410void _cf_log_by_child(fr_log_type_t type, CONF_SECTION const *parent, char const *child,
411 char const *file, int line, char const *fmt, ...) CC_HINT(format (printf, 6, 7));
412
413void _cf_log_perr_by_child(fr_log_type_t type, CONF_SECTION const *parent, char const *child,
414 char const *file, int line, fr_log_perror_format_t const *f_rules,
415 char const *fmt, ...) CC_HINT(format (printf, 7, 8));
416
417#define cf_item_debug(_cf) _cf_item_debug(CF_TO_ITEM(_cf))
418void _cf_item_debug(CONF_ITEM const *ci);
419
420void cf_pair_debug(CONF_PAIR *cp);
422
423#define cf_canonicalize_error(_ci, _slen, _msg, _str) _cf_canonicalize_error(CF_TO_ITEM(_ci), _slen, _msg, _str)
424void _cf_canonicalize_error(CONF_ITEM *ci, ssize_t slen, char const *msg, char const *str);
425
426#ifdef __cplusplus
427}
428#endif
int const char * file
Definition acutest.h:702
log_entry msg
Definition acutest.h:794
static int const char * fmt
Definition acutest.h:573
int const char int line
Definition acutest.h:702
#define RCSIDH(h, id)
Definition build.h:513
char const * text
Comment text, with the leading # and any surrounding whitespace stripped.
Definition cf_priv.h:148
A # ... comment line preserved verbatim from the input.
Definition cf_priv.h:145
Internal data that is associated with a configuration section.
Definition cf_priv.h:155
Common header for all CONF_* types.
Definition cf_priv.h:54
Configuration AVP similar to a fr_pair_t.
Definition cf_priv.h:77
A section grouping multiple CONF_PAIR.
Definition cf_priv.h:106
int cf_pair_replace_or_add(CONF_SECTION *cs, char *ref, char const *value)
Definition cf_util.c:2546
void _cf_log_with_filename(fr_log_type_t type, CONF_ITEM const *ci, char const *file, int line, char const *fmt,...))
Log a debug message relating to a CONF_ITEM.
Definition cf_util.c:2281
CONF_ITEM * cf_data_to_item(CONF_DATA const *cs)
Cast CONF_DATA to a CONF_ITEM.
Definition cf_util.c:762
bool cf_item_is_pair(CONF_ITEM const *ci)
Determine if CONF_ITEM is a CONF_PAIR.
Definition cf_util.c:640
fr_token_t cf_pair_attr_quote(CONF_PAIR const *pair)
Return the value (lhs) quoting of a pair.
Definition cf_util.c:1729
CONF_SECTION * _cf_section_find_parent(CONF_ITEM const *ci, char const *name1, char const *name2)
Find a parent CONF_SECTION with name1 and optionally name2.
Definition cf_util.c:1216
int _cf_data_walk(CONF_ITEM *ci, char const *type, cf_walker_t cb, void *ctx)
Walk over a specific type of CONF_DATA.
Definition cf_util.c:1994
unsigned int cf_pair_count_descendents(CONF_SECTION const *cs)
Count the number of conf pairs beneath a section.
Definition cf_util.c:1607
void _cf_item_mark_parsed(CONF_ITEM *ci)
Mark an item as parsed.
Definition cf_util.c:1478
void cf_section_debug(CONF_SECTION *cs)
Ease of use from debugger.
Definition cf_util.c:2506
CONF_DATA * _cf_data_find_in_parent(CONF_ITEM const *ci, char const *type, char const *name)
Find matching data in the specified section or one of its parents.
Definition cf_util.c:1841
CONF_ITEM * _cf_item_remove(CONF_ITEM *parent, CONF_ITEM *child)
Remove item from parent and fixup trees.
Definition cf_util.c:455
void _cf_vlog_perr(fr_log_type_t type, CONF_ITEM const *ci, char const *file, int line, fr_log_perror_format_t const *f_rules, char const *fmt, va_list ap))
Log an error message relating to a CONF_ITEM.
Definition cf_util.c:2169
CONF_DATA const * _cf_data_find(CONF_ITEM const *ci, char const *type, char const *name)
Find user data in a config section.
Definition cf_util.c:1807
CONF_PAIR * cf_pair_alloc(CONF_SECTION *parent, char const *attr, char const *value, fr_token_t op, fr_token_t lhs_type, fr_token_t rhs_type)
Allocate a CONF_PAIR.
Definition cf_util.c:1388
fr_token_t cf_section_argv_quote(CONF_SECTION const *cs, int argc)
Return the quoting for one of the variadic arguments.
Definition cf_util.c:1369
unsigned int cf_pair_count(CONF_SECTION const *cs, char const *attr)
Count the number of times an attribute occurs in a parent section.
Definition cf_util.c:1622
int cf_pair_in_table(int32_t *out, fr_table_num_sorted_t const *table, size_t table_len, CONF_PAIR *cp)
Check to see if the CONF_PAIR value is present in the specified table.
Definition cf_util.c:2067
CONF_PAIR * cf_pair_dup(CONF_SECTION *parent, CONF_PAIR *cp, bool copy_meta)
Duplicate a CONF_PAIR.
Definition cf_util.c:1430
void _cf_item_insert_after(CONF_ITEM *parent, CONF_ITEM *prev, CONF_ITEM *child)
Insert a child after a given one.
Definition cf_util.c:417
void _cf_log_by_child(fr_log_type_t type, CONF_SECTION const *parent, char const *child, char const *file, int line, char const *fmt,...))
Log an error message in the context of a child pair of the specified parent.
Definition cf_util.c:2320
void cf_item_free_children(CONF_ITEM *ci)
Definition cf_util.c:2516
char const * cf_section_value_find(CONF_SECTION const *, char const *attr)
Find a pair in a CONF_SECTION.
Definition cf_util.c:1240
CONF_ITEM * cf_comment_to_item(CONF_COMMENT const *c)
Cast a CONF_COMMENT back to a CONF_ITEM.
Definition cf_util.c:788
char const * cf_section_name2(CONF_SECTION const *cs)
Return the second identifier of a CONF_SECTION.
Definition cf_util.c:1306
int8_t cf_section_name_cmp(CONF_SECTION const *cs, char const *name1, char const *name2)
Check if a given section matches the specified name1/name2 identifiers.
Definition cf_util.c:1259
void * cf_data_value(CONF_DATA const *cd)
Return the user assigned value of CONF_DATA.
Definition cf_util.c:1860
CONF_ITEM * cf_section_to_item(CONF_SECTION const *cs)
Cast a CONF_SECTION to a CONF_ITEM.
Definition cf_util.c:746
void _cf_vlog(fr_log_type_t type, CONF_ITEM const *ci, char const *file, int line, char const *fmt, va_list ap))
Log an error message relating to a CONF_ITEM.
Definition cf_util.c:2107
void _cf_log_perr(fr_log_type_t type, CONF_ITEM const *ci, char const *file, int line, fr_log_perror_format_t const *f_rules, char const *fmt,...))
Log an error message relating to a CONF_ITEM.
Definition cf_util.c:2258
CONF_ITEM * _cf_parent(CONF_ITEM const *ci)
Return the parent of a CONF_ITEM.
Definition cf_util.c:584
CONF_SECTION * cf_section_next(CONF_SECTION const *cs, CONF_SECTION const *curr)
Return the next child that's a CONF_SECTION.
Definition cf_util.c:1117
char const * cf_section_name1(CONF_SECTION const *cs)
Return the first identifier of a CONF_SECTION.
Definition cf_util.c:1292
void _cf_filename_set(CONF_ITEM *cs, char const *filename)
Set the filename of a CONF_ITEM.
Definition cf_util.c:998
CONF_SECTION * _cf_section_alloc(TALLOC_CTX *ctx, CONF_SECTION *parent, char const *name1, char const *name2, char const *filename, int lineno)
Allocate a CONF_SECTION.
Definition cf_util.c:891
CONF_ITEM * _cf_item_next(CONF_ITEM const *parent, CONF_ITEM const *curr)
Return the next child of the CONF_ITEM.
Definition cf_util.c:518
CONF_SECTION * cf_section_find(CONF_SECTION const *cs, char const *name1, char const *name2)
Find a CONF_SECTION with name1 and optionally name2.
Definition cf_util.c:1148
CONF_SECTION * cf_item_to_section(CONF_ITEM const *ci)
Cast a CONF_ITEM to a CONF_SECTION.
Definition cf_util.c:692
CONF_DATA * cf_item_to_data(CONF_ITEM const *ci)
Cast CONF_ITEM to CONF_DATA performing a type check.
Definition cf_util.c:712
bool cf_item_is_comment(CONF_ITEM const *ci)
Determine if CONF_ITEM is a CONF_COMMENT.
Definition cf_util.c:771
CONF_SECTION * _cf_root(CONF_ITEM const *ci)
Return the top level CONF_SECTION holding all other CONF_ITEM.
Definition cf_util.c:566
CONF_COMMENT * cf_comment_alloc(CONF_SECTION *parent, char const *text)
Allocate a new comment item attached to parent.
Definition cf_util.c:842
fr_slen_t cf_pair_values_concat(fr_sbuff_t *sbuff, CONF_SECTION const *cs, char const *attr, char const *sep)
Concatenate the values of any pairs with name attr.
Definition cf_util.c:1642
void cf_preserve_comments_set(bool preserve)
Control whether the CF parser preserves # ... comments.
Definition cf_util.c:807
CONF_DATA const * _cf_data_add_static(CONF_ITEM *ci, void const *data, char const *type, char const *name, char const *filename, int lineno)
Add non-talloced user data to a config section.
Definition cf_util.c:1925
CONF_PAIR * cf_pair_find(CONF_SECTION const *cs, char const *name)
Search for a CONF_PAIR with a specific name.
Definition cf_util.c:1541
CONF_COMMENT * cf_item_to_comment(CONF_ITEM const *ci)
Cast a CONF_ITEM to a CONF_COMMENT (asserts on type mismatch).
Definition cf_util.c:779
char const * cf_section_name(CONF_SECTION const *cs)
Return name2 if set, else name1.
Definition cf_util.c:1318
char const * _cf_filename(CONF_ITEM const *ci)
Return the filename the CONF_ITEM was parsed in.
Definition cf_util.c:612
CONF_DATA const * _cf_data_add(CONF_ITEM *ci, void const *data, char const *name, bool free, char const *filename, int lineno)
Add talloced user data to a config section.
Definition cf_util.c:1883
bool cf_item_is_data(CONF_ITEM const *ci)
Determine if CONF_ITEM is CONF_DATA.
Definition cf_util.c:654
bool _cf_item_is_parsed(CONF_ITEM *ci)
Return whether an item has already been parsed.
Definition cf_util.c:1490
void _cf_item_debug(CONF_ITEM const *ci)
Print out debugging information about a CONFIG_ITEM.
Definition cf_util.c:2375
fr_token_t cf_pair_operator(CONF_PAIR const *pair)
Return the operator of a pair.
Definition cf_util.c:1714
CONF_PAIR * cf_pair_find_next(CONF_SECTION const *cs, CONF_PAIR const *prev, char const *name)
Find a pair with a name matching attr, after specified pair.
Definition cf_util.c:1555
fr_token_t cf_pair_value_quote(CONF_PAIR const *pair)
Return the value (rhs) quoting of a pair.
Definition cf_util.c:1744
CONF_PAIR * cf_pair_first(CONF_SECTION const *cs)
Return the first child that's a CONF_PAIR.
Definition cf_util.c:1502
CONF_SECTION * cf_section_find_next(CONF_SECTION const *cs, CONF_SECTION const *subcs, char const *name1, char const *name2)
Return the next matching section.
Definition cf_util.c:1169
CONF_PAIR * cf_pair_next(CONF_SECTION const *cs, CONF_PAIR const *curr)
Return the next child that's a CONF_PAIR.
Definition cf_util.c:1515
void _cf_canonicalize_error(CONF_ITEM *ci, ssize_t slen, char const *msg, char const *str)
Definition cf_util.c:2525
CONF_SECTION * _cf_section_find_in_parent(CONF_ITEM const *ci, char const *name1, char const *name2)
Find an ancestor of the passed CONF_ITEM which has a child matching a specific name1 and optionally n...
Definition cf_util.c:1192
CONF_DATA const * _cf_data_find_next(CONF_ITEM const *ci, CONF_ITEM const *prev, char const *type, char const *name)
Return the next item of user data.
Definition cf_util.c:1825
bool cf_item_is_section(CONF_ITEM const *ci)
Determine if CONF_ITEM is a CONF_SECTION.
Definition cf_util.c:626
char const * cf_comment_text(CONF_COMMENT const *c)
Definition cf_util.c:794
CONF_SECTION * cf_section_dup(TALLOC_CTX *ctx, CONF_SECTION *parent, CONF_SECTION const *cs, char const *name1, char const *name2, bool copy_meta)
Duplicate a configuration section.
Definition cf_util.c:1032
CONF_PAIR * cf_pair_find_in_parent(CONF_SECTION const *cs, char const *attr)
Find a pair with a name matching attr in the specified section or one of its parents.
Definition cf_util.c:1569
char const * cf_section_argv(CONF_SECTION const *cs, int argc)
Return variadic argument at the specified index.
Definition cf_util.c:1334
CONF_PAIR * cf_pair_prev(CONF_SECTION const *cs, CONF_PAIR const *curr)
Return the previous child that's a CONF_PAIR.
Definition cf_util.c:1528
void cf_expand_variables_set(bool expand)
Opt out of ${var} expansion when reading config (default: enabled).
Definition cf_util.c:832
int _cf_lineno(CONF_ITEM const *ci)
Return the lineno the CONF_ITEM was parsed at.
Definition cf_util.c:598
CONF_SECTION * cf_section_first(CONF_SECTION const *cs)
Return the first child in a CONF_SECTION.
Definition cf_util.c:1104
CONF_PAIR * cf_item_to_pair(CONF_ITEM const *ci)
Cast a CONF_ITEM to a CONF_PAIR.
Definition cf_util.c:672
fr_token_t cf_section_name2_quote(CONF_SECTION const *cs)
Return the quoting of the name2 identifier.
Definition cf_util.c:1351
CONF_ITEM * _cf_item_prev(CONF_ITEM const *parent, CONF_ITEM const *prev)
Return the next child of cs.
Definition cf_util.c:533
void * _cf_data_remove(CONF_ITEM *ci, CONF_DATA const *_cd)
Remove data from a configuration section.
Definition cf_util.c:1969
char const * cf_pair_value(CONF_PAIR const *pair)
Return the value of a CONF_PAIR.
Definition cf_util.c:1700
int cf_pair_replace(CONF_SECTION *cs, CONF_PAIR *cp, char const *value)
Replace pair value in a given section with the given value.
Definition cf_util.c:1462
void _cf_item_add(CONF_ITEM *parent, CONF_ITEM *child)
Add a child.
Definition cf_util.c:390
void cf_pair_debug(CONF_PAIR *cp)
Ease of use from debugger.
Definition cf_util.c:2499
CONF_ITEM * cf_pair_to_item(CONF_PAIR const *cp)
Cast a CONF_PAIR to a CONF_ITEM.
Definition cf_util.c:730
void _cf_log(fr_log_type_t type, CONF_ITEM const *ci, char const *file, int line, char const *fmt,...))
Log an error message relating to a CONF_ITEM.
Definition cf_util.c:2146
void _cf_log_perr_by_child(fr_log_type_t type, CONF_SECTION const *parent, char const *child, char const *file, int line, fr_log_perror_format_t const *f_rules, char const *fmt,...))
Log an error message in the context of a child pair of the specified parent.
Definition cf_util.c:2351
CONF_SECTION * cf_section_prev(CONF_SECTION const *cs, CONF_SECTION const *curr)
Return the previous child that's a CONF_SECTION.
Definition cf_util.c:1130
void _cf_lineno_set(CONF_ITEM *cs, int lineno)
Set the line number of a CONF_ITEM.
Definition cf_util.c:1010
char const * cf_pair_attr(CONF_PAIR const *pair)
Return the attr of a CONF_PAIR.
Definition cf_util.c:1684
int(* cf_walker_t)(void *data, void *ctx)
Definition cf_util.h:78
Test enumeration values.
Definition dict_test.h:92
free(array)
fr_log_type_t
Definition log.h:51
long int ssize_t
ssize_t fr_slen_t
static char const * name
fr_aka_sim_id_type_t type
An element in a lexicographically sorted array of name to num mappings.
Definition table.h:49
enum fr_token fr_token_t
static fr_slen_t parent
Definition pair.h:858
static fr_slen_t data
Definition value.h:1340
int nonnull(2, 5))
static size_t char ** out
Definition value.h:1030