Skip to content

Commit

Permalink
Merge built in paircmp functions back into the server library
Browse files Browse the repository at this point in the history
  • Loading branch information
arr2036 committed May 16, 2018
1 parent af7eaa3 commit dc54c45
Show file tree
Hide file tree
Showing 23 changed files with 593 additions and 532 deletions.
2 changes: 1 addition & 1 deletion src/include/dict.h
Expand Up @@ -66,7 +66,7 @@ typedef struct {

unsigned int virtual : 1; //!< for dynamic expansion

unsigned int compare : 1; //!< has a paircompare registered
unsigned int compare : 1; //!< has a paircmp registered

unsigned int named : 1; //!< compare attributes by name.

Expand Down
39 changes: 23 additions & 16 deletions src/include/radiusd.h
Expand Up @@ -315,7 +315,7 @@ struct rad_request {
#define DEAD_TIME 120
#define EXEC_TIMEOUT 10

/* for paircompare_register */
/* for paircmp_register */
typedef int (*RAD_COMPARE_FUNC)(void *instance, REQUEST *,VALUE_PAIR *, VALUE_PAIR *, VALUE_PAIR *, VALUE_PAIR **);

typedef enum request_fail {
Expand Down Expand Up @@ -477,22 +477,29 @@ int trigger_exec(REQUEST *request, CONF_SECTION const *cs, char const *name, boo
void trigger_exec_free(void);
VALUE_PAIR *trigger_args_afrom_server(TALLOC_CTX *ctx, char const *server, uint16_t port);

/* valuepair.c */
int paircompare_register_byname(char const *name, fr_dict_attr_t const *from,
bool first_only, RAD_COMPARE_FUNC func, void *instance);
int paircompare_register(fr_dict_attr_t const *attribute, fr_dict_attr_t const *from,
bool first_only, RAD_COMPARE_FUNC func, void *instance);
void paircompare_unregister(fr_dict_attr_t const *attr, RAD_COMPARE_FUNC func);
void paircompare_unregister_instance(void *instance);
int paircompare(REQUEST *request, VALUE_PAIR *req_list,
VALUE_PAIR *check, VALUE_PAIR **rep_list);
vp_tmpl_t *xlat_to_tmpl_attr(TALLOC_CTX *ctx, xlat_exp_t *xlat);
xlat_exp_t *xlat_from_tmpl_attr(TALLOC_CTX *ctx, vp_tmpl_t *vpt);
int radius_compare_vps(REQUEST *request, VALUE_PAIR *check, VALUE_PAIR *vp);
int radius_callback_compare(REQUEST *request, VALUE_PAIR *req,
VALUE_PAIR *check, VALUE_PAIR *check_pairs,
VALUE_PAIR **reply_pairs);
int radius_find_compare(fr_dict_attr_t const *attribute);
xlat_exp_t *xlat_from_tmpl_attr(TALLOC_CTX *ctx, vp_tmpl_t *vpt);

/* paircmp.c */
int paircmp_pairs(REQUEST *request, VALUE_PAIR *check, VALUE_PAIR *vp);

int paircmp(REQUEST *request, VALUE_PAIR *req_list, VALUE_PAIR *check, VALUE_PAIR **rep_list);

int paircmp_find(fr_dict_attr_t const *da);

int paircmp_register_by_name(char const *name, fr_dict_attr_t const *from,
bool first_only, RAD_COMPARE_FUNC func, void *instance);

int paircmp_register(fr_dict_attr_t const *attribute, fr_dict_attr_t const *from,
bool first_only, RAD_COMPARE_FUNC func, void *instance);

void paircmp_unregister(fr_dict_attr_t const *attr, RAD_COMPARE_FUNC func);

void paircmp_unregister_instance(void *instance);

int paircmp_init(char const *dict_dir);

void paircmp_free(void);

/*
* Less code == fewer bugs
Expand Down
10 changes: 5 additions & 5 deletions src/main/cond_eval.c
Expand Up @@ -294,7 +294,7 @@ static int cond_cmp_values(REQUEST *request, fr_cond_t const *c, fr_value_box_t

fr_value_box_copy(vp, &vp->data, rhs);

rcode = paircompare(request, request->packet->vps, vp, NULL);
rcode = paircmp(request, request->packet->vps, vp, NULL);
rcode = (rcode == 0) ? 1 : 0;
talloc_free(vp);
goto finish;
Expand Down Expand Up @@ -435,7 +435,7 @@ do {\
if (c->pass2_fixup == PASS2_PAIRCOMPARE) {
rad_assert(!c->cast);
rad_assert(map->lhs->type == TMPL_TYPE_ATTR);
rad_assert((map->rhs->type != TMPL_TYPE_ATTR) || !radius_find_compare(map->rhs->tmpl_da)); /* expensive assert */
rad_assert((map->rhs->type != TMPL_TYPE_ATTR) || !paircmp_find(map->rhs->tmpl_da)); /* expensive assert */

cast = map->lhs->tmpl_da;

Expand Down Expand Up @@ -609,12 +609,12 @@ int cond_eval_map(REQUEST *request, UNUSED int modreturn, UNUSED int depth, fr_c
VALUE_PAIR *vp;
fr_cursor_t cursor;
/*
* Legacy paircompare call, skip processing the magic attribute
* Legacy paircmp call, skip processing the magic attribute
* if it's the LHS and cast RHS to the same type.
*/
if ((c->pass2_fixup == PASS2_PAIRCOMPARE) && (map->op != T_OP_REG_EQ)) {
#ifndef NDEBUG
rad_assert(radius_find_compare(map->lhs->tmpl_da)); /* expensive assert */
rad_assert(paircmp_find(map->lhs->tmpl_da)); /* expensive assert */
#endif
rcode = cond_normalise_and_cmp(request, c, NULL);
break;
Expand Down Expand Up @@ -925,7 +925,7 @@ void radius_pairmove(REQUEST *request, VALUE_PAIR **to, VALUE_PAIR *from, bool d
* If equal, delete the one in
* the "to" list.
*/
rcode = radius_compare_vps(NULL, from_list[i],
rcode = paircmp_pairs(NULL, from_list[i],
to_list[j]);
/*
* We may want to do more
Expand Down
14 changes: 7 additions & 7 deletions src/main/log.c
Expand Up @@ -474,13 +474,13 @@ void vlog_request(fr_log_type_t type, fr_log_lvl_t lvl, REQUEST *request, char c
*/
void vlog_module_failure_msg(REQUEST *request, char const *msg, va_list ap)
{
char *p;
VALUE_PAIR *vp;
va_list aq;
char *p;
VALUE_PAIR *vp;
va_list aq;

if (!msg || !request || !request->packet) {
return;
}
if (!msg || !request || !request->packet) return;

rad_assert(attr_module_failure_message);

/*
* If we don't copy the original ap we get a segfault from vasprintf. This is apparently
Expand All @@ -492,7 +492,7 @@ void vlog_module_failure_msg(REQUEST *request, char const *msg, va_list ap)
* running unit tests which generate errors under CI.
*/
va_copy(aq, ap);
p = talloc_vasprintf(request, msg, aq);
p = fr_vasprintf(request, msg, aq);
va_end(aq);

MEM(pair_add_request(&vp, attr_module_failure_message) >= 0);
Expand Down
4 changes: 2 additions & 2 deletions src/main/map.c
Expand Up @@ -2533,7 +2533,7 @@ int map_to_request(REQUEST *request, vp_map_t const *map, radius_map_getvalue_t
vp;
vp = fr_pair_cursor_next(&src_list)) {
head->op = T_OP_CMP_EQ;
rcode = radius_compare_vps(request, vp, dst);
rcode = paircmp_pairs(request, vp, dst);
if (rcode == 0) {
dst = fr_pair_cursor_remove(&dst_list);
fr_pair_list_free(&dst);
Expand All @@ -2556,7 +2556,7 @@ int map_to_request(REQUEST *request, vp_map_t const *map, radius_map_getvalue_t
vp;
vp = fr_pair_cursor_next(&src_list)) {
head->op = T_OP_CMP_EQ;
rcode = radius_compare_vps(request, vp, dst);
rcode = paircmp_pairs(request, vp, dst);
if (rcode == 0) {
dst = fr_pair_cursor_remove(&dst_list);
fr_pair_list_free(&dst);
Expand Down
6 changes: 3 additions & 3 deletions src/main/module.c
Expand Up @@ -733,7 +733,7 @@ int modules_instantiate(CONF_SECTION *root)
return 0;
}

/** Free module's instance data, and any xlats or paircompares
/** Free module's instance data, and any xlats or paircmps
*
* @param[in] mi to free.
* @return 0
Expand All @@ -755,9 +755,9 @@ static int _module_instance_free(module_instance_t *mi)
if (mi->dl_inst && mi->dl_inst->data) {
xlat_unregister(mi->name);
/*
* Remove any registered paircompares.
* Remove any registered paircmps.
*/
paircompare_unregister_instance(mi->dl_inst->data);
paircmp_unregister_instance(mi->dl_inst->data);
xlat_unregister_module(mi->dl_inst->data);
}

Expand Down

0 comments on commit dc54c45

Please sign in to comment.