All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
pair.h
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
15  */
16 #ifndef _FR_PAIR_H
17 #define _FR_PAIR_H
18 /**
19  * $Id: 24c64235b1a55c1b35ed06a94f417d242b18f2a0 $
20  *
21  * @file include/pair.h
22  * @brief AVP manipulation and search API.
23  *
24  * @copyright 2015 The FreeRADIUS server project
25  */
26 RCSIDH(pair_h, "$Id: 24c64235b1a55c1b35ed06a94f417d242b18f2a0 $")
27 
28 #include <freeradius-devel/libradius.h>
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 #ifdef WITH_VERIFY_PTR
35 # define VERIFY_VP(_x) fr_pair_verify(__FILE__, __LINE__, _x)
36 # define VERIFY_LIST(_x) fr_pair_list_verify(__FILE__, __LINE__, NULL, _x)
37 # define VERIFY_PACKET(_x) (void) talloc_get_type_abort(_x, RADIUS_PACKET)
38 #else
39 /*
40  * Even if were building without WITH_VERIFY_PTR
41  * the pointer must not be NULL when these various macros are used
42  * so we can add some sneaky soft asserts.
43  */
44 # define VERIFY_VP(_x) fr_assert(_x)
45 # define VERIFY_LIST(_x) fr_assert(_x)
46 # define VERIFY_PACKET(_x) fr_assert(_x)
47 #endif
48 
49 /** Union containing all data types supported by the server
50  *
51  * This union contains all data types that can be represented by VALUE_PAIRs. It may also be used in other parts
52  * of the server where values of different types need to be stored.
53  *
54  * PW_TYPE should be an enumeration of the values in this union.
55  */
56 typedef struct value_data value_data_t;
57 struct value_data {
58  union {
59  char const *strvalue; //!< Pointer to UTF-8 string.
60  uint8_t const *octets; //!< Pointer to binary string.
61  uint32_t integer; //!< 32bit unsigned integer.
62  struct in_addr ipaddr; //!< IPv4 Address.
63  uint32_t date; //!< Date (32bit Unix timestamp).
64  size_t filter[32/sizeof(size_t)]; //!< Ascend binary format a packed data
65  //!< structure.
66 
67  uint8_t ifid[8]; //!< IPv6 interface ID (should be struct?).
68  struct in6_addr ipv6addr; //!< IPv6 Address.
69  uint8_t ipv6prefix[18]; //!< IPv6 prefix (should be struct?).
70 
71  uint8_t byte; //!< 8bit unsigned integer.
72  uint16_t ushort; //!< 16bit unsigned integer.
73 
74  uint8_t ether[6]; //!< Ethernet (MAC) address.
75 
76  int32_t sinteger; //!< 32bit signed integer.
77  uint64_t integer64; //!< 64bit unsigned integer.
78  double decimal; //!< Double precision float.
79 
80  uint8_t ipv4prefix[6]; //!< IPv4 prefix (should be struct?).
81 
82  bool boolean; //!< A truth value.
83 
84  void *ptr; //!< generic pointer.
85  };
86 
87  size_t length; //!< Length of value data.
88  value_data_t *next; //!< Next in a series of value_data.
89 };
90 
91 /** The type of value a VALUE_PAIR contains
92  *
93  * This is used to add structure to nested VALUE_PAIRs and specifies what type of node it is (set, list, data).
94  *
95  * xlat is another type of data node which must first be expanded before use.
96  */
97 typedef enum value_type {
98  VT_NONE = 0, //!< VALUE_PAIR has no value.
99  VT_SET, //!< VALUE_PAIR has children.
100  VT_LIST, //!< VALUE_PAIR has multiple values.
101  VT_DATA, //!< VALUE_PAIR has a single value.
102  VT_XLAT //!< valuepair value must be xlat expanded when it's
103  //!< added to VALUE_PAIR tree.
104 } value_type_t;
105 
106 /** Stores an attribute, a value and various bits of other data
107  *
108  * VALUE_PAIRs are the main data structure used in the server
109  *
110  * They also specify what behaviour should be used when the attribute is merged into a new list/tree.
111  */
112 typedef struct value_pair {
113  fr_dict_attr_t const *da; //!< Dictionary attribute defines the attribute
114  //!< number, vendor and type of the attribute.
115 
116  struct value_pair *next;
117 
118  FR_TOKEN op; //!< Operator to use when moving or inserting
119  //!< valuepair into a list.
120 
121  int8_t tag; //!< Tag value used to group valuepairs.
122 
123  union {
124  // VALUE_SET *set; //!< Set of child attributes.
125  // VALUE_LIST *list; //!< List of values for
126  //!< multivalued attribute.
127  // value_data_t *data; //!< Value data for this attribute.
128 
129  char const *xlat; //!< Source string for xlat expansion.
130  };
131 
132  value_type_t type; //!< Type of pointer in value union.
134 } VALUE_PAIR;
135 
136 /** Abstraction to allow iterating over different configurations of VALUE_PAIRs
137  *
138  * This allows functions which do not care about the structure of collections of VALUE_PAIRs
139  * to iterate over all members in a collection.
140  *
141  * Field within a vp_cursor should not be accessed directly, and vp_cursors should only be
142  * manipulated with the pair* functions.
143  */
144 typedef struct vp_cursor {
146  VALUE_PAIR *found; //!< pairfind marker.
147  VALUE_PAIR *last; //!< Temporary only used for fr_cursor_insert
148  VALUE_PAIR *current; //!< The current attribute.
149  VALUE_PAIR *next; //!< Next attribute to process.
150 } vp_cursor_t;
151 
152 /** A VALUE_PAIR in string format.
153  *
154  * Used to represent pairs in the legacy 'users' file format.
155  */
156 typedef struct value_pair_raw {
157  char l_opand[256]; //!< Left hand side of the pair.
158  char r_opand[1024]; //!< Right hand side of the pair.
159 
160  FR_TOKEN quote; //!< Type of quoting around the r_opand.
161 
162  FR_TOKEN op; //!< Operator.
164 
165 #define vp_strvalue data.strvalue
166 #define vp_integer data.integer
167 #define vp_ipaddr data.ipaddr.s_addr
168 #define vp_date data.date
169 #define vp_filter data.filter
170 #define vp_octets data.octets
171 #define vp_ifid data.ifid
172 #define vp_ipv6addr data.ipv6addr
173 #define vp_ipv6prefix data.ipv6prefix
174 #define vp_byte data.byte
175 #define vp_short data.ushort
176 #define vp_ether data.ether
177 #define vp_signed data.sinteger
178 #define vp_integer64 data.integer64
179 #define vp_ipv4prefix data.ipv4prefix
180 #define vp_decimal data.decimal
181 
182 #define vp_length data.length
183 
184 # define debug_pair(vp) do { if (fr_debug_lvl && fr_log_fp) { \
185  fr_pair_fprint(fr_log_fp, vp); \
186  } \
187  } while(0)
188 
189 #define TAG_VALID(x) ((x) > 0 && (x) < 0x20)
190 #define TAG_VALID_ZERO(x) ((x) < 0x20)
191 #define TAG_ANY INT8_MIN
192 #define TAG_NONE 0
193 /** Check if tags are equal
194  *
195  * @param _x tag were matching on.
196  * @param _y tag belonging to the attribute were checking.
197  */
198 #define TAG_EQ(_x, _y) ((_x == _y) || (_x == TAG_ANY) || ((_x == TAG_NONE) && (_y == TAG_ANY)))
199 #define ATTRIBUTE_EQ(_x, _y) ((_x && _y) && (_x->da == _y->da) && (!_x->da->flags.has_tag || TAG_EQ(_x->tag, _y->tag)))
200 
201 #define NUM_ANY INT_MIN
202 #define NUM_ALL (INT_MIN + 1)
203 #define NUM_COUNT (INT_MIN + 2)
204 #define NUM_LAST (INT_MIN + 3)
205 
206 /* Allocation and management */
207 VALUE_PAIR *fr_pair_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da);
208 VALUE_PAIR *fr_pair_afrom_num(TALLOC_CTX *ctx, unsigned int vendor, unsigned int attr);
209 VALUE_PAIR *fr_pair_copy(TALLOC_CTX *ctx, VALUE_PAIR const *vp);
210 void fr_pair_steal(TALLOC_CTX *ctx, VALUE_PAIR *vp);
211 VALUE_PAIR *fr_pair_make(TALLOC_CTX *ctx, VALUE_PAIR **vps, char const *attribute, char const *value, FR_TOKEN op);
214 int fr_pair_mark_xlat(VALUE_PAIR *vp, char const *value);
215 
216 /* Searching and list modification */
217 VALUE_PAIR *fr_pair_find_by_da(VALUE_PAIR *head, fr_dict_attr_t const *da, int8_t tag);
218 VALUE_PAIR *fr_pair_find_by_num(VALUE_PAIR *head, unsigned int vendor, unsigned int attr, int8_t tag);
219 void fr_pair_add(VALUE_PAIR **head, VALUE_PAIR *vp);
220 void fr_pair_replace(VALUE_PAIR **head, VALUE_PAIR *add);
221 int fr_pair_update_by_num(TALLOC_CTX *ctx, VALUE_PAIR **list,
222  unsigned int vendor, unsigned int attr, int8_t tag, PW_TYPE type,
223  value_data_t *value);
224 void fr_pair_delete_by_num(VALUE_PAIR **head, unsigned int vendor, unsigned int attr, int8_t tag);
225 
226 /* Sorting */
227 typedef int8_t (*fr_cmp_t)(void const *a, void const *b);
228 
229 /** Compare two attributes using and operator.
230  *
231  * @return
232  * - 1 if equal.
233  * - 0 if not equal.
234  * - -1 on failure.
235  */
236 #define fr_pair_cmp_op(_op, _a, _b) value_data_cmp_op(_op, _a->da->type, &_a->data, _b->da->type, &_b->data)
237 int8_t fr_pair_cmp_by_da_tag(void const *a, void const *b);
238 int fr_pair_cmp(VALUE_PAIR *a, VALUE_PAIR *b);
241 
242 /* Filtering */
243 void fr_pair_validate_debug(TALLOC_CTX *ctx, VALUE_PAIR const *failed[2]);
244 bool fr_pair_validate(VALUE_PAIR const *failed[2], VALUE_PAIR *filter, VALUE_PAIR *list);
245 bool fr_pair_validate_relaxed(VALUE_PAIR const *failed[2], VALUE_PAIR *filter, VALUE_PAIR *list);
246 
247 /* Lists */
248 FR_TOKEN fr_pair_list_afrom_str(TALLOC_CTX *ctx, char const *buffer, VALUE_PAIR **head);
249 int fr_pair_list_afrom_file(TALLOC_CTX *ctx, VALUE_PAIR **out, FILE *fp, bool *pfiledone);
250 VALUE_PAIR *fr_pair_list_copy(TALLOC_CTX *ctx, VALUE_PAIR *from);
251 VALUE_PAIR *fr_pair_list_copy_by_num(TALLOC_CTX *ctx, VALUE_PAIR *from,
252  unsigned int vendor, unsigned int attr, int8_t tag);
253 void fr_pair_list_move(TALLOC_CTX *ctx, VALUE_PAIR **to, VALUE_PAIR **from);
254 void fr_pair_list_move_by_num(TALLOC_CTX *ctx, VALUE_PAIR **to, VALUE_PAIR **from,
255  unsigned int vendor, unsigned int attr, int8_t tag);
256 void fr_pair_list_mcopy_by_num(TALLOC_CTX *ctx, VALUE_PAIR **to, VALUE_PAIR **from,
257  unsigned int vendor, unsigned int attr, int8_t tag);
258 
259 /* Value manipulation */
260 int fr_pair_value_from_str(VALUE_PAIR *vp, char const *value, size_t len);
261 void fr_pair_value_memcpy(VALUE_PAIR *vp, uint8_t const *src, size_t len);
262 void fr_pair_value_memsteal(VALUE_PAIR *vp, uint8_t const *src);
263 void fr_pair_value_strsteal(VALUE_PAIR *vp, char const *src);
264 void fr_pair_value_strnsteal(VALUE_PAIR *vp, char *src, size_t len);
265 void fr_pair_value_strcpy(VALUE_PAIR *vp, char const *src);
266 void fr_pair_value_bstrncpy(VALUE_PAIR *vp, void const *src, size_t len);
267 void fr_pair_value_snprintf(VALUE_PAIR *vp, char const *fmt, ...) CC_HINT(format (printf, 2, 3));
268 
269 /* Printing functions */
270 size_t fr_pair_value_snprint(char *out, size_t outlen, VALUE_PAIR const *vp, char quote);
271 char *fr_pair_value_asprint(TALLOC_CTX *ctx, VALUE_PAIR const *vp, char quote);
272 size_t fr_pair_value_snprint_json(char *out, size_t outlen, VALUE_PAIR const *vp);
273 
274 size_t fr_pair_snprint(char *out, size_t outlen, VALUE_PAIR const *vp);
275 void fr_pair_fprint(FILE *, VALUE_PAIR const *vp);
276 void fr_pair_list_fprint(FILE *, VALUE_PAIR const *vp);
277 char *fr_pair_type_snprint(TALLOC_CTX *ctx, PW_TYPE type);
278 char *fr_pair_asprint(TALLOC_CTX *ctx, VALUE_PAIR const *vp, char quote);
279 
280 /* Hacky raw pair thing that needs to go away */
281 FR_TOKEN fr_pair_raw_from_str(char const **ptr, VALUE_PAIR_RAW *raw);
282 
283 #ifdef __cplusplus
284 }
285 #endif
286 #endif /* _PAIR_H */
void fr_pair_list_free(VALUE_PAIR **)
Free memory used by a valuepair list.
Definition: pair.c:544
int8_t(* fr_cmp_t)(void const *a, void const *b)
Definition: pair.h:227
bool fr_pair_validate_relaxed(VALUE_PAIR const *failed[2], VALUE_PAIR *filter, VALUE_PAIR *list)
Uses fr_pair_cmp to verify all VALUE_PAIRs in list match the filter defined by check.
Definition: pair.c:1184
VALUE_PAIR has a single value.
Definition: pair.h:101
#define RCSIDH(h, id)
Definition: build.h:136
void fr_pair_list_fprint(FILE *, VALUE_PAIR const *vp)
Print a list of attributes and enumv.
Definition: pair.c:2266
Dictionary attribute.
Definition: dict.h:77
VALUE_PAIR * fr_pair_afrom_num(TALLOC_CTX *ctx, unsigned int vendor, unsigned int attr)
Create a new valuepair.
Definition: pair.c:106
void fr_pair_list_mcopy_by_num(TALLOC_CTX *ctx, VALUE_PAIR **to, VALUE_PAIR **from, unsigned int vendor, unsigned int attr, int8_t tag)
Copy / delete matching pairs between VALUE_PAIR lists.
Definition: pair.c:1823
char * fr_pair_asprint(TALLOC_CTX *ctx, VALUE_PAIR const *vp, char quote)
Print one attribute and value to a string.
Definition: pair.c:2291
#define CC_HINT(_x)
Definition: build.h:71
void fr_pair_validate_debug(TALLOC_CTX *ctx, VALUE_PAIR const *failed[2])
Write an error to the library errorbuff detailing the mismatch.
Definition: pair.c:1068
int8_t tag
Tag value used to group valuepairs.
Definition: pair.h:121
void size_t fr_pair_value_snprint(char *out, size_t outlen, VALUE_PAIR const *vp, char quote)
Print the value of an attribute to a string.
Definition: pair.c:2107
void fr_pair_steal(TALLOC_CTX *ctx, VALUE_PAIR *vp)
Steal one VP.
Definition: pair.c:184
struct vp_cursor vp_cursor_t
Abstraction to allow iterating over different configurations of VALUE_PAIRs.
valuepair value must be xlat expanded when it's added to VALUE_PAIR tree.
Definition: pair.h:102
VALUE_PAIR * fr_pair_list_copy_by_num(TALLOC_CTX *ctx, VALUE_PAIR *from, unsigned int vendor, unsigned int attr, int8_t tag)
Copy matching pairs.
Definition: pair.c:1428
void fr_pair_fprint(FILE *, VALUE_PAIR const *vp)
Print one attribute and value to FP.
Definition: pair.c:2232
FR_TOKEN op
Operator.
Definition: pair.h:162
void fr_pair_list_move_by_num(TALLOC_CTX *ctx, VALUE_PAIR **to, VALUE_PAIR **from, unsigned int vendor, unsigned int attr, int8_t tag)
Move matching pairs between VALUE_PAIR lists.
Definition: pair.c:1795
Abstraction to allow iterating over different configurations of VALUE_PAIRs.
Definition: pair.h:144
struct value_pair * next
Definition: pair.h:116
VALUE_PAIR ** first
Definition: pair.h:145
char * fr_pair_value_asprint(TALLOC_CTX *ctx, VALUE_PAIR const *vp, char quote)
Print one attribute value to a string.
Definition: pair.c:2123
int fr_pair_update_by_num(TALLOC_CTX *ctx, VALUE_PAIR **list, unsigned int vendor, unsigned int attr, int8_t tag, PW_TYPE type, value_data_t *value)
Create a new VALUE_PAIR or replace the value of the head pair in the specified list.
Definition: pair.c:761
void fr_pair_value_strsteal(VALUE_PAIR *vp, char const *src)
Reparent an allocated char buffer to a VALUE_PAIR.
Definition: pair.c:1955
VALUE_PAIR * fr_pair_list_copy(TALLOC_CTX *ctx, VALUE_PAIR *from)
Copy a pairlist.
Definition: pair.c:1394
enum value_type value_type_t
The type of value a VALUE_PAIR contains.
char r_opand[1024]
Right hand side of the pair.
Definition: pair.h:158
void fr_pair_value_strcpy(VALUE_PAIR *vp, char const *src)
Copy data into an "string" data type.
Definition: pair.c:2013
int fr_pair_mark_xlat(VALUE_PAIR *vp, char const *value)
Mark a valuepair for xlat expansion.
Definition: pair.c:598
void fr_pair_add(VALUE_PAIR **head, VALUE_PAIR *vp)
Add a VP to the end of the list.
Definition: pair.c:659
struct value_pair VALUE_PAIR
Stores an attribute, a value and various bits of other data.
A VALUE_PAIR in string format.
Definition: pair.h:156
char * fr_pair_type_snprint(TALLOC_CTX *ctx, PW_TYPE type)
Definition: pair.c:2130
value_data_t * next
Next in a series of value_data.
Definition: pair.h:88
Stores an attribute, a value and various bits of other data.
Definition: pair.h:112
VALUE_PAIR * found
pairfind marker.
Definition: pair.h:146
int8_t fr_pair_cmp_by_da_tag(void const *a, void const *b)
Definition: pair.c:815
VALUE_PAIR has children.
Definition: pair.h:99
value_type
The type of value a VALUE_PAIR contains.
Definition: pair.h:97
bool fr_pair_validate(VALUE_PAIR const *failed[2], VALUE_PAIR *filter, VALUE_PAIR *list)
Uses fr_pair_cmp to verify all VALUE_PAIRs in list match the filter defined by check.
Definition: pair.c:1117
FR_TOKEN op
Operator to use when moving or inserting valuepair into a list.
Definition: pair.h:118
int fr_pair_value_from_str(VALUE_PAIR *vp, char const *value, size_t len)
Convert string value to native attribute value.
Definition: pair.c:1840
void fr_pair_delete_by_num(VALUE_PAIR **head, unsigned int vendor, unsigned int attr, int8_t tag)
Delete matching pairs.
Definition: pair.c:797
VALUE_PAIR * fr_pair_find_by_da(VALUE_PAIR *head, fr_dict_attr_t const *da, int8_t tag)
Find the pair with the matching DAs.
Definition: pair.c:624
size_t fr_pair_value_snprint_json(char *out, size_t outlen, VALUE_PAIR const *vp)
void fr_pair_list_move(TALLOC_CTX *ctx, VALUE_PAIR **to, VALUE_PAIR **from)
Move pairs from source list to destination list respecting operator.
Definition: pair.c:1508
size_t length
Length of value data.
Definition: pair.h:87
FR_TOKEN fr_pair_raw_from_str(char const **ptr, VALUE_PAIR_RAW *raw)
Read a single valuepair from a buffer, and advance the pointer.
Definition: pair.c:2335
void fr_pair_value_memsteal(VALUE_PAIR *vp, uint8_t const *src)
Reparent an allocated octet buffer to a VALUE_PAIR.
Definition: pair.c:1933
void fr_pair_list_sort(VALUE_PAIR **vps, fr_cmp_t cmp)
Sort a linked list of VALUE_PAIRs using merge sort.
Definition: pair.c:1036
value_type_t type
Type of pointer in value union.
Definition: pair.h:132
VALUE_PAIR * current
The current attribute.
Definition: pair.h:148
int fr_pair_to_unknown(VALUE_PAIR *vp)
Mark malformed or unrecognised attributed as unknown.
Definition: pair.c:570
int fr_pair_list_afrom_file(TALLOC_CTX *ctx, VALUE_PAIR **out, FILE *fp, bool *pfiledone)
Definition: pair.c:1333
VALUE_PAIR * next
Next attribute to process.
Definition: pair.h:149
VALUE_PAIR has multiple values.
Definition: pair.h:100
PRIVATE void decimal(struct DATA *p, double d)
Definition: snprintf.c:254
void fr_pair_value_strnsteal(VALUE_PAIR *vp, char *src, size_t len)
Reparent an allocated char buffer to a VALUE_PAIR reallocating the buffer to the correct size...
Definition: pair.c:1980
VALUE_PAIR * last
Temporary only used for fr_cursor_insert.
Definition: pair.h:147
VALUE_PAIR has no value.
Definition: pair.h:98
VALUE_PAIR * fr_pair_copy(TALLOC_CTX *ctx, VALUE_PAIR const *vp)
Copy a single valuepair.
Definition: pair.c:129
size_t fr_pair_snprint(char *out, size_t outlen, VALUE_PAIR const *vp)
Print one attribute and value to a string.
Definition: pair.c:2189
int fr_pair_cmp(VALUE_PAIR *a, VALUE_PAIR *b)
Compare two pairs, using the operator from "a".
Definition: pair.c:850
VALUE_PAIR * fr_pair_find_by_num(VALUE_PAIR *head, unsigned int vendor, unsigned int attr, int8_t tag)
Find the pair with the matching attribute.
Definition: pair.c:639
enum fr_token FR_TOKEN
VALUE_PAIR * fr_pair_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da)
Dynamically allocate a new attribute.
Definition: pair.c:58
Definition: pair.c:37
fr_dict_attr_t const * da
Dictionary attribute defines the attribute.
Definition: pair.h:113
void fr_pair_value_bstrncpy(VALUE_PAIR *vp, void const *src, size_t len)
Copy data into an "string" data type.
Definition: pair.c:2043
char l_opand[256]
Left hand side of the pair.
Definition: pair.h:157
void fr_pair_replace(VALUE_PAIR **head, VALUE_PAIR *add)
Replace all matching VPs.
Definition: pair.c:696
FR_TOKEN fr_pair_list_afrom_str(TALLOC_CTX *ctx, char const *buffer, VALUE_PAIR **head)
Read one line of attribute/value pairs into a list.
Definition: pair.c:1261
FR_TOKEN quote
Type of quoting around the r_opand.
Definition: pair.h:160
void fr_pair_value_snprintf(VALUE_PAIR *vp, char const *fmt,...) CC_HINT(format(printf
VALUE_PAIR * fr_pair_make(TALLOC_CTX *ctx, VALUE_PAIR **vps, char const *attribute, char const *value, FR_TOKEN op)
Create a VALUE_PAIR from ASCII strings.
Definition: pair.c:338
void fr_pair_value_memcpy(VALUE_PAIR *vp, uint8_t const *src, size_t len)
Copy data into an "octets" data type.
Definition: pair.c:1905
PW_TYPE
Internal data types used within libfreeradius.
Definition: radius.h:31
int fr_pair_list_cmp(VALUE_PAIR *a, VALUE_PAIR *b)
Determine equality of two lists.
Definition: pair.c:927
struct value_pair_raw VALUE_PAIR_RAW
A VALUE_PAIR in string format.
value_data_t data
Definition: pair.h:133