From: Alan T. DeKok Date: Mon, 11 Jan 2021 13:57:23 +0000 (-0500) Subject: define and use paircmp_virtual() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0404f1cb2c941c8920e867567f210399e2c2b149;p=thirdparty%2Ffreeradius-server.git define and use paircmp_virtual() which only takes one VP, and only does comparisons to virtual attributes. This is the first step in getting rid of the old paircmp() API --- diff --git a/src/lib/server/cond_eval.c b/src/lib/server/cond_eval.c index 8b95d0b0899..7a28e903dfd 100644 --- a/src/lib/server/cond_eval.c +++ b/src/lib/server/cond_eval.c @@ -331,7 +331,12 @@ static int cond_cmp_values(request_t *request, fr_cond_t const *c, fr_value_box_ fr_value_box_copy(vp, &vp->data, rhs); fr_pair_list_single_value(vps,*vp); - rcode = paircmp(request, &request->request_pairs, &vps); + + /* + * Do JUST the virtual attribute comparison. + * Skip all of the rest of the complexity of paircmp(). + */ + rcode = paircmp_virtual(request, &request->request_pairs, vp, &vps); rcode = (rcode == 0) ? 1 : 0; talloc_free(vp); goto finish; @@ -393,8 +398,7 @@ done: return p - out; } -//#undef WITH_REALIZE_TMPL -#define WITH_REALIZE_TMPL +#undef WITH_REALIZE_TMPL #ifdef WITH_REALIZE_TMPL /** Turn a raw #tmpl_t into #fr_value_data_t, mostly. diff --git a/src/lib/server/paircmp.c b/src/lib/server/paircmp.c index 2e9036842bd..667e57987ef 100644 --- a/src/lib/server/paircmp.c +++ b/src/lib/server/paircmp.c @@ -538,6 +538,40 @@ static int paircmp_func(request_t *request, return paircmp_pairs(request, check_item, request_item); } + +/** Compare check_item and request + * + * Unlike paircmp_pairs() this function will call any attribute-specific + * comparison functions registered. vp to be matched is request_item or + * found in check_list or looked up from external sources depending on the + * comparison function called. + * + * @param[in] request Current request. + * @param[in] request_list list pairs. + * @param[in] check_item item to compare. + * @param[in] check_list list. + * @return + * - 0 if check_item matches + * - -1 if check_item is smaller + * - 1 if check_item is larger + */ +int paircmp_virtual(request_t *request, + fr_pair_list_t *request_list, + fr_pair_t *check_item, + fr_pair_list_t *check_list) +{ + paircmp_t *c; + + for (c = cmp; c; c = c->next) { + if (c->da == check_item->da) { + return (c->compare)(c->instance, request, request_list, check_item, check_list); + } + } + + return -1; +} + + /** Compare two pair lists except for the password information. * * For every element in "check_list" at least one matching copy must be present diff --git a/src/lib/server/paircmp.h b/src/lib/server/paircmp.h index 937c42fd67e..277e041f761 100644 --- a/src/lib/server/paircmp.h +++ b/src/lib/server/paircmp.h @@ -41,6 +41,11 @@ int paircmp_pairs(request_t *request, fr_pair_t *check, fr_pair_t *vp); int paircmp(request_t *request, fr_pair_list_t *request_list, fr_pair_list_t *check_list); +int paircmp_virtual(request_t *request, + fr_pair_list_t *request_list, + fr_pair_t *check_item, + fr_pair_list_t *check_list); + int paircmp_find(fr_dict_attr_t const *da); int paircmp_register_by_name(char const *name, fr_dict_attr_t const *from,