#include <ctype.h>
-typedef int (*fr_paircmp_func_t)(request_t *, fr_pair_t const *);
-
typedef struct paircmp_s paircmp_t;
struct paircmp_s {
fr_dict_attr_t const *da;
- fr_paircmp_func_t compare;
paircmp_t *next;
};
*/
for (c = cmp; c; c = c->next) {
if (c->da == check_item->da) {
- return (c->compare)(request, check_item);
+ return generic_cmp(request, check_item);
}
}
vp->op = op;
fr_value_box_copy(vp, &vp->data, value);
- rcode = (c->compare)(request, vp);
+ rcode = generic_cmp(request, vp);
talloc_free(vp);
return rcode;
}
/** Unregister comparison function for an attribute
*
* @param[in] da dict reference to unregister for.
- * @param[in] func comparison function to remove.
*/
-static void paircmp_unregister(fr_dict_attr_t const *da, fr_paircmp_func_t func)
+static void paircmp_unregister(fr_dict_attr_t const *da)
{
paircmp_t *c, *last;
last = NULL;
for (c = cmp; c; c = c->next) {
- if ((c->da == da) && (c->compare == func)) break;
+ if (c->da == da) break;
last = c;
}
talloc_free(c);
}
-/** Register a function as compare function.
+/** Register a compare da. We always use generic_cmp() for all comparisons.
*
* @param[in] da to register comparison function for.
- * @param[in] func comparison function.
* @return 0
*/
-static int paircmp_register(fr_dict_attr_t const *da, fr_paircmp_func_t func)
+static int paircmp_register(fr_dict_attr_t const *da)
{
paircmp_t *c;
fr_assert(da != NULL);
- paircmp_unregister(da, func);
+ paircmp_unregister(da);
MEM(c = talloc_zero(NULL, paircmp_t));
- c->compare = func;
c->da = da;
c->next = cmp;
cmp = c;
return -1;
}
- paircmp_register(attr_packet_src_ip_address, generic_cmp);
- paircmp_register(attr_packet_dst_ip_address, generic_cmp);
- paircmp_register(attr_packet_src_port, generic_cmp);
- paircmp_register(attr_packet_dst_port, generic_cmp);
- paircmp_register(attr_packet_src_ipv6_address, generic_cmp);
- paircmp_register(attr_packet_dst_ipv6_address, generic_cmp);
+ paircmp_register(attr_packet_src_ip_address);
+ paircmp_register(attr_packet_dst_ip_address);
+ paircmp_register(attr_packet_src_port);
+ paircmp_register(attr_packet_dst_port);
+ paircmp_register(attr_packet_src_ipv6_address);
+ paircmp_register(attr_packet_dst_ipv6_address);
- paircmp_register(attr_request_processing_stage, generic_cmp);
- paircmp_register(attr_virtual_server, generic_cmp);
+ paircmp_register(attr_request_processing_stage);
+ paircmp_register(attr_virtual_server);
return 0;
}
void paircmp_free(void)
{
- paircmp_unregister(attr_packet_src_ip_address, generic_cmp);
- paircmp_unregister(attr_packet_dst_ip_address, generic_cmp);
- paircmp_unregister(attr_packet_src_port, generic_cmp);
- paircmp_unregister(attr_packet_dst_port, generic_cmp);
- paircmp_unregister(attr_packet_src_ipv6_address, generic_cmp);
- paircmp_unregister(attr_packet_dst_ipv6_address, generic_cmp);
-
- paircmp_unregister(attr_request_processing_stage, generic_cmp);
- paircmp_unregister(attr_virtual_server, generic_cmp);
+ paircmp_unregister(attr_packet_src_ip_address);
+ paircmp_unregister(attr_packet_dst_ip_address);
+ paircmp_unregister(attr_packet_src_port);
+ paircmp_unregister(attr_packet_dst_port);
+ paircmp_unregister(attr_packet_src_ipv6_address);
+ paircmp_unregister(attr_packet_dst_ipv6_address);
+
+ paircmp_unregister(attr_request_processing_stage);
+ paircmp_unregister(attr_virtual_server);
fr_dict_autofree(paircmp_dict);
}