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)
35 rs_avp_typeof (rs_const_avp *vp)
38 return RS_TYPE_INVALID;
44 rs_avp_attrid (rs_const_avp *vp,
51 *vendor = vp->da->vendor;
55 rs_avp_name (rs_const_avp *vp)
57 return (vp != NULL) ? vp->da->name : NULL;
61 rs_avp_append (rs_avp **head, rs_avp *tail)
63 nr_vps_append (head, tail);
67 rs_avp_find (rs_avp *vp, unsigned int attr, unsigned int vendor)
72 return nr_vps_find (vp, attr, vendor);
76 rs_avp_find_const (rs_const_avp *vp,
77 unsigned int attr, unsigned int vendor)
82 return nr_vps_find ((rs_avp *)vp, attr, vendor);
86 rs_avp_alloc (unsigned int attr, unsigned int vendor)
91 da = nr_dict_attr_byvalue (attr, vendor);
93 vp = nr_vp_alloc_raw (attr, vendor);
95 vp = nr_vp_alloc (da);
105 rs_avp_dup (rs_const_avp *vp)
109 vp2 = nr_vp_alloc (vp->da);
113 vp2->length = vp->length;
118 if (rs_avp_is_tlv (vp)) {
119 vp2->vp_tlv = malloc (vp->length);
120 if (vp2->vp_tlv == NULL) {
124 memcpy (vp2->vp_tlv, vp->vp_tlv, vp->length);
129 memcpy (vp2->vp_strvalue, vp->vp_strvalue, vp->length);
130 if (rs_avp_is_string (vp))
131 vp2->vp_strvalue[vp->length] = '\0';
137 rs_avp_next (rs_avp *vp)
139 return (vp != NULL) ? vp->next : NULL;
143 rs_avp_next_const (rs_const_avp *vp)
145 return (vp != NULL) ? vp->next : NULL;
149 rs_avp_delete (rs_avp **first,
150 unsigned int attr, unsigned int vendor)
155 for (p = first; *p != NULL; p++) {
156 if ((*p)->da->attr == attr &&
157 (*p)->da->vendor == vendor) {
158 rs_avp *next = (*p)->next;
168 return found ? RSE_OK : RSE_ATTR_UNKNOWN;
172 rs_avp_string_value (rs_const_avp *vp)
174 if (!rs_avp_is_string (vp))
177 return vp->vp_strvalue;
181 rs_avp_string_set (rs_avp *vp, const char *str)
187 if (!rs_avp_is_string (vp))
188 return RSE_ATTR_INVALID;
190 err = nr_vp_set_data (vp, str, strlen (str));
195 rs_avp_integer_value (rs_const_avp *vp)
197 if (!rs_avp_is_integer (vp))
199 return vp->vp_integer;
203 rs_avp_integer_set (rs_avp *vp, uint32_t val)
209 if (!rs_avp_is_integer (vp))
210 return RSE_ATTR_INVALID;
212 err = nr_vp_set_data (vp, &val, sizeof (val));
217 rs_avp_ipaddr_value (rs_const_avp *vp)
219 if (!rs_avp_is_ipaddr (vp))
221 return vp->vp_ipaddr;
225 rs_avp_ipaddr_set (rs_avp *vp, struct in_addr in)
231 if (!rs_avp_is_ipaddr (vp))
232 return RSE_ATTR_INVALID;
234 err = nr_vp_set_data (vp, &in, sizeof (in));
239 rs_avp_date_value (rs_const_avp *vp)
241 if (!rs_avp_is_date (vp))
247 rs_avp_date_set (rs_avp *vp, time_t date)
254 if (!rs_avp_is_date (vp))
255 return RSE_ATTR_INVALID;
256 if (date > 0xFFFFFFFF)
257 return RSE_ATTR_INVALID;
259 date32 = (uint32_t)date;
260 err = nr_vp_set_data (vp, &date32, sizeof (date32));
265 const unsigned char *
266 rs_avp_octets_value_const_ptr (rs_const_avp *vp)
268 return rs_avp_octets_value_ptr ((rs_avp *)vp);
272 rs_avp_octets_value_ptr (rs_avp *vp)
278 if (rs_avp_is_tlv (vp))
282 return vp->vp_octets;
286 rs_avp_octets_value_byref (rs_avp *vp,
294 *p = (unsigned char *)rs_avp_octets_value_ptr (vp);
300 rs_avp_octets_value (rs_const_avp *vp,
307 if (vp->length > *len) {
309 return RSE_ATTR_TOO_SMALL;
315 if (rs_avp_is_tlv (vp))
316 memcpy (buf, vp->vp_tlv, vp->length);
319 memcpy (buf, vp->vp_octets, vp->length);
325 rs_avp_fragmented_value (rs_const_avp *vps,
329 size_t total_len = 0;
336 if (!rs_avp_is_octets (vps) &&
337 !rs_avp_is_string (vps))
338 return RSE_ATTR_INVALID;
342 vp = rs_avp_find_const (vp->next, vp->da->attr, vp->da->vendor))
343 total_len += vp->length;
345 if (*len < total_len) {
347 return RSE_ATTR_TOO_SMALL;
350 for (vp = vps, p = buf;
352 vp = rs_avp_find_const (vp->next, vp->da->attr, vp->da->vendor)) {
353 memcpy (p, vp->vp_octets, vp->length);
363 rs_avp_octets_set (rs_avp *vp,
364 const unsigned char *buf,
369 if (!rs_avp_is_octets (vp))
370 return RSE_ATTR_INVALID;
372 err = nr_vp_set_data (vp, buf, len);
378 rs_avp_ifid_value (rs_const_avp *vp, uint8_t val[8])
380 if (!rs_avp_is_ifid (vp))
381 return RSE_ATTR_INVALID;
383 memcpy (val, vp->vp_ifid, 8);
389 rs_avp_ifid_set (rs_avp *vp, const uint8_t val[8])
393 if (!rs_avp_is_ifid (vp))
394 return RSE_ATTR_INVALID;
396 err = nr_vp_set_data (vp, val, 8);
401 rs_avp_byte_value (rs_const_avp *vp)
403 if (!rs_avp_is_byte (vp))
405 return vp->vp_integer;
409 rs_avp_byte_set (rs_avp *vp, uint8_t val)
413 if (!rs_avp_is_byte (vp))
414 return RSE_ATTR_INVALID;
416 err = nr_vp_set_data (vp, &val, sizeof (val));
421 rs_avp_short_value (rs_const_avp *vp)
423 if (!rs_avp_is_short (vp))
425 return vp->vp_integer;
429 rs_avp_short_set (rs_avp *vp, uint16_t val)
433 if (!rs_avp_is_short (vp))
434 return RSE_ATTR_INVALID;
436 err = nr_vp_set_data (vp, &val, sizeof (val));
441 rs_attr_find (const char *name,
443 unsigned int *vendor)
447 da = nr_dict_attr_byname (name);
449 return RSE_ATTR_UNKNOWN;
452 *vendor = da->vendor;
458 rs_attr_display_name (unsigned int attr,
464 const DICT_ATTR *da = NULL;
469 da = nr_dict_attr_byvalue (attr, vendor);
472 err = nr_dict_attr_2struct(&da2, attr, vendor,
477 snprintf(buffer, bufsize, "%s", da->name);
484 rs_attr_parse_name (const char *name,
486 unsigned int *vendor)
490 if (strncmp(name, "Attr-", 5) == 0) {
491 char *s = (char *)&name[5];
494 tmp = strtoul(s, &s, 10);
499 case PW_VENDOR_SPECIFIC:
500 *vendor = strtoul(s, &s, 10);
502 return RSE_ATTR_BAD_NAME;
506 *attr = strtoul(s, &s, 10);
508 return RSE_ATTR_BAD_NAME;
512 return RSE_ATTR_BAD_NAME;
519 da = nr_dict_attr_byname (name);
521 return RSE_ATTR_UNKNOWN;
524 *vendor = da->vendor;
531 rs_avp_display_value (rs_const_avp *vp,
535 return nr_vp_snprintf_value (buffer, buflen, vp);