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