From e87ddf0b57d24a00e12df936f45bed0ca4d964cd Mon Sep 17 00:00:00 2001 From: aland Date: Thu, 17 Apr 2008 08:24:28 +0000 Subject: [PATCH] API to copy just one VP. --- src/include/libradius.h | 1 + src/lib/valuepair.c | 41 +++++++++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/include/libradius.h b/src/include/libradius.h index 0cfbfb0..468c3e4 100644 --- a/src/include/libradius.h +++ b/src/include/libradius.h @@ -327,6 +327,7 @@ void pairdelete(VALUE_PAIR **, int); void pairadd(VALUE_PAIR **, VALUE_PAIR *); void pairreplace(VALUE_PAIR **first, VALUE_PAIR *add); int paircmp(VALUE_PAIR *check, VALUE_PAIR *data); +VALUE_PAIR *paircopyvp(const VALUE_PAIR *vp); VALUE_PAIR *paircopy(VALUE_PAIR *vp); VALUE_PAIR *paircopy2(VALUE_PAIR *vp, int attr); void pairmove(VALUE_PAIR **to, VALUE_PAIR **from); diff --git a/src/lib/valuepair.c b/src/lib/valuepair.c index f429005..7b3ed9d 100644 --- a/src/lib/valuepair.c +++ b/src/lib/valuepair.c @@ -292,6 +292,31 @@ void pairreplace(VALUE_PAIR **first, VALUE_PAIR *replace) *prev = replace; } + +/* + * Copy just one VP. + */ +VALUE_PAIR *paircopyvp(const VALUE_PAIR *vp) +{ + size_t name_len; + VALUE_PAIR *n; + + if (!vp->flags.unknown_attr) { + name_len = 0; + } else { + name_len = FR_VP_NAME_PAD; + } + + if ((n = malloc(sizeof(*n) + name_len)) == NULL) { + librad_log("out of memory"); + return NULL; + } + memcpy(n, vp, sizeof(*n) + name_len); + n->next = NULL; + return n; +} + + /* * Copy just a certain type of pairs. */ @@ -303,25 +328,13 @@ VALUE_PAIR *paircopy2(VALUE_PAIR *vp, int attr) last = &first; while (vp) { - size_t name_len; - if (attr >= 0 && vp->attribute != attr) { vp = vp->next; continue; } - if (!vp->flags.unknown_attr) { - name_len = 0; - } else { - name_len = FR_VP_NAME_PAD; - } - - if ((n = malloc(sizeof(*n) + name_len)) == NULL) { - librad_log("out of memory"); - return first; - } - memcpy(n, vp, sizeof(*n) + name_len); - n->next = NULL; + n = paircopyvp(vp); + if (!n) return first; *last = n; last = &n->next; vp = vp->next; -- 2.1.4