The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Loading...
Searching...
No Matches
pair.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/** AVP manipulation and search API
19 *
20 * @file src/lib/util/pair.h
21 *
22 * @copyright 2020 The FreeRADIUS server project
23 */
24RCSIDH(dpair_h, "$Id: 3ce5d341baf6184a57be2fe42fd32763887cc48a $")
25
26#include <freeradius-devel/build.h>
27#include <freeradius-devel/missing.h>
28#include <freeradius-devel/util/dcursor.h>
29#include <freeradius-devel/util/value.h>
30#include <freeradius-devel/util/tlist.h>
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
36/*
37 * Allow public and private versions of the same structures
38 */
39#ifdef _CONST
40# error _CONST can only be defined in the local header
41#endif
42#ifndef _PAIR_PRIVATE
43# define _CONST const
44#else
45# define _CONST
46#endif
47
48typedef struct value_pair_s fr_pair_t;
49
50FR_TLIST_TYPES(fr_pair_order_list)
51
52typedef struct pair_list_s {
53 FR_TLIST_HEAD(fr_pair_order_list) order; //!< Maintains the relative order of pairs in a list.
54
55 bool _CONST is_child; //!< is a child of a VP
56
57#ifdef WITH_VERIFY_PTR
58 unsigned int verified : 1; //!< hack to avoid O(N^3) issues
59#endif
61
62/** Stores an attribute, a value and various bits of other data
63 *
64 * fr_pair_ts are the main data structure used in the server
65 *
66 * They also specify what behaviour should be used when the attribute is merged into a new list/tree.
67 */
69 fr_dict_attr_t const * _CONST da; //!< Dictionary attribute defines the attribute
70 //!< number, vendor and type of the pair.
71 ///< Note: This should not be modified outside
72 ///< of pair.c except via #fr_pair_reinit_from_da.
73
74 FR_TLIST_ENTRY(fr_pair_order_list) _CONST order_entry; //!< Entry to maintain relative order within a list
75 ///< of pairs. This ensures pairs within the list
76 ///< are encoded in the same order as they were
77 ///< received or inserted.
78
79
80 /*
81 * Pairs can have children or data but not both.
82 */
83 union {
84 fr_value_box_t data; //!< The value of this pair.
85
86 struct {
87 /** Force children field to come _after_ the type field in the fr_value_box_t
88 *
89 * This works no matter where type appears in fr_value_box_t, whereas just
90 * listing another fr_type_t field here does not.
91 *
92 * This hack allows the majority of the fr_pair_list_t to overlap with the
93 * fr_value_box_t which gives us much greater packing efficiency.
94 */
95 uint8_t pad[offsetof(fr_value_box_t, safe_for)];
96
97 fr_pair_list_t children; //!< Nested attributes of this pair.
98 };
99 };
100
101 /*
102 * Legacy stuff that needs to die.
103 */
104 struct {
105 fr_token_t op; //!< Operator to use when moving or inserting
106 };
107
108#ifdef WITH_VERIFY_PTR
109 char const *filename; //!< Where the pair was defined
110 int line; //!< Line number where the attribute was defined.
111#endif
112};
113
114#define vp_strvalue data.vb_strvalue
115#define vp_octets data.vb_octets
116#define vp_ptr data.datum.ptr //!< Either octets or strvalue
117#define vp_length data.vb_length
118
119#define vp_ipv4addr data.vb_ip.addr.v4.s_addr
120#define vp_ipv6addr data.vb_ip.addr.v6.s6_addr
121#define vp_ip data.vb_ip
122#define vp_ifid data.vb_ifid
123#define vp_ether data.vb_ether
124
125#define vp_bool data.datum.boolean
126#define vp_uint8 data.vb_uint8
127#define vp_uint16 data.vb_uint16
128#define vp_uint32 data.vb_uint32
129#define vp_uint64 data.vb_uint64
130
131#define vp_int8 data.vb_int8
132#define vp_int16 data.vb_int16
133#define vp_int32 data.vb_int32
134#define vp_int64 data.vb_int64
135
136#define vp_float32 data.vb_float32
137#define vp_float64 data.vb_float64
138
139#define vp_attr data.vb_attr
140
141#define vp_date data.vb_date
142#define vp_time_delta data.vb_time_delta
143
144#define vp_group children
145
146#define vp_size data.datum.size
147#define vp_filter data.datum.filter
148
149#define vp_type data.type
150#define vp_tainted data.tainted
151#define vp_immutable data.immutable
152#define vp_edit data.edit
153#define vp_raw da->flags.is_raw
154
155#define ATTRIBUTE_EQ(_x, _y) ((_x && _y) && (_x->da == _y->da))
156
157/** If WITH_VERIFY_PTR is defined, we perform runtime checks to ensure the fr_pair_t are sane
158 *
159 */
160#ifdef WITH_VERIFY_PTR
161void fr_pair_verify(char const *file, int line, fr_dict_attr_t const *parent,
162 fr_pair_list_t const *list, fr_pair_t const *vp, bool verify_values) CC_HINT(nonnull(5));
163
164void fr_pair_list_verify(char const *file, int line,
165 TALLOC_CTX const *expected, fr_pair_list_t const *list, bool verify_values) CC_HINT(nonnull(4));
166
167# define PAIR_VERIFY(_x) fr_pair_verify(__FILE__, __LINE__, NULL, NULL, _x, true)
168# define PAIR_VERIFY_WITH_LIST(_l, _x) fr_pair_verify(__FILE__, __LINE__, NULL, _l, _x, true)
169# define PAIR_LIST_VERIFY(_x) fr_pair_list_verify(__FILE__, __LINE__, NULL, _x, true)
170# define PAIR_LIST_VERIFY_WITH_CTX(_c, _x) fr_pair_list_verify(__FILE__, __LINE__, _c, _x, true)
171# define PAIR_VERIFY_WITH_PARENT_VP(_p, _x) fr_pair_verify(__FILE__, __LINE__, (_p)->da, &(_p)->vp_group, _x, true)
172# define PAIR_VERIFY_WITH_PARENT_DA(_p, _x) fr_pair_verify(__FILE__, __LINE__, _p, NULL, _x, true)
173
174#define PAIR_ALLOCED(_x) do { (_x)->filename = __FILE__; (_x)->line = __LINE__; } while (0)
175#else
176DIAG_OFF(nonnull-compare)
177/** Wrapper function to defeat nonnull checks
178 *
179 * We may sprinkle PAIR_VERIFY and PAIR_LIST_VERIFY in functions which
180 * have their pair argument marked up as nonnull.
181 *
182 * This would usually generate errors when WITH_VERIFY_PTR is not
183 * defined, as the assert macros check for an arguments NULLness.
184 *
185 * This function wraps the assert but has nonnull-compare disabled
186 * meaning a warning won't be emitted.
187 */
188static inline bool fr_pair_nonnull_assert(fr_pair_t const *vp)
189{
190 return fr_cond_assert(vp);
191}
192
194{
196}
197DIAG_ON(nonnull-compare)
198
199/*
200 * Even if were building without WITH_VERIFY_PTR
201 * the pointer must not be NULL when these various macros are used
202 * so we can add some sneaky soft asserts.
203 */
204# define PAIR_VERIFY(_x) fr_pair_nonnull_assert(_x)
205# define PAIR_VERIFY_WITH_LIST(_l, _x) fr_pair_list_nonnull_assert(_l); \
206 fr_pair_nonnull_assert(_x)
207# define PAIR_LIST_VERIFY(_x) fr_pair_list_nonnull_assert(_x)
208# define PAIR_LIST_VERIFY_WITH_CTX(_c, _x) fr_pair_list_nonnull_assert(_x)
209# define PAIR_VERIFY_WITH_PARENT_VP(_p, _x) fr_pair_list_nonnull_assert(_p); \
210 fr_pair_list_nonnull_assert(_x)
211# define PAIR_VERIFY_WITH_PARENT_DA(_p, _x) fr_pair_list_nonnull_assert(_x)
212# define PAIR_ALLOCED(_x) fr_pair_nonnull_assert(_x)
213#endif
214
215
216#ifdef TEST_CHECK
217/** Macro for use in acutest tests
218 */
219#define TEST_CHECK_PAIR(_got, _exp) \
220do { \
221 fr_pair_t const *_our_got = (_got); \
222 fr_pair_t const *_our_exp = (_exp); \
223 TEST_CHECK_(_our_exp == _our_got, "%s", #_got); \
224 if (_our_exp) { \
225 TEST_MSG("Expected pair : %s - %p (%s)", (_our_exp)->da->name, _our_exp, talloc_get_name(_our_exp)); \
226 } else { \
227 TEST_MSG("Expected pair : NULL"); \
228 } \
229 if (_our_got) { \
230 TEST_MSG("Got pair : %s - %p (%s)", (_our_got)->da->name, _our_got, talloc_get_name(_our_got)); \
231 } else { \
232 TEST_MSG("Got Pair : NULL"); \
233 } \
234} while(0)
235
236#define TEST_CHECK_PAIR_NEQ(_got, _neq) \
237do { \
238 fr_pair_t const *_our_got = (_got); \
239 fr_pair_t const *_our_neq = (_neq); \
240 TEST_CHECK_(_our_got != _our_neq, "%s", #_got); \
241 if (_our_neq) { \
242 TEST_MSG("Pair must not equal : %s - %p (%s)", (_our_neq)->da->name, _our_neq, talloc_get_name(_our_neq)); \
243 } else { \
244 TEST_MSG("Pair must not equal : NULL"); \
245 } \
246} while(0)
247#endif
248
249/*
250 * Helper macros for adding pairs to lists and assigning a value to them
251 */
252
253/** Check a pair's data type matches the DA data type
254 *
255 * @param[in] vp to check consistency of.
256 * @return
257 * - true for match
258 * - false for error
259 */
261{
262 if (vp->vp_type == vp->da->type) return true;
263
264 fr_strerror_printf("fr_pair_t attribute %p \"%s\" data type (%s) does not match da type (%s)",
265 vp->da, vp->da->name,
266 fr_table_str_by_value(fr_type_table, vp->vp_type, "invalid"),
267 fr_table_str_by_value(fr_type_table, vp->da->type, "invalid"));
268 return false;
269}
270
271/** Iterate over the contents of a #fr_pair_list_t
272 *
273 * The iteration variable can be safely removed from the list at each pass.
274 *
275 * @param[in] _list_head to iterate over.
276 * @param[in] _iter Name of iteration variable.
277 * Will be declared in the scope of the loop.
278 */
279#define fr_pair_list_foreach(_list_head, _iter) \
280 for (fr_pair_t *JOIN(_next,_iter), *_iter = fr_pair_list_head(_list_head); JOIN(_next,_iter) = fr_pair_list_next(_list_head, _iter), _iter != NULL; _iter = JOIN(_next,_iter))
281
282/** Iterate over the leaf nodes of a #fr_pair_list_t
283 *
284 * The iteration variable CANNOT be modified. This is a read-only operation.
285 *
286 * @param[in] _list_head to iterate over.
287 * @param[in] _iter Name of iteration variable.
288 * Will be declared in the scope of the loop.
289 */
290#define fr_pair_list_foreach_leaf(_list_head, _iter) \
291 for (fr_pair_t *_iter = fr_pair_list_iter_leaf(_list_head, NULL); _iter != NULL; _iter = fr_pair_list_iter_leaf(_list_head, _iter))
292
293/** Append a pair to a list, assigning its value.
294 *
295 * Version for simple C data types
296 *
297 * @param[in] _ctx to allocate the pair in
298 * @param[out] _vp the allocated pair
299 * @param[in] _list to append the pair to
300 * @param[in] _attr to use when creating pair
301 * @param[in] _val to assign to the pair
302 * @param[in] _tainted does the value come from a trusted source
303 */
304#define fr_pair_list_append_by_da(_ctx, _vp, _list, _attr, _val, _tainted) \
305do { \
306 _vp = NULL; \
307 if (fr_pair_append_by_da(_ctx, &_vp, _list, _attr) < 0) break; \
308 fr_value_box(&_vp->data, _val, _tainted); \
309 if (!vp_da_data_type_check(_vp)) { \
310 fr_pair_delete(_list, _vp); \
311 _vp = NULL; \
312 } \
313} while (0)
314
315/** Append a pair to a list, assigning its value.
316 *
317 * Version for char* and uint8_t*
318 *
319 * @param[in] _ctx to allocate the pair in
320 * @param[out] _vp the allocated pair
321 * @param[in] _list to append the pair to
322 * @param[in] _attr to use when creating pair
323 * @param[in] _val to assign to the pair
324 * @param[in] _len of value
325 * @param[in] _tainted does the value come from a trusted source
326 */
327#define fr_pair_list_append_by_da_len(_ctx, _vp, _list, _attr, _val, _len, _tainted) \
328do { \
329 _vp = NULL; \
330 if (fr_pair_append_by_da(_ctx, &_vp, _list, _attr) < 0) break; \
331 fr_value_box_len(_vp, &_vp->data, _val, _len, _tainted); \
332 if (!vp_da_data_type_check(_vp)) { \
333 fr_pair_delete(_list, _vp); \
334 _vp = NULL; \
335 } \
336} while (0)
337
338#define fr_pair_list_append_by_da_parent(_ctx, _vp, _list, _attr, _val, _tainted) \
339do { \
340 _vp = NULL; \
341 if (fr_pair_append_by_da_parent(_ctx, &_vp, _list, _attr) < 0) break; \
342 fr_value_box(&_vp->data, _val, _tainted); \
343 if (!vp_da_data_type_check(_vp)) { \
344 fr_pair_delete(_list, _vp); \
345 _vp = NULL; \
346 } \
347} while (0)
348
349#define fr_pair_list_append_by_da_parent_len(_ctx, _vp, _list, _attr, _val, _len, _tainted) \
350do { \
351 _vp = NULL; \
352 if (fr_pair_append_by_da_parent(_ctx, &vp, _list, _attr) < 0) break; \
353 fr_value_box_len(_vp, &_vp->data, _val, _len, _tainted); \
354 if (!vp_da_data_type_check(_vp)) { \
355 fr_pair_delete(_list, _vp); \
356 _vp = NULL; \
357 } \
358} while (0)
359
360/** Prepend a pair to a list, assigning its value
361 *
362 * Version for simple C data types
363 *
364 * @param[in] _ctx to allocate the pair in
365 * @param[out] _vp the allocated pair
366 * @param[in] _list to prepend the pair to
367 * @param[in] _attr to use when creating pair
368 * @param[in] _val to assign to the pair
369 * @param[in] _tainted does the value come from a trusted source
370 */
371#define fr_pair_list_prepend_by_da(_ctx, _vp, _list, _attr, _val, _tainted) \
372do { \
373 _vp = NULL; \
374 if (fr_pair_prepend_by_da(_ctx, &_vp, _list, _attr) < 0) break; \
375 fr_value_box(&_vp->data, _val, _tainted); \
376 if (!vp_da_data_type_check(_vp)) { \
377 fr_pair_delete(_list, _vp); \
378 _vp = NULL; \
379 } \
380} while (0)
381
382/** Prepend a pair to a list, assigning its value.
383 *
384 * Version for char* and uint8_t*
385 *
386 * @param[in] _ctx to allocate the pair in
387 * @param[out] _vp the allocated pair
388 * @param[in] _list to prepend the pair to
389 * @param[in] _attr to use when creating pair
390 * @param[in] _val to assign to the pair
391 * @param[in] _len of value
392 * @param[in] _tainted does the value come from a trusted source
393 */
394#define fr_pair_list_prepend_by_da_len(_ctx, _vp, _list, _attr, _val, _len, _tainted) \
395do { \
396 _vp = NULL; \
397 if (fr_pair_prepend_by_da(_ctx, &_vp, _list, _attr) < 0) break; \
398 fr_value_box_len(_vp, &_vp->data, _val, _len, _tainted); \
399 if (!vp_da_data_type_check(_vp)) { \
400 fr_pair_delete(_list, _vp); \
401 _vp = NULL; \
402 } \
403} while (0)
404
405/** Replace a pair in a list, assigning its value
406 *
407 * Version for simple C data types.
408 * If the pair does not already exist, a new one is allocated.
409 *
410 * @param[in] _ctx to allocate the pair in
411 * @param[out] _vp the allocated pair
412 * @param[in] _list to append the pair to
413 * @param[in] _attr to use when creating pair
414 * @param[in] _val to assign to the pair
415 * @param[in] _tainted does the value come from a trusted source
416 */
417#define fr_pair_list_replace_by_da(_ctx, _vp, _list, _attr, _val, _tainted) \
418do { \
419 fr_pair_update_by_da(_ctx, _vp, _list, _attr, 0); \
420 if (!vp) break; \
421 fr_value_box(&_vp->data, _val, _tainted); \
422 if (!vp_da_data_type_check(_vp)) { \
423 fr_pair_delete(_list, _vp); \
424 _vp = NULL; \
425 } \
426} while (0)
427
428/** Replace a pair in a list, assigning its value
429 *
430 * Version for char* and uint8_t*
431 * If the pair does not already exist, a new one is allocated.
432 *
433 * @param[in] _ctx to allocate the pair in
434 * @param[out] _vp the allocated pair
435 * @param[in] _list to append the pair to
436 * @param[in] _attr to use when creating pair
437 * @param[in] _val to assign to the pair
438 * @param[in] _len of value
439 * @param[in] _tainted does the value come from a trusted source
440 */
441#define fr_pair_list_replace_by_da_len(_ctx, _vp, _list, _attr, _val, _len, _tainted) \
442do { \
443 fr_pair_t *oldvp = fr_pair_find_by_da(_list, NULL, _attr); \
444 fr_pair_list_append_by_da_len(_ctx, _vp_, _list, _attr, _val, _len, _tainted) \
445 if (!vp_da_data_type_check(_vp)) { \
446 fr_pair_delete(_list, _vp); \
447 _vp = NULL; \
448 } \
449 if (!_vp) break; \
450 if (oldvp) fr_pair_delete(_list, oldvp); \
451} while (0)
452
453/* Initialisation */
454/** @hidecallergraph */
456
457void fr_pair_init_null(fr_pair_t *vp) CC_HINT(nonnull);
458
459/* Allocation and management */
460fr_pair_t *fr_pair_alloc_null(TALLOC_CTX *ctx) CC_HINT(warn_unused_result);
461
462fr_pair_list_t *fr_pair_list_alloc(TALLOC_CTX *ctx) CC_HINT(warn_unused_result);
463
464fr_pair_t *fr_pair_root_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da) CC_HINT(warn_unused_result) CC_HINT(nonnull(2));
465
466/** @hidecallergraph */
467fr_pair_t *fr_pair_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da) CC_HINT(warn_unused_result) CC_HINT(nonnull(2));
468
470 CC_HINT(nonnull(2, 3));
471
472fr_pair_t *fr_pair_afrom_child_num(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, unsigned int attr) CC_HINT(warn_unused_result);
473
474fr_pair_t *fr_pair_afrom_da_nested(TALLOC_CTX *ctx, fr_pair_list_t *list, fr_dict_attr_t const *da) CC_HINT(warn_unused_result) CC_HINT(nonnull(2,3));
475
476fr_pair_t *fr_pair_afrom_da_depth_nested(TALLOC_CTX *ctx, fr_pair_list_t *list, fr_dict_attr_t const *da, unsigned int start) CC_HINT(warn_unused_result) CC_HINT(nonnull(2,3));
477
478fr_pair_t *fr_pair_copy(TALLOC_CTX *ctx, fr_pair_t const *vp) CC_HINT(nonnull(2)) CC_HINT(warn_unused_result);
479
480int fr_pair_steal(TALLOC_CTX *ctx, fr_pair_t *vp) CC_HINT(nonnull);
481
482int fr_pair_steal_append(TALLOC_CTX *nctx, fr_pair_list_t *list, fr_pair_t *vp) CC_HINT(nonnull);
483
484int fr_pair_steal_prepend(TALLOC_CTX *nctx, fr_pair_list_t *list, fr_pair_t *vp) CC_HINT(nonnull);
485
486/* Searching and list modification */
487int fr_pair_raw_afrom_pair(fr_pair_t *vp, uint8_t const *data, size_t data_len) CC_HINT(nonnull);
488
489bool fr_pair_matches_da(void const *item, void const *uctx) CC_HINT(nonnull);
490
491/** @hidecallergraph */
492unsigned int fr_pair_count_by_da(fr_pair_list_t const *list, fr_dict_attr_t const *da)
493 CC_HINT(nonnull);
494
495/** @hidecallergraph */
497 fr_pair_t const *prev, fr_dict_attr_t const *da) CC_HINT(nonnull(1,3));
498
500 fr_dict_attr_t const *da, unsigned int idx) CC_HINT(nonnull);
501
503 fr_dict_attr_t const *da) CC_HINT(nonnull(1,3));
504
506 fr_pair_t const *prev, fr_dict_attr_t const *da) CC_HINT(nonnull(1,3));
507
509 fr_dict_attr_t const *parent, unsigned int attr) CC_HINT(nonnull(1,3));
510
512 fr_dict_attr_t const *parent, unsigned int attr,
513 unsigned int idx) CC_HINT(nonnull);
514
515/** @hidecallergraph */
516int fr_pair_append(fr_pair_list_t *list, fr_pair_t *vp) CC_HINT(nonnull);
517
519
520int fr_pair_insert_after(fr_pair_list_t *list, fr_pair_t *pos, fr_pair_t *to_add) CC_HINT(nonnull(1,3));
521
522int fr_pair_insert_before(fr_pair_list_t *list, fr_pair_t *pos, fr_pair_t *to_add) CC_HINT(nonnull(1,3));
523
524void fr_pair_replace(fr_pair_list_t *list, fr_pair_t *to_replace, fr_pair_t *vp) CC_HINT(nonnull);
525
527 fr_dict_attr_t const *parent, unsigned int attr) CC_HINT(nonnull);
528
529int fr_pair_append_by_da(TALLOC_CTX *ctx, fr_pair_t **out, fr_pair_list_t *list,
530 fr_dict_attr_t const *da) CC_HINT(nonnull(3,4));
531
532int fr_pair_prepend_by_da(TALLOC_CTX *ctx, fr_pair_t **out, fr_pair_list_t *list,
533 fr_dict_attr_t const *da) CC_HINT(nonnull(3,4));
534
535int fr_pair_append_by_da_parent(TALLOC_CTX *ctx, fr_pair_t **out, fr_pair_list_t *list,
536 fr_dict_attr_t const *da) CC_HINT(nonnull(3,4));
537
539 fr_dict_attr_t const *da) CC_HINT(nonnull(1,3));
540
541static inline CC_HINT(nonnull(3,4)) int fr_pair_find_or_append_by_da(TALLOC_CTX *ctx, fr_pair_t **out, fr_pair_list_t *list,
542 fr_dict_attr_t const *da)
543{
544 fr_pair_t *vp;
545
546 vp = fr_pair_find_by_da(list, NULL, da);
547 if (vp) {
548 *out = vp;
549 return 0;
550 }
551
552 return fr_pair_append_by_da(ctx, out, list, da);
553}
554
555
557
559
560int fr_pair_delete(fr_pair_list_t *list, fr_pair_t *vp) CC_HINT(nonnull);
561
562/* functions for FR_TYPE_STRUCTURAL */
564
566
568
570
572
573/** Initialises a special dcursor with callbacks that will maintain the attr sublists correctly
574 *
575 * @note This is the only way to use a dcursor in non-const mode with fr_pair_list_t.
576 *
577 * @param[out] _cursor to initialise.
578 * @param[in] _list to iterate over.
579 * @param[in] _iter Iterator to use when filtering pairs.
580 * @param[in] _uctx To pass to iterator.
581 * @return
582 * - NULL if src does not point to any items.
583 * - The first pair in the list.
584 */
585#define fr_pair_dcursor_iter_init(_cursor, _list, _iter, _uctx) \
586 _fr_pair_dcursor_iter_init(_cursor, \
587 _list, \
588 _iter, \
589 _uctx, \
590 IS_CONST(fr_pair_list_t *, _list))
592 fr_dcursor_iter_t iter, void const *uctx,
593 bool is_const) CC_HINT(nonnull);
594
595/** Initialises a special dcursor with callbacks that will maintain the attr sublists correctly
596 *
597 * @note This is the only way to use a dcursor in non-const mode with fr_pair_list_t.
598 *
599 * @param[out] _cursor to initialise.
600 * @param[in] _list to iterate over.
601 * @return
602 * - NULL if src does not point to any items.
603 * - The first pair in the list.
604 */
605#define fr_pair_dcursor_init(_cursor, _list) \
606 _fr_pair_dcursor_init(_cursor, \
607 _list, \
608 IS_CONST(fr_pair_list_t *, _list))
610 bool is_const) CC_HINT(nonnull);
611
612/** Initializes a child dcursor from a parent cursor, with an iteration function.
613 *
614 * @note This is the only way to use a dcursor in non-const mode with fr_pair_list_t.
615 *
616 * @param[out] cursor to initialise.
617 * @param[in] list to iterate over.
618 * @param[in] parent parent cursor to take the iterator from
619 * @return
620 * - NULL if src does not point to any items.
621 * - The first pair in the list.
622 */
624{
625 fr_pair_t *vp = fr_pair_dcursor_init(cursor, list);
626
628 return vp;
629}
630
631/** Initialise a cursor that will return only attributes matching the specified #fr_dict_attr_t
632 *
633 * @param[in] _cursor to initialise.
634 * @param[in] _list to iterate over.
635 * @param[in] _da to search for.
636 * @return
637 * - The first matching pair.
638 * - NULL if no pairs match.
639 */
640#define fr_pair_dcursor_by_da_init(_cursor, _list, _da) \
641 _fr_pair_dcursor_by_da_init(_cursor, \
642 _list, \
643 _da, \
644 IS_CONST(fr_pair_list_t *, _list))
646 fr_pair_list_t const *list, fr_dict_attr_t const *da,
647 bool is_const) CC_HINT(nonnull);
648
649/** Initialise a cursor that will return only attributes descended from the specified #fr_dict_attr_t
650 *
651 * @param[in] _cursor to initialise.
652 * @param[in] _list to iterate over.
653 * @param[in] _da who's decentness to search for.
654 * @return
655 * - The first matching pair.
656 * - NULL if no pairs match.
657 */
658#define fr_pair_dcursor_by_ancestor_init(_cursor, _list, _da) \
659 _fr_pair_dcursor_by_ancestor_init(_cursor, \
660 _list, \
661 _da, \
662 IS_CONST(fr_pair_list_t *, _list))
664 fr_pair_list_t const *list, fr_dict_attr_t const *da,
665 bool is_const) CC_HINT(nonnull);
666
668
670
671/** Compare two attributes using and operator.
672 *
673 * @return
674 * - 1 if equal.
675 * - 0 if not equal.
676 * - -1 on failure.
677 */
678#define fr_pair_cmp_op(_op, _a, _b) fr_value_box_cmp_op(_op, &_a->data, &_b->data)
679
680int8_t fr_pair_cmp_by_da(void const *a, void const *b);
681
682int8_t fr_pair_cmp_by_parent_num(void const *a, void const *b);
683
684int fr_pair_cmp(fr_pair_t const *a, fr_pair_t const *b);
685
686int fr_pair_list_cmp(fr_pair_list_t const *a, fr_pair_list_t const *b) CC_HINT(nonnull);
687
688/* Filtering */
689void fr_pair_validate_debug(fr_pair_t const *failed[2]) CC_HINT(nonnull);
690
691bool fr_pair_validate(fr_pair_t const *failed[2], fr_pair_list_t *filter,
692 fr_pair_list_t *list) CC_HINT(nonnull(2,3));
693
694bool fr_pair_validate_relaxed(fr_pair_t const *failed[2], fr_pair_list_t *filter,
695 fr_pair_list_t *list) CC_HINT(nonnull(2,3));
696
697bool fr_pair_immutable(fr_pair_t const *vp) CC_HINT(nonnull);
698
699static inline CC_HINT(nonnull, always_inline)
701{
702 vp->vp_immutable = true;
703}
704
705static inline CC_HINT(nonnull, always_inline)
707{
708 vp->vp_immutable = false;
709}
710
711
712/* Lists */
713int fr_pair_list_copy(TALLOC_CTX *ctx, fr_pair_list_t *to, fr_pair_list_t const *from);
714
715void fr_pair_list_steal(TALLOC_CTX *ctx, fr_pair_list_t *list);
716
718
719int fr_pair_list_copy_by_da(TALLOC_CTX *ctx, fr_pair_list_t *to,
720 fr_pair_list_t const *from, fr_dict_attr_t const *da, unsigned int count);
721
722int fr_pair_list_copy_by_ancestor(TALLOC_CTX *ctx, fr_pair_list_t *to,
723 fr_pair_list_t const *from,
724 fr_dict_attr_t const *parent_da) CC_HINT(nonnull);
725
726int fr_pair_sublist_copy(TALLOC_CTX *ctx, fr_pair_list_t *to,
727 fr_pair_list_t const *from,
728 fr_pair_t const *start, unsigned int count) CC_HINT(nonnull(2,3));
729
730#ifndef _PAIR_INLINE
731/** @hidecallergraph */
732void fr_pair_list_free(fr_pair_list_t *list) CC_HINT(nonnull);
733
735
736
737/** @hidecallergraph */
738bool fr_pair_list_empty(fr_pair_list_t const *list) CC_HINT(nonnull);
739
740size_t fr_pair_list_num_elements(fr_pair_list_t const *list) CC_HINT(nonnull);
741
743
745
746void fr_pair_list_sort(fr_pair_list_t *list, fr_cmp_t cmp) CC_HINT(nonnull);
747
749
751
752/** @hidecallergraph */
754
755/** @hidecallergraph */
756fr_pair_t *fr_pair_list_next(fr_pair_list_t const *list, fr_pair_t const *item) CC_HINT(nonnull(1));
757
758fr_pair_t *fr_pair_list_prev(fr_pair_list_t const *list, fr_pair_t const *item) CC_HINT(nonnull(1));
759
761#endif
762
763/** @name Pair to pair copying
764 *
765 * @{
766 */
768
769int fr_pair_value_copy(fr_pair_t *dst, fr_pair_t *src) CC_HINT(nonnull);
770/** @} */
771
772/** @name Assign and manipulate binary-unsafe C strings
773 *
774 * @{
775 */
777 char const *value, size_t len, fr_sbuff_unescape_rules_t const *erules,
778 bool tainted) CC_HINT(nonnull(1,2));
779
780int fr_pair_value_strdup(fr_pair_t *vp, char const *src, bool tainted) CC_HINT(nonnull);
781
782int fr_pair_value_strdup_shallow(fr_pair_t *vp, char const *src, bool tainted) CC_HINT(nonnull);
783
785
787 char const *fmt, ...) CC_HINT(nonnull) CC_HINT(format (printf, 2, 3));
788/** @} */
789
790/** @name Assign and manipulate binary-safe strings
791 *
792 * @{
793 */
794int fr_pair_value_bstr_alloc(fr_pair_t *vp, char **out, size_t size, bool tainted) CC_HINT(nonnull(1));
795
796int fr_pair_value_bstr_realloc(fr_pair_t *vp, char **out, size_t size) CC_HINT(nonnull(1));
797
798int fr_pair_value_bstrndup(fr_pair_t *vp, char const *src, size_t len, bool tainted) CC_HINT(nonnull(1));
799
800int fr_pair_value_bstrdup_buffer(fr_pair_t *vp, char const *src, bool tainted) CC_HINT(nonnull);
801
802int fr_pair_value_bstrndup_shallow(fr_pair_t *vp, char const *src, size_t len, bool tainted) CC_HINT(nonnull(1));
803
804int fr_pair_value_bstrdup_buffer_shallow(fr_pair_t *vp, char const *src, bool tainted) CC_HINT(nonnull);
805
806 /** @} */
807
808/** @name Assign and manipulate octets strings
809 *
810 * @{
811 */
812int fr_pair_value_mem_alloc(fr_pair_t *vp, uint8_t **out, size_t size, bool tainted) CC_HINT(nonnull(1));
813
814int fr_pair_value_mem_realloc(fr_pair_t *vp, uint8_t **out, size_t size) CC_HINT(nonnull(1));
815
816int fr_pair_value_memdup(fr_pair_t *vp, uint8_t const *src, size_t len, bool tainted) CC_HINT(nonnull(1));
817
818int fr_pair_value_memdup_buffer(fr_pair_t *vp, uint8_t const *src, bool tainted) CC_HINT(nonnull);
819
820int fr_pair_value_memdup_shallow(fr_pair_t *vp, uint8_t const *src, size_t len, bool tainted) CC_HINT(nonnull(1));
821
822int fr_pair_value_memdup_buffer_shallow(fr_pair_t *vp, uint8_t const *src, bool tainted) CC_HINT(nonnull);
823
824 /** @} */
825
826/** @name Enum functions
827 *
828 * @{
829 */
830char const *fr_pair_value_enum(fr_pair_t const *vp, char buff[static 20]) CC_HINT(nonnull);
831
833/** @} */
834
835/** @name Printing functions
836 *
837 * @{
838 */
840 fr_pair_t const *vp, fr_token_t quote) CC_HINT(nonnull);
841
842static inline fr_slen_t CC_HINT(nonnull(2,3))
843 fr_pair_aprint_value_quoted(TALLOC_CTX *ctx, char **out,
844 fr_pair_t const *vp, fr_token_t quote)
846
848 fr_pair_t const *vp) CC_HINT(nonnull(1,3));
849
851 fr_pair_t const *vp) CC_HINT(nonnull(1,3));
852
854
855static inline fr_slen_t CC_HINT(nonnull(2,4))
856 fr_pair_aprint(TALLOC_CTX *ctx, char **out, fr_dict_attr_t const *parent, fr_pair_t const *vp)
858
859static inline fr_slen_t CC_HINT(nonnull(2,4))
860 fr_pair_aprint_secure(TALLOC_CTX *ctx, char **out, fr_dict_attr_t const *parent, fr_pair_t const *vp)
862
863#define fr_pair_list_log(_log, _lvl, _list) _fr_pair_list_log(_log, _lvl, NULL, _list, __FILE__, __LINE__)
864void _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t *parent,
865 fr_pair_list_t const *list, char const *file, int line) CC_HINT(nonnull(1,4));
866
867void fr_pair_list_debug(FILE *fp, fr_pair_list_t const *list) CC_HINT(nonnull);
868void _fr_pair_list_debug(FILE *fp, int lvl, fr_pair_t *parent, fr_pair_list_t const *list)
869 CC_HINT(nonnull(1, 4));
870void fr_pair_debug(FILE *fp, fr_pair_t const *pair) CC_HINT(nonnull);
871
872/** @} */
873
875
876void fr_pair_list_afrom_box(TALLOC_CTX *ctx, fr_pair_list_t *out,
877 fr_dict_t const *dict, fr_value_box_t *box) CC_HINT(nonnull);
878
879/* Tokenization */
880typedef struct {
881 TALLOC_CTX *ctx; //!< to allocate VPs in
882 fr_dict_attr_t const *parent; //!< current attribute to allocate VPs in
883 fr_pair_list_t *list; //!< of VPs to add
885
886ssize_t fr_pair_ctx_afrom_str(fr_pair_ctx_t *pair_ctx, char const *in, size_t inlen) CC_HINT(nonnull);
887void fr_pair_ctx_reset(fr_pair_ctx_t *pair_ctx, fr_dict_t const *dict) CC_HINT(nonnull);
888
889void fr_fprintf_pair(FILE *fp, char const *msg, fr_pair_t const *vp);
890void fr_fprintf_pair_list(FILE *fp, fr_pair_list_t const *list);
891
892#undef _CONST
893#ifdef __cplusplus
894}
895#endif
int const char * file
Definition acutest.h:704
log_entry msg
Definition acutest.h:796
static int const char * fmt
Definition acutest.h:575
int const char int line
Definition acutest.h:704
#define DIAG_ON(_x)
Definition build.h:460
#define RCSIDH(h, id)
Definition build.h:486
#define DIAG_OFF(_x)
Definition build.h:459
void *(* fr_dcursor_iter_t)(fr_dcursor_t *cursor, void *to_eval, void *uctx)
Callback for implementing custom iterators.
Definition dcursor.h:51
static void fr_dcursor_copy_iter(fr_dcursor_t *out, fr_dcursor_t const *in)
Copy a read-only iterator from a parent to a child cursor.
Definition dcursor.h:207
#define fr_cond_assert(_x)
Calls panic_action ifndef NDEBUG, else logs error and evaluates to value of _x.
Definition debug.h:131
static fr_slen_t in
Definition dict.h:887
Test enumeration values.
Definition dict_test.h:92
Head of a doubly linked list.
Definition dlist.h:51
static void * item(fr_lst_t const *lst, fr_lst_index_t idx)
Definition lst.c:122
long int ssize_t
unsigned char uint8_t
ssize_t fr_slen_t
int8_t(* fr_cmp_t)(void const *a, void const *b)
Definition misc.h:38
#define SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(_func,...)
Set of parsing rules for *unescape_until functions.
static char buff[sizeof("18446744073709551615")+3]
Definition size_tests.c:41
return count
Definition module.c:155
Definition log.h:96
bool _CONST is_child
is a child of a VP
Definition pair.h:55
FR_TLIST_HEAD(fr_pair_order_list) order
Maintains the relative order of pairs in a list.
Stores an attribute, a value and various bits of other data.
Definition pair.h:68
FR_TLIST_ENTRY(fr_pair_order_list) _CONST order_entry
Entry to maintain relative order within a list.
fr_dict_attr_t const *_CONST da
Dictionary attribute defines the attribute number, vendor and type of the pair.
Definition pair.h:69
#define fr_table_str_by_value(_table, _number, _def)
Convert an integer to a string.
Definition table.h:772
#define FR_TLIST_TYPES(_name)
Define type specific wrapper structs for tlists.
Definition tlist.h:776
enum fr_token fr_token_t
static fr_slen_t head
Definition xlat.h:420
bool fr_pair_matches_da(void const *item, void const *uctx)
Evaluation function for matching if vp matches a given da.
Definition pair.c:3451
char const * fr_pair_value_enum(fr_pair_t const *vp, char buff[static 20])
int fr_pair_list_copy_by_da(TALLOC_CTX *ctx, fr_pair_list_t *to, fr_pair_list_t const *from, fr_dict_attr_t const *da, unsigned int count)
Duplicate pairs in a list matching the specified da.
Definition pair.c:2416
fr_pair_t * fr_pair_list_parent(fr_pair_list_t const *list)
Return a pointer to the parent pair which contains this list.
Definition pair.c:966
int fr_pair_value_bstr_alloc(fr_pair_t *vp, char **out, size_t size, bool tainted))
Pre-allocate a memory buffer for a "string" type value pair.
Definition pair.c:2741
int fr_pair_list_cmp(fr_pair_list_t const *a, fr_pair_list_t const *b)
Determine equality of two lists.
Definition pair.c:2050
int fr_pair_value_memdup_buffer(fr_pair_t *vp, uint8_t const *src, bool tainted)
Copy data from a talloced buffer into an "octets" data type.
Definition pair.c:2975
fr_dlist_head_t * fr_pair_list_to_dlist(fr_pair_list_t const *list)
Get the dlist head from a pair list.
TALLOC_CTX * ctx
to allocate VPs in
Definition pair.h:881
int fr_pair_value_mem_alloc(fr_pair_t *vp, uint8_t **out, size_t size, bool tainted))
Pre-allocate a memory buffer for a "octets" type value pair.
Definition pair.c:2894
fr_pair_t * fr_pair_afrom_da_depth_nested(TALLOC_CTX *ctx, fr_pair_list_t *list, fr_dict_attr_t const *da, unsigned int start)
Create a pair (and all intermediate parents), and append it to the list.
Definition pair.c:416
struct pair_list_s fr_pair_list_t
fr_pair_t * fr_pair_find_by_da(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *da))
Find the first pair with a matching da.
Definition pair.c:703
unsigned int fr_pair_count_by_da(fr_pair_list_t const *list, fr_dict_attr_t const *da)
Return the number of instances of a given da in the specified list.
Definition pair.c:680
int fr_pair_value_from_str(fr_pair_t *vp, char const *value, size_t len, fr_sbuff_unescape_rules_t const *erules, bool tainted))
static fr_pair_t * fr_pair_dcursor_child_iter_init(fr_dcursor_t *cursor, fr_pair_list_t const *list, fr_dcursor_t const *parent)
Initializes a child dcursor from a parent cursor, with an iteration function.
Definition pair.h:623
int fr_pair_sublist_copy(TALLOC_CTX *ctx, fr_pair_list_t *to, fr_pair_list_t const *from, fr_pair_t const *start, unsigned int count))
Duplicate a list of pairs starting at a particular item.
Definition pair.c:2518
int fr_pair_value_enum_box(fr_value_box_t const **out, fr_pair_t *vp)
Get value box of a VP, optionally prefer enum value.
Definition pair.c:3075
int fr_pair_value_aprintf(fr_pair_t *vp, char const *fmt,...)
Print data into an "string" data type.
Definition pair.c:2709
int fr_pair_delete_by_da_nested(fr_pair_list_t *list, fr_dict_attr_t const *da)
Delete matching pairs from the specified list, and prune any empty branches.
Definition pair.c:1716
int fr_pair_insert_after(fr_pair_list_t *list, fr_pair_t *pos, fr_pair_t *to_add))
Add a VP after another VP.
Definition pair.c:1374
void fr_fprintf_pair_list(FILE *fp, fr_pair_list_t const *list)
Definition pair_print.c:449
int fr_pair_value_memdup(fr_pair_t *vp, uint8_t const *src, size_t len, bool tainted))
Copy data into an "octets" data type.
Definition pair.c:2945
bool fr_pair_validate_relaxed(fr_pair_t const *failed[2], fr_pair_list_t *filter, fr_pair_list_t *list))
Uses fr_pair_cmp to verify all fr_pair_ts in list match the filter defined by check.
Definition pair.c:2208
static bool vp_da_data_type_check(fr_pair_t *vp)
Check a pair's data type matches the DA data type.
Definition pair.h:260
fr_pair_t * fr_pair_find_by_child_num(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *parent, unsigned int attr))
Find the pair with the matching child attribute.
Definition pair.c:877
int fr_pair_list_copy(TALLOC_CTX *ctx, fr_pair_list_t *to, fr_pair_list_t const *from)
Duplicate a list of pairs.
Definition pair.c:2326
int fr_pair_value_mem_realloc(fr_pair_t *vp, uint8_t **out, size_t size))
Change the length of a buffer for a "octets" type value pair.
Definition pair.c:2919
int fr_pair_insert_before(fr_pair_list_t *list, fr_pair_t *pos, fr_pair_t *to_add))
Add a VP before another VP.
Definition pair.c:1407
void fr_pair_debug(FILE *fp, fr_pair_t const *pair)
Dumps a pair to the default logging destination - Useful for calling from debuggers.
Definition pair_print.c:415
static fr_slen_t fr_pair_aprint(TALLOC_CTX *ctx, char **out, fr_dict_attr_t const *parent, fr_pair_t const *vp) 1(fr_pair_print
bool fr_pair_list_empty(fr_pair_list_t const *list)
Is a valuepair list empty.
fr_pair_t * fr_pair_root_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da)
A special allocation function which disables child autofree.
Definition pair.c:248
int fr_pair_append_by_da(TALLOC_CTX *ctx, fr_pair_t **out, fr_pair_list_t *list, fr_dict_attr_t const *da))
Alloc a new fr_pair_t (and append)
Definition pair.c:1467
void fr_pair_validate_debug(fr_pair_t const *failed[2])
Write an error to the library errorbuff detailing the mismatch.
Definition pair.c:2096
int fr_pair_value_strdup(fr_pair_t *vp, char const *src, bool tainted)
Copy data into an "string" data type.
Definition pair.c:2645
int fr_pair_steal_append(TALLOC_CTX *nctx, fr_pair_list_t *list, fr_pair_t *vp)
Change a vp's talloc ctx and insert it into a new list.
Definition pair.c:556
int fr_pair_value_bstrdup_buffer_shallow(fr_pair_t *vp, char const *src, bool tainted)
Assign a string to a "string" type value pair.
Definition pair.c:2866
void fr_pair_init_null(fr_pair_t *vp)
Initialise fields in an fr_pair_t without assigning a da.
Definition pair.c:149
int8_t fr_pair_cmp_by_parent_num(void const *a, void const *b)
Order attributes by their parent(s), attribute number, and tag.
Definition pair.c:1924
int fr_pair_delete_by_da(fr_pair_list_t *head, fr_dict_attr_t const *da)
Delete matching pairs from the specified list.
Definition pair.c:1692
fr_pair_list_t * fr_pair_parent_list(fr_pair_t const *vp)
Return a pointer to the parent pair list.
Definition pair.c:937
void fr_pair_list_sort(fr_pair_list_t *list, fr_cmp_t cmp)
Sort a doubly linked list of fr_pair_ts using merge sort.
fr_pair_t * fr_pair_find_by_child_num_idx(fr_pair_list_t const *list, fr_dict_attr_t const *parent, unsigned int attr, unsigned int idx)
Find the pair with the matching child attribute at a given index.
Definition pair.c:903
int fr_pair_cmp(fr_pair_t const *a, fr_pair_t const *b)
Compare two pairs, using the operator from "a".
Definition pair.c:1972
fr_pair_list_t * fr_pair_list_alloc(TALLOC_CTX *ctx)
Allocate a new pair list on the heap.
Definition pair.c:119
fr_pair_t * fr_pair_parent(fr_pair_t const *vp)
Return a pointer to the parent pair.
Definition pair.c:952
fr_pair_t * fr_pair_list_next(fr_pair_list_t const *list, fr_pair_t const *item))
Get the next item in a valuepair list after a specific entry.
Definition pair_inline.c:69
void _fr_pair_list_debug(FILE *fp, int lvl, fr_pair_t *parent, fr_pair_list_t const *list))
Print a list of attributes and enumv.
Definition pair_print.c:391
fr_pair_t * _fr_pair_dcursor_by_ancestor_init(fr_dcursor_t *cursor, fr_pair_list_t const *list, fr_dict_attr_t const *da, bool is_const)
Initialise a cursor that will return only attributes descended from the specified fr_dict_attr_t.
Definition pair.c:1170
void fr_pair_replace(fr_pair_list_t *list, fr_pair_t *to_replace, fr_pair_t *vp)
Replace a given VP.
Definition pair.c:1440
fr_pair_t * fr_pair_find_by_da_idx(fr_pair_list_t const *list, fr_dict_attr_t const *da, unsigned int idx)
Find a pair with a matching da at a given index.
Definition pair.c:751
fr_pair_t * fr_pair_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da)
Dynamically allocate a new attribute and assign a fr_dict_attr_t.
Definition pair.c:289
int fr_pair_prepend(fr_pair_list_t *list, fr_pair_t *vp)
Add a VP to the start of the list.
Definition pair.c:1317
int fr_pair_value_memdup_shallow(fr_pair_t *vp, uint8_t const *src, size_t len, bool tainted))
Assign a buffer to a "octets" type value pair.
Definition pair.c:3000
int fr_pair_value_bstrdup_buffer(fr_pair_t *vp, char const *src, bool tainted)
Copy a nul terminated talloced buffer a "string" type value pair.
Definition pair.c:2821
fr_pair_t * fr_pair_list_tail(fr_pair_list_t const *list)
Get the tail of a valuepair list.
Definition pair_inline.c:55
int fr_pair_list_copy_by_ancestor(TALLOC_CTX *ctx, fr_pair_list_t *to, fr_pair_list_t const *from, fr_dict_attr_t const *parent_da)
Duplicate pairs in a list where the da is a descendant of parent_da.
Definition pair.c:2465
static bool fr_pair_nonnull_assert(fr_pair_t const *vp)
If WITH_VERIFY_PTR is defined, we perform runtime checks to ensure the fr_pair_t are sane.
Definition pair.h:188
fr_pair_t * fr_pair_remove(fr_pair_list_t *list, fr_pair_t *vp)
Remove fr_pair_t from a list without freeing.
Definition pair_inline.c:93
fr_pair_list_t * fr_pair_children(fr_pair_t *head)
Get the child list of a group.
Definition pair.c:927
static fr_slen_t quote ssize_t fr_pair_print(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pair_t const *vp))
Print one attribute and value to a string.
Definition pair_print.c:142
int fr_pair_value_bstrndup(fr_pair_t *vp, char const *src, size_t len, bool tainted))
Copy data into a "string" type value pair.
Definition pair.c:2795
static int fr_pair_find_or_append_by_da(TALLOC_CTX *ctx, fr_pair_t **out, fr_pair_list_t *list, fr_dict_attr_t const *da)
Definition pair.h:541
void fr_pair_list_free(fr_pair_list_t *list)
Free memory used by a valuepair list.
static void fr_pair_clear_immutable(fr_pair_t *vp)
Definition pair.h:706
void fr_pair_list_append(fr_pair_list_t *dst, fr_pair_list_t *src)
Appends a list of fr_pair_t from a temporary list to a destination list.
void fr_pair_list_debug(FILE *fp, fr_pair_list_t const *list)
Dumps a list to the default logging destination - Useful for calling from debuggers.
Definition pair_print.c:406
void fr_pair_ctx_reset(fr_pair_ctx_t *pair_ctx, fr_dict_t const *dict)
Reset a pair_ctx to the dictionary root.
int fr_pair_append(fr_pair_list_t *list, fr_pair_t *vp)
Add a VP to the end of the list.
Definition pair.c:1348
#define _CONST
Definition pair.h:43
void fr_fprintf_pair(FILE *fp, char const *msg, fr_pair_t const *vp)
Definition pair_print.c:457
fr_pair_t * fr_pair_alloc_null(TALLOC_CTX *ctx)
Dynamically allocate a new attribute with no fr_dict_attr_t assigned.
Definition pair.c:169
int fr_pair_value_bstrndup_shallow(fr_pair_t *vp, char const *src, size_t len, bool tainted))
Assign a string to a "string" type value pair.
Definition pair.c:2846
void fr_pair_list_prepend(fr_pair_list_t *dst, fr_pair_list_t *src)
Move a list of fr_pair_t from a temporary list to the head of a destination list.
bool fr_pair_immutable(fr_pair_t const *vp)
Definition pair.c:2283
void fr_pair_list_tainted(fr_pair_list_t *vps)
Mark up a list of VPs as tainted.
Definition pair.c:3424
void fr_pair_value_clear(fr_pair_t *vp)
Free/zero out value (or children) of a given VP.
Definition pair.c:2543
fr_pair_t * fr_pair_find_by_da_nested(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *da))
Find a pair with a matching fr_dict_attr_t, by walking the nested fr_dict_attr_t tree.
Definition pair.c:780
static void fr_pair_set_immutable(fr_pair_t *vp)
Definition pair.h:700
fr_pair_list_t * list
of VPs to add
Definition pair.h:883
int fr_pair_delete(fr_pair_list_t *list, fr_pair_t *vp)
Remove fr_pair_t from a list and free.
Definition pair.c:1829
static fr_slen_t vp
Definition pair.h:845
int fr_pair_delete_by_child_num(fr_pair_list_t *list, fr_dict_attr_t const *parent, unsigned int attr)
Delete matching pairs from the specified list.
Definition pair.c:1811
int fr_pair_value_copy(fr_pair_t *dst, fr_pair_t *src)
Copy the value from one pair to another.
Definition pair.c:2573
fr_pair_t * _fr_pair_dcursor_init(fr_dcursor_t *cursor, fr_pair_list_t const *list, bool is_const)
Initialises a special dcursor with callbacks that will maintain the attr sublists correctly.
Definition pair.c:1133
static bool fr_pair_list_nonnull_assert(fr_pair_list_t const *pair_list)
Definition pair.h:193
ssize_t fr_pair_print_value_quoted(fr_sbuff_t *out, fr_pair_t const *vp, fr_token_t quote)
Print the value of an attribute to a string.
Definition pair_print.c:59
fr_pair_t * fr_pair_copy(TALLOC_CTX *ctx, fr_pair_t const *vp))
Copy a single valuepair.
Definition pair.c:497
int fr_pair_steal(TALLOC_CTX *ctx, fr_pair_t *vp)
Steal one VP.
Definition pair.c:531
bool fr_pair_validate(fr_pair_t const *failed[2], fr_pair_list_t *filter, fr_pair_list_t *list))
Uses fr_pair_cmp to verify all fr_pair_ts in list match the filter defined by check.
Definition pair.c:2131
static fr_slen_t fr_pair_aprint_value_quoted(TALLOC_CTX *ctx, char **out, fr_pair_t const *vp, fr_token_t quote) 1(fr_pair_print_value_quoted
fr_value_box_t * fr_pair_dcursor_nested_init(fr_dcursor_t *cursor, fr_dcursor_t *parent)
Initialises a special dcursor over another cursor which returns fr_pair_t, but we return fr_value_box...
Definition pair.c:1301
int fr_pair_append_by_da_parent(TALLOC_CTX *ctx, fr_pair_t **out, fr_pair_list_t *list, fr_dict_attr_t const *da))
Alloc a new fr_pair_t, adding the parent attributes if required.
Definition pair.c:1524
fr_pair_t * fr_pair_find_last_by_da(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *da))
Find the last pair with a matching da.
Definition pair.c:727
fr_pair_t * _fr_pair_dcursor_by_da_init(fr_dcursor_t *cursor, fr_pair_list_t const *list, fr_dict_attr_t const *da, bool is_const)
Initialise a cursor that will return only attributes matching the specified fr_dict_attr_t.
Definition pair.c:1151
fr_pair_list_t * fr_pair_list_from_dlist(fr_dlist_head_t const *list)
Get the pair list head from a dlist.
ssize_t fr_pair_ctx_afrom_str(fr_pair_ctx_t *pair_ctx, char const *in, size_t inlen)
Parse a pair context from a string.
int fr_pair_value_strtrim(fr_pair_t *vp)
Trim the length of the string buffer to match the length of the C string.
Definition pair.c:2688
fr_pair_t * fr_pair_afrom_da_nested(TALLOC_CTX *ctx, fr_pair_list_t *list, fr_dict_attr_t const *da)
Create a pair (and all intermediate parents), and append it to the list.
Definition pair.c:474
#define fr_pair_dcursor_init(_cursor, _list)
Initialises a special dcursor with callbacks that will maintain the attr sublists correctly.
Definition pair.h:605
void _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t *parent, fr_pair_list_t const *list, char const *file, int line))
Print a list of attributes and enumv.
Definition pair_print.c:339
fr_dict_attr_t const * parent
current attribute to allocate VPs in
Definition pair.h:882
int fr_pair_update_by_da_parent(fr_pair_t *parent, fr_pair_t **out, fr_dict_attr_t const *da))
Return the first fr_pair_t matching the fr_dict_attr_t or alloc a new fr_pair_t and its subtree (and ...
Definition pair.c:1598
void fr_pair_list_init(fr_pair_list_t *head)
Initialise a pair list header.
Definition pair.c:46
int fr_pair_reinit_from_da(fr_pair_list_t *list, fr_pair_t *vp, fr_dict_attr_t const *da))
Re-initialise an attribute with a different da.
Definition pair.c:321
int fr_pair_value_bstr_realloc(fr_pair_t *vp, char **out, size_t size))
Change the length of a buffer for a "string" type value pair.
Definition pair.c:2766
fr_pair_t * fr_pair_list_prev(fr_pair_list_t const *list, fr_pair_t const *item))
Get the previous item in a valuepair list before a specific entry.
Definition pair_inline.c:82
fr_pair_t * fr_pair_list_head(fr_pair_list_t const *list)
Get the head of a valuepair list.
Definition pair_inline.c:42
fr_value_box_t * fr_pair_dcursor_value_init(fr_dcursor_t *cursor)
Initialises a special dcursor over a fr_pair_list_t, but which returns fr_value_box_t.
Definition pair.c:1254
void fr_pair_list_afrom_box(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_t const *dict, fr_value_box_t *box)
Parse a list of VPs from a value box.
Definition pair.c:3536
fr_pair_t * fr_pair_list_iter_leaf(fr_pair_list_t *list, fr_pair_t *vp)
Iterates over the leaves of a list.
Definition pair.c:1048
void fr_pair_list_steal(TALLOC_CTX *ctx, fr_pair_list_t *list)
Steal a list of pairs to a new context.
Definition pair.c:2307
size_t fr_pair_list_num_elements(fr_pair_list_t const *list)
Get the length of a list of fr_pair_t.
int fr_pair_steal_prepend(TALLOC_CTX *nctx, fr_pair_list_t *list, fr_pair_t *vp)
Change a vp's talloc ctx and insert it into a new list.
Definition pair.c:579
int fr_pair_prepend_by_da(TALLOC_CTX *ctx, fr_pair_t **out, fr_pair_list_t *list, fr_dict_attr_t const *da))
Alloc a new fr_pair_t (and prepend)
Definition pair.c:1494
int fr_pair_raw_afrom_pair(fr_pair_t *vp, uint8_t const *data, size_t data_len)
Mark malformed attribute as raw.
Definition pair.c:603
ssize_t fr_pair_print_secure(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pair_t const *vp))
Print one attribute and value to a string with escape rules.
Definition pair_print.c:204
int8_t fr_pair_cmp_by_da(void const *a, void const *b)
Order attributes by their da, and tag.
Definition pair.c:1847
int fr_pair_value_memdup_buffer_shallow(fr_pair_t *vp, uint8_t const *src, bool tainted)
Assign a talloced buffer to a "octets" type value pair.
Definition pair.c:3020
int fr_pair_value_strdup_shallow(fr_pair_t *vp, char const *src, bool tainted)
Assign a buffer containing a nul terminated string to a vp, but don't copy it.
Definition pair.c:2669
ssize_t fr_pair_list_print(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pair_list_t const *list)
Print a pair list.
Definition pair_print.c:270
static fr_slen_t parent
Definition pair.h:857
fr_pair_t * _fr_pair_dcursor_iter_init(fr_dcursor_t *cursor, fr_pair_list_t const *list, fr_dcursor_iter_t iter, void const *uctx, bool is_const)
Initialises a special dcursor with callbacks that will maintain the attr sublists correctly.
Definition pair.c:1113
int fr_pair_list_copy_to_box(fr_value_box_t *dst, fr_pair_list_t *from)
Copy the contents of a pair list to a set of value-boxes.
Definition pair.c:2361
fr_pair_t * fr_pair_afrom_child_num(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, unsigned int attr)
Create a new valuepair.
Definition pair.c:378
static fr_slen_t static vp fr_slen_t fr_pair_aprint_secure(TALLOC_CTX *ctx, char **out, fr_dict_attr_t const *parent, fr_pair_t const *vp) 1(fr_pair_print_secure
#define fr_strerror_printf(_fmt,...)
Log to thread local error buffer.
Definition strerror.h:64
fr_table_num_ordered_t const fr_type_table[]
Map data types to names representing those types.
Definition types.c:31
static fr_slen_t data
Definition value.h:1322
static size_t char fr_sbuff_t size_t inlen
Definition value.h:1023
int nonnull(2, 5))
static size_t char ** out
Definition value.h:1023