On Monday 14 August 2006 21:27, Alex French wrote:
> Boian,
>
> Thanks, if you have a patch that actually implements the hash for the
> operator etc, that would be great (in fact, why not just submit it as a
> feature). If it's just to change the operator hardcoded in rlm_perl.c,
> that's fine, I have that recompiled and installed at the moment,

Yep, i have the patch that implements the operator with hash ref. 
Test it and if you like it i will submit it in CVS HEAD.

For example to change Operator for Framed-MTU 

$hash{'Framed-MTU'} = "100";
$hash{'Operator'} = "==";
$RAD_REPLY{'Framed-MTU'} = \%hash;


-- 
Best Regards,
Boian Jordanov
SNE
Orbitel - Next Generation Telecom
tel. +359 2 4004 723
tel. +359 2 4004 002
Index: rlm_perl.c
===================================================================
RCS file: /source/radiusd/src/modules/rlm_perl/rlm_perl.c,v
retrieving revision 1.13.4.7
diff -u -r1.13.4.7 rlm_perl.c
--- rlm_perl.c	27 Apr 2006 17:35:44 -0000	1.13.4.7
+++ rlm_perl.c	15 Aug 2006 12:22:32 -0000
@@ -920,22 +920,49 @@
   */
 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;
 
        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);
+		       sv = hv_fetch(hv,key,key_len,FALSE);
+		       
+		       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,"Invalid Operator for attribute %s", key);
+			       operator = T_OP_EQ;
+		       }
+		       ret = pairadd_sv(vp,key, *sv, operator);
+	       } 
+	       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;
@@ -1051,6 +1078,7 @@
 
 
 	if ((get_hv_content(rad_reply_hv, &vp)) > 0 ) {
+		//pairfree(&request->reply->vps);
 		pairmove(&request->reply->vps, &vp);
 		pairfree(&vp);
 	}
- 
List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html

Reply via email to