1 /* Copyright 2011 PADL Software Pty Ltd. All rights reserved.
2 See the file COPYING for licensing information. */
4 #if defined HAVE_CONFIG_H
14 #include <radsec/radsec.h>
15 #include <radius/client.h>
17 #define RS_ERR(err) ((err) < 0 ? -err : RSE_OK)
20 rs_avp_free (rs_avp **vps)
26 rs_avp_length (rs_const_avp *vp)
33 rs_avp_typeof (rs_const_avp *vp)
35 return vp ? vp->da->type : RS_TYPE_INVALID;
39 rs_avp_attrid (rs_const_avp *vp,
44 *vendor = vp->da->vendor;
48 rs_avp_name (rs_const_avp *vp)
50 return vp ? vp->da->name : NULL;
54 rs_avp_append (rs_avp **head, rs_avp *tail)
56 nr_vps_append (head, tail);
60 rs_avp_find (rs_avp *vp, unsigned int attr, unsigned int vendor)
65 return nr_vps_find (vp, attr, vendor);
69 rs_avp_find_const (rs_const_avp *vp,
70 unsigned int attr, unsigned int vendor)
75 return nr_vps_find ((rs_avp *)vp, attr, vendor);
79 rs_avp_alloc (unsigned int attr, unsigned int vendor)
84 da = nr_dict_attr_byvalue (attr, vendor);
86 vp = nr_vp_alloc_raw (attr, vendor);
88 vp = nr_vp_alloc (da);
98 rs_avp_dup (rs_const_avp *vp)
102 vp2 = nr_vp_alloc (vp->da);
106 vp2->length = vp->length;
111 if (rs_avp_is_tlv (vp)) {
112 vp2->vp_tlv = malloc (vp->length);
113 if (vp2->vp_tlv == NULL) {
117 memcpy (vp2->vp_tlv, vp->vp_tlv, vp->length);
122 memcpy (vp2->vp_strvalue, vp->vp_strvalue, vp->length);
123 if (rs_avp_is_string (vp))
124 vp2->vp_strvalue[vp->length] = '\0';
130 rs_avp_next (rs_avp *avp)
132 return avp ? avp->next : NULL;
136 rs_avp_next_const (rs_const_avp *avp)
138 return avp ? avp->next : NULL;
142 rs_avp_delete (rs_avp **first,
143 unsigned int attr, unsigned int vendor)
148 for (p = first; *p != NULL; p++) {
149 if ((*p)->da->attr == attr &&
150 (*p)->da->vendor == vendor) {
151 rs_avp *next = (*p)->next;
161 return found ? RSE_OK : RSE_ATTR_UNKNOWN;
165 rs_avp_string_value (rs_const_avp *vp)
167 if (!rs_avp_is_string (vp))
170 return vp->vp_strvalue;
174 rs_avp_string_set (rs_avp *vp, const char *str)
180 if (!rs_avp_is_string (vp))
181 return RSE_ATTR_INVALID;
183 err = nr_vp_set_data (vp, str, strlen (str));
188 rs_avp_integer_value (rs_const_avp *vp)
190 if (!rs_avp_is_integer (vp))
192 return vp->vp_integer;
196 rs_avp_integer_set (rs_avp *vp, uint32_t val)
202 if (!rs_avp_is_integer (vp))
203 return RSE_ATTR_INVALID;
205 err = nr_vp_set_data (vp, &val, sizeof (val));
210 rs_avp_ipaddr_value (rs_const_avp *vp)
212 if (!rs_avp_is_ipaddr (vp))
214 return vp->vp_ipaddr;
218 rs_avp_ipaddr_set (rs_avp *vp, struct in_addr in)
224 if (!rs_avp_is_ipaddr (vp))
225 return RSE_ATTR_INVALID;
227 err = nr_vp_set_data (vp, &in, sizeof (in));
232 rs_avp_date_value (rs_const_avp *vp)
234 if (!rs_avp_is_date (vp))
240 rs_avp_date_set (rs_avp *vp, time_t date)
247 if (!rs_avp_is_date (vp))
248 return RSE_ATTR_INVALID;
249 if (date > 0xFFFFFFFF)
250 return RSE_ATTR_INVALID;
252 date32 = (uint32_t)date;
253 err = nr_vp_set_data (vp, &date32, sizeof (date32));
258 const unsigned char *
259 rs_avp_octets_value_const_ptr (rs_const_avp *vp)
261 return rs_avp_octets_value_ptr ((rs_avp *)vp);
265 rs_avp_octets_value_ptr (rs_avp *vp)
271 if (rs_avp_is_tlv (vp))
275 return vp->vp_octets;
279 rs_avp_octets_value_byref (rs_avp *vp,
287 *p = (unsigned char *)rs_avp_octets_value_ptr (vp);
293 rs_avp_octets_value (rs_const_avp *vp,
300 if (vp->length > *len) {
302 return RSE_ATTR_TOO_SMALL;
308 if (rs_avp_is_tlv (vp))
309 memcpy (buf, vp->vp_tlv, vp->length);
312 memcpy (buf, vp->vp_octets, vp->length);
318 rs_avp_fragmented_value (rs_const_avp *vps,
322 size_t total_len = 0;
329 if (!rs_avp_is_octets (vps) &&
330 !rs_avp_is_string (vps))
331 return RSE_ATTR_INVALID;
335 vp = rs_avp_find_const (vp->next, vp->da->attr, vp->da->vendor))
336 total_len += vp->length;
338 if (*len < total_len) {
340 return RSE_ATTR_TOO_SMALL;
343 for (vp = vps, p = buf;
345 vp = rs_avp_find_const (vp->next, vp->da->attr, vp->da->vendor)) {
346 memcpy (p, vp->vp_octets, vp->length);
356 rs_avp_octets_set (rs_avp *vp,
357 const unsigned char *buf,
362 if (!rs_avp_is_octets (vp))
363 return RSE_ATTR_INVALID;
365 err = nr_vp_set_data (vp, buf, len);
371 rs_avp_ifid_value (rs_const_avp *vp, uint8_t val[8])
373 if (!rs_avp_is_ifid (vp))
374 return RSE_ATTR_INVALID;
376 memcpy (val, vp->vp_ifid, 8);
382 rs_avp_ifid_set (rs_avp *vp, const uint8_t val[8])
386 if (!rs_avp_is_ifid (vp))
387 return RSE_ATTR_INVALID;
389 err = nr_vp_set_data (vp, val, 8);
394 rs_avp_byte_value (rs_const_avp *vp)
396 if (!rs_avp_is_byte (vp))
398 return vp->vp_integer;
402 rs_avp_byte_set (rs_avp *vp, uint8_t val)
406 if (!rs_avp_is_byte (vp))
407 return RSE_ATTR_INVALID;
409 err = nr_vp_set_data (vp, &val, sizeof (val));
414 rs_avp_short_value (rs_const_avp *vp)
416 if (!rs_avp_is_short (vp))
418 return vp->vp_integer;
422 rs_avp_short_set (rs_avp *vp, uint16_t val)
426 if (!rs_avp_is_short (vp))
427 return RSE_ATTR_INVALID;
429 err = nr_vp_set_data (vp, &val, sizeof (val));
434 rs_attr_find (const char *name,
436 unsigned int *vendor)
440 da = nr_dict_attr_byname (name);
442 return RSE_ATTR_UNKNOWN;
445 *vendor = da->vendor;
451 rs_avp_display_value (rs_const_avp *vp,
455 return nr_vp_snprintf_value (buffer, buflen, vp);