From e2ec9990030d410c721a1f0e1b44905deeb1c116 Mon Sep 17 00:00:00 2001 From: bjordanov Date: Wed, 30 Aug 2006 11:00:05 +0000 Subject: [PATCH] New Future: Modify the operator for VP For example to change Operator for Framed-MTU use code like that. $hash{'Framed-MTU'} = "100"; $hash{'Operator'} = "=="; $RAD_REPLY{'Framed-MTU'} = \%hash; --- src/modules/rlm_perl/rlm_perl.c | 51 +++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/src/modules/rlm_perl/rlm_perl.c b/src/modules/rlm_perl/rlm_perl.c index 3542b48..ad89aff 100644 --- a/src/modules/rlm_perl/rlm_perl.c +++ b/src/modules/rlm_perl/rlm_perl.c @@ -907,28 +907,65 @@ static int pairadd_sv(VALUE_PAIR **vp, char *key, SV *sv, int operator) { */ static int get_hv_content(HV *my_hv, VALUE_PAIR **vp) { - SV *res_sv, **av_sv; + SV *res_sv, **av_sv, **operator_sv, **sv; + HV *hv; AV *av; - char *key; + char *key,*tmp,*ptr; + char buf[MAX_STRING_LEN]; I32 key_len, len, i, j; int ret=0; + LRAD_TOKEN token, operator = T_EOL; - *vp = NULL; for (i = hv_iterinit(my_hv); i > 0; i--) { - res_sv = hv_iternextsv(my_hv,&key,&key_len); - if (SvROK(res_sv) && (SvTYPE(SvRV(res_sv)) == SVt_PVAV)) { + + res_sv = hv_iternextsv(my_hv,&key,&key_len); + + if (SvROK(res_sv) && (SvTYPE(SvRV(res_sv)) == SVt_PVHV)) { + hv = (HV*)SvRV(res_sv); + if (hv_exists(hv,key,key_len)) { + sv = hv_fetch(hv,key,key_len,FALSE); + /* + * Check if there is hash Key Operator and if not + * use T_OP_EQ as default + */ + if (hv_exists(hv,"Operator",strlen("Operator"))) { + operator_sv = hv_fetch(hv,"Operator", strlen("Operator"), FALSE); + + if (SvOK(*operator_sv)) + ptr = SvPV_nolen(*operator_sv); + + operator = gettoken(&ptr, buf, sizeof(buf)); + /* + * Check Operator + * + */ + if (operator <= T_EOL ) { + radlog(L_ERR,"rlm_perl: Invalid Operator for attribute %s", key); + operator = T_OP_EQ; + } + } else { + radlog(L_ERR,"rlm_perl: Operator key doesn't exist. Setting Operator to = for key %s", key); + operator = T_OP_EQ; + } + ret = pairadd_sv(vp,key, *sv, operator) + ret; + } else { + radlog(L_ERR,"rlm_perl: Wrong or missing key in hash ref for %s, Skipping", key ); + } + } + else if (SvROK(res_sv) && (SvTYPE(SvRV(res_sv)) == SVt_PVAV)) { av = (AV*)SvRV(res_sv); len = av_len(av); for (j = 0; j <= len; j++) { av_sv = av_fetch(av, j, 0); ret = pairadd_sv(vp, key, *av_sv, T_OP_ADD) + ret; } - } else ret = pairadd_sv(vp, key, res_sv, T_OP_EQ) + ret; + } else { + ret = pairadd_sv(vp, key, res_sv, T_OP_EQ) + ret; + } } return ret; } - /* * Call the function_name inside the module * Store all vps in hashes %RAD_CHECK %RAD_REPLY %RAD_REQUEST -- 2.1.4