1 /* Copyright 2011 JANET(UK). All rights reserved.
2 See LICENSE 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 if (vp->da->flags.unknown)
110 vp2 = nr_vp_alloc_raw (vp->da->attr, vp->da->vendor);
112 vp2 = nr_vp_alloc (vp->da);
116 vp2->length = vp->length;
121 if (rs_avp_is_tlv (vp)) {
122 vp2->vp_tlv = malloc (vp->length);
123 if (vp2->vp_tlv == NULL) {
127 memcpy (vp2->vp_tlv, vp->vp_tlv, vp->length);
132 memcpy (vp2->vp_strvalue, vp->vp_strvalue, vp->length);
133 if (rs_avp_is_string (vp))
134 vp2->vp_strvalue[vp->length] = '\0';
140 rs_avp_next (rs_avp *vp)
142 return (vp != NULL) ? vp->next : NULL;
146 rs_avp_next_const (rs_const_avp *vp)
148 return (vp != NULL) ? vp->next : NULL;
152 rs_avp_delete (rs_avp **first,
153 unsigned int attr, unsigned int vendor)
158 for (p = first; *p != NULL; p++) {
159 if ((*p)->da->attr == attr &&
160 (*p)->da->vendor == vendor) {
161 rs_avp *next = (*p)->next;
171 return found ? RSE_OK : RSE_ATTR_UNKNOWN;
175 rs_avp_string_value (rs_const_avp *vp)
177 if (!rs_avp_is_string (vp))
180 return vp->vp_strvalue;
184 rs_avp_string_set (rs_avp *vp, const char *str)
190 if (!rs_avp_is_string (vp))
191 return RSE_ATTR_INVALID;
193 err = nr_vp_set_data (vp, str, strlen (str));
198 rs_avp_integer_value (rs_const_avp *vp)
200 if (!rs_avp_is_integer (vp))
202 return vp->vp_integer;
206 rs_avp_integer_set (rs_avp *vp, uint32_t val)
212 if (!rs_avp_is_integer (vp))
213 return RSE_ATTR_INVALID;
215 err = nr_vp_set_data (vp, &val, sizeof (val));
220 rs_avp_ipaddr_value (rs_const_avp *vp)
222 if (!rs_avp_is_ipaddr (vp))
224 return vp->vp_ipaddr;
228 rs_avp_ipaddr_set (rs_avp *vp, struct in_addr in)
234 if (!rs_avp_is_ipaddr (vp))
235 return RSE_ATTR_INVALID;
237 err = nr_vp_set_data (vp, &in, sizeof (in));
242 rs_avp_date_value (rs_const_avp *vp)
244 if (!rs_avp_is_date (vp))
250 rs_avp_date_set (rs_avp *vp, time_t date)
257 if (!rs_avp_is_date (vp))
258 return RSE_ATTR_INVALID;
259 if (date > 0xFFFFFFFF)
260 return RSE_ATTR_INVALID;
262 date32 = (uint32_t)date;
263 err = nr_vp_set_data (vp, &date32, sizeof (date32));
268 const unsigned char *
269 rs_avp_octets_value_const_ptr (rs_const_avp *vp)
271 return rs_avp_octets_value_ptr ((rs_avp *)vp);
275 rs_avp_octets_value_ptr (rs_avp *vp)
281 if (rs_avp_is_tlv (vp))
285 return vp->vp_octets;
289 rs_avp_octets_value_byref (rs_avp *vp,
297 *p = (unsigned char *)rs_avp_octets_value_ptr (vp);
303 rs_avp_octets_value (rs_const_avp *vp,
310 if (vp->length > *len) {
312 return RSE_ATTR_TOO_SMALL;
318 if (rs_avp_is_tlv (vp))
319 memcpy (buf, vp->vp_tlv, vp->length);
322 memcpy (buf, vp->vp_octets, vp->length);
328 rs_avp_fragmented_value (rs_const_avp *vps,
332 size_t total_len = 0;
339 if (!rs_avp_is_octets (vps) &&
340 !rs_avp_is_string (vps))
341 return RSE_ATTR_INVALID;
345 vp = rs_avp_find_const (vp->next, vp->da->attr, vp->da->vendor))
346 total_len += vp->length;
348 if (*len < total_len) {
350 return RSE_ATTR_TOO_SMALL;
353 for (vp = vps, p = buf;
355 vp = rs_avp_find_const (vp->next, vp->da->attr, vp->da->vendor)) {
356 memcpy (p, vp->vp_octets, vp->length);
366 rs_avp_octets_set (rs_avp *vp,
367 const unsigned char *buf,
372 if (!rs_avp_is_octets (vp))
373 return RSE_ATTR_INVALID;
375 err = nr_vp_set_data (vp, buf, len);
381 rs_avp_ifid_value (rs_const_avp *vp, uint8_t val[8])
383 if (!rs_avp_is_ifid (vp))
384 return RSE_ATTR_INVALID;
386 memcpy (val, vp->vp_ifid, 8);
392 rs_avp_ifid_set (rs_avp *vp, const uint8_t val[8])
396 if (!rs_avp_is_ifid (vp))
397 return RSE_ATTR_INVALID;
399 err = nr_vp_set_data (vp, val, 8);
404 rs_avp_byte_value (rs_const_avp *vp)
406 if (!rs_avp_is_byte (vp))
408 return vp->vp_integer;
412 rs_avp_byte_set (rs_avp *vp, uint8_t val)
416 if (!rs_avp_is_byte (vp))
417 return RSE_ATTR_INVALID;
419 err = nr_vp_set_data (vp, &val, sizeof (val));
424 rs_avp_short_value (rs_const_avp *vp)
426 if (!rs_avp_is_short (vp))
428 return vp->vp_integer;
432 rs_avp_short_set (rs_avp *vp, uint16_t val)
436 if (!rs_avp_is_short (vp))
437 return RSE_ATTR_INVALID;
439 err = nr_vp_set_data (vp, &val, sizeof (val));
444 rs_attr_find (const char *name,
446 unsigned int *vendor)
450 da = nr_dict_attr_byname (name);
452 return RSE_ATTR_UNKNOWN;
455 *vendor = da->vendor;
461 rs_attr_display_name (unsigned int attr,
467 const DICT_ATTR *da = NULL;
472 da = nr_dict_attr_byvalue (attr, vendor);
475 err = nr_dict_attr_2struct(&da2, attr, vendor,
480 snprintf(buffer, bufsize, "%s", da->name);
487 rs_attr_parse_name (const char *name,
489 unsigned int *vendor)
493 if (strncmp(name, "Attr-", 5) == 0) {
494 char *s = (char *)&name[5];
497 tmp = strtoul(s, &s, 10);
502 case PW_VENDOR_SPECIFIC:
503 *vendor = strtoul(s, &s, 10);
505 return RSE_ATTR_BAD_NAME;
509 *attr = strtoul(s, &s, 10);
511 return RSE_ATTR_BAD_NAME;
515 return RSE_ATTR_BAD_NAME;
522 da = nr_dict_attr_byname (name);
524 return RSE_ATTR_UNKNOWN;
527 *vendor = da->vendor;
534 rs_avp_display_value (rs_const_avp *vp,
538 return nr_vp_snprintf_value (buffer, buflen, vp);