1 /* Copyright 2011 PADL Software Pty Ltd. All rights reserved.
2 See the file COPYING for licensing information. */
4 #if defined HAVE_CONFIG_H
15 #include <radsec/radsec.h>
16 #include <radius/client.h>
18 #define RS_ERR(err) ((err) < 0 ? -err : RSE_OK)
21 rs_avp_free (rs_avp **vps)
27 rs_avp_length (rs_const_avp *vp)
34 rs_avp_typeof (rs_const_avp *vp)
36 return vp ? vp->da->type : RS_TYPE_INVALID;
40 rs_avp_attrid (rs_const_avp *vp,
45 *vendor = vp->da->vendor;
49 rs_avp_name (rs_const_avp *vp)
51 return vp ? vp->da->name : NULL;
55 rs_avp_append (rs_avp **head, rs_avp *tail)
57 return nr_vps_append (head, tail);
61 rs_avp_find (rs_avp *vp, unsigned int attr, unsigned int vendor)
66 return nr_vps_find (vp, attr, vendor);
70 rs_avp_find_const (rs_const_avp *vp,
71 unsigned int attr, unsigned int vendor)
76 return nr_vps_find ((rs_avp *)vp, attr, vendor);
80 rs_avp_alloc (unsigned int attr, unsigned int vendor)
85 da = nr_dict_attr_byvalue (attr, vendor);
87 vp = nr_vp_alloc_raw (attr, vendor);
89 vp = nr_vp_alloc (da);
99 rs_avp_dup (rs_const_avp *vp)
103 vp2 = nr_vp_alloc (vp->da);
107 vp2->length = vp->length;
112 if (rs_avp_is_tlv (vp)) {
113 vp2->vp_tlv = malloc (vp->length);
114 if (vp2->vp_tlv == NULL) {
118 memcpy (vp2->vp_tlv, vp->vp_tlv, vp->length);
123 memcpy (vp2->vp_strvalue, vp->vp_strvalue, vp->length);
124 if (rs_avp_is_string (vp))
125 vp2->vp_strvalue[vp->length] = '\0';
131 rs_avp_next (rs_avp *avp)
133 return avp ? avp->next : NULL;
137 rs_avp_next_const (rs_const_avp *avp)
139 return avp ? avp->next : NULL;
143 rs_avp_delete (rs_avp **first,
144 unsigned int attr, unsigned int vendor)
149 for (p = first; *p != NULL; p++) {
150 if ((*p)->da->attr == attr &&
151 (*p)->da->vendor == vendor) {
152 rs_avp *next = (*p)->next;
162 return found ? RSE_OK : RSE_ATTR_UNKNOWN;
166 rs_avp_string_value (rs_const_avp *vp)
168 if (!rs_avp_is_string (vp))
171 return vp->vp_strvalue;
175 rs_avp_string_set (rs_avp *vp, const char *str)
181 if (!rs_avp_is_string (vp))
182 return RSE_ATTR_INVALID;
184 err = nr_vp_set_data (vp, str, strlen (str));
189 rs_avp_integer_value (rs_const_avp *vp)
191 if (!rs_avp_is_integer (vp))
193 return vp->vp_integer;
197 rs_avp_integer_set (rs_avp *vp, uint32_t val)
203 if (!rs_avp_is_integer (vp))
204 return RSE_ATTR_INVALID;
206 err = nr_vp_set_data (vp, &val, sizeof (val));
211 rs_avp_ipaddr_value (rs_const_avp *vp)
213 if (!rs_avp_is_ipaddr (vp))
215 return vp->vp_ipaddr;
219 rs_avp_ipaddr_set (rs_avp *vp, struct in_addr in)
225 if (!rs_avp_is_ipaddr (vp))
226 return RSE_ATTR_INVALID;
228 err = nr_vp_set_data (vp, &in, sizeof (in));
233 rs_avp_date_value (rs_const_avp *vp)
235 if (!rs_avp_is_date (vp))
241 rs_avp_date_set (rs_avp *vp, time_t date)
248 if (!rs_avp_is_date (vp))
249 return RSE_ATTR_INVALID;
250 if (date > 0xFFFFFFFF)
251 return RSE_ATTR_INVALID;
253 date32 = (uint32_t)date;
254 err = nr_vp_set_data (vp, &date32, sizeof (date32));
259 const unsigned char *
260 rs_avp_octets_value_const_ptr (rs_const_avp *vp)
262 return rs_avp_octets_value_ptr ((rs_avp *)vp);
266 rs_avp_octets_value_ptr (rs_avp *vp)
272 if (rs_avp_is_tlv (vp))
276 return vp->vp_octets;
280 rs_avp_octets_value_byref (rs_avp *vp,
288 *p = (unsigned char *)rs_avp_octets_value_ptr (vp);
294 rs_avp_octets_value (rs_const_avp *vp,
301 if (vp->length > *len) {
303 return RSE_ATTR_TOO_SMALL;
309 if (rs_avp_is_tlv (vp))
310 memcpy (buf, vp->vp_tlv, vp->length);
313 memcpy (buf, vp->vp_octets, vp->length);
319 rs_avp_fragmented_value (rs_const_avp *vps,
323 size_t total_len = 0;
330 if (!rs_avp_is_octets (vps) &&
331 !rs_avp_is_string (vps))
332 return RSE_ATTR_INVALID;
336 vp = rs_avp_find_const (vp->next, vp->da->attr, vp->da->vendor))
337 total_len += vp->length;
339 if (*len < total_len) {
341 return RSE_ATTR_TOO_SMALL;
344 for (vp = vps, p = buf;
346 vp = rs_avp_find_const (vp->next, vp->da->attr, vp->da->vendor)) {
347 memcpy (p, vp->vp_octets, vp->length);
357 rs_avp_octets_set (rs_avp *vp,
358 const unsigned char *buf,
363 if (!rs_avp_is_octets (vp))
364 return RSE_ATTR_INVALID;
366 err = nr_vp_set_data (vp, buf, len);
372 rs_avp_ifid_value (rs_const_avp *vp, uint8_t val[8])
374 if (!rs_avp_is_ifid (vp))
375 return RSE_ATTR_INVALID;
377 memcpy (val, vp->vp_ifid, 8);
383 rs_avp_ifid_set (rs_avp *vp, const uint8_t val[8])
387 if (!rs_avp_is_ifid (vp))
388 return RSE_ATTR_INVALID;
390 err = nr_vp_set_data (vp, val, 8);
395 rs_avp_byte_value (rs_const_avp *vp)
397 if (!rs_avp_is_byte (vp))
399 return vp->vp_integer;
403 rs_avp_byte_set (rs_avp *vp, uint8_t val)
407 if (!rs_avp_is_byte (vp))
408 return RSE_ATTR_INVALID;
410 err = nr_vp_set_data (vp, &val, sizeof (val));
415 rs_avp_short_value (rs_const_avp *vp)
417 if (!rs_avp_is_short (vp))
419 return vp->vp_integer;
423 rs_avp_short_set (rs_avp *vp, uint16_t val)
427 if (!rs_avp_is_short (vp))
428 return RSE_ATTR_INVALID;
430 err = nr_vp_set_data (vp, &val, sizeof (val));
435 rs_attr_find (const char *name,
437 unsigned int *vendor)
441 da = nr_dict_attr_byname (name);
443 return RSE_ATTR_UNKNOWN;
446 *vendor = da->vendor;
452 rs_avp_display_value (rs_const_avp *vp,
456 return nr_vp_snprintf_value (buffer, buflen, vp);