char *func_checksimul;
char *func_detach;
char *func_xlat;
+#ifdef WITH_PROXY
char *func_pre_proxy;
char *func_post_proxy;
+#endif
char *func_post_auth;
#ifdef WITH_COA
char *func_recv_coa;
offsetof(PERL_INST,func_detach), NULL, "detach"},
{ "func_xlat", PW_TYPE_STRING_PTR,
offsetof(PERL_INST,func_xlat), NULL, "xlat"},
+#ifdef WITH_PROXY
{ "func_pre_proxy", PW_TYPE_STRING_PTR,
offsetof(PERL_INST,func_pre_proxy), NULL, "pre_proxy"},
{ "func_post_proxy", PW_TYPE_STRING_PTR,
offsetof(PERL_INST,func_post_proxy), NULL, "post_proxy"},
+#endif
{ "func_post_auth", PW_TYPE_STRING_PTR,
offsetof(PERL_INST,func_post_auth), NULL, "post_auth"},
#ifdef WITH_COA
pthread_setspecific(*key, interp);
- fprintf(stderr, "GOT CLONE %d %p\n", pthread_self(), interp);
-
return interp;
}
#endif
HV *rad_check_hv;
HV *rad_config_hv;
HV *rad_request_hv;
+#ifdef WITH_PROXY
HV *rad_request_proxy_hv;
HV *rad_request_proxy_reply_hv;
+#endif
AV *end_AV;
- char *embed[4];
+ char **embed;
+ char **envp = NULL;
const char *xlat_name;
int exitstatus = 0, argc=0;
+ embed = rad_malloc(4*(sizeof(char *)));
+ memset(embed, 0, sizeof(4*(sizeof(char *))));
/*
* Set up a storage area for instance data
*/
argc = 3;
}
+ PERL_SYS_INIT3(&argc, &embed, &envp);
#ifdef USE_ITHREADS
if ((inst->perl = perl_alloc()) == NULL) {
radlog(L_DBG, "rlm_perl: No memory for allocating new perl !");
rad_check_hv = newHV();
rad_config_hv = newHV();
rad_request_hv = newHV();
+#ifdef WITH_PROXY
rad_request_proxy_hv = newHV();
rad_request_proxy_reply_hv = newHV();
+#endif
rad_reply_hv = get_hv("RAD_REPLY",1);
rad_check_hv = get_hv("RAD_CHECK",1);
rad_config_hv = get_hv("RAD_CONFIG",1);
rad_request_hv = get_hv("RAD_REQUEST",1);
+#ifdef WITH_PROXY
rad_request_proxy_hv = get_hv("RAD_REQUEST_PROXY",1);
rad_request_proxy_reply_hv = get_hv("RAD_REQUEST_PROXY_REPLY",1);
+#endif
xlat_name = cf_section_name2(conf);
if (xlat_name == NULL)
AV *av;
char namebuf[256], *name;
char buffer[1024];
- int attr, len;
+ int attr, vendor, len;
hv_undef(rad_hv);
nvp = paircopy(vp);
while (nvp != NULL) {
name = nvp->name;
attr = nvp->attribute;
- vpa = paircopy2(nvp,attr);
+ vendor = nvp->vendor;
+ vpa = paircopy2(nvp, attr, vendor);
if (vpa->next) {
av = newAV();
}
pairfree(&vpa);
- vpa = nvp; while ((vpa != NULL) && (vpa->attribute == attr))
+ vpa = nvp; while ((vpa != NULL) && (vpa->attribute == attr) && (vpa->vendor == vendor))
vpa = vpa->next;
- pairdelete(&nvp, attr);
+ pairdelete(&nvp, attr, vendor);
nvp = vpa;
}
}
HV *rad_check_hv;
HV *rad_config_hv;
HV *rad_request_hv;
+#ifdef WITH_PROXY
HV *rad_request_proxy_hv;
HV *rad_request_proxy_reply_hv;
+#endif
#ifdef USE_ITHREADS
PerlInterpreter *interp;
rad_check_hv = get_hv("RAD_CHECK",1);
rad_config_hv = get_hv("RAD_CONFIG",1);
rad_request_hv = get_hv("RAD_REQUEST",1);
+#ifdef WITH_PROXY
rad_request_proxy_hv = get_hv("RAD_REQUEST_PROXY",1);
rad_request_proxy_reply_hv = get_hv("RAD_REQUEST_PROXY_REPLY",1);
-
+#endif
perl_store_vps(request->reply->vps, rad_reply_hv);
perl_store_vps(request->config_items, rad_check_hv);
perl_store_vps(request->packet->vps, rad_request_hv);
perl_store_vps(request->config_items, rad_config_hv);
+#ifdef WITH_PROXY
if (request->proxy != NULL) {
perl_store_vps(request->proxy->vps, rad_request_proxy_hv);
} else {
} else {
hv_undef(rad_request_proxy_reply_hv);
}
+#endif
PUSHMARK(SP);
/*
* Update cached copies
*/
request->username = pairfind(request->packet->vps,
- PW_USER_NAME);
+ PW_USER_NAME, 0);
request->password = pairfind(request->packet->vps,
- PW_USER_PASSWORD);
+ PW_USER_PASSWORD, 0);
if (!request->password)
request->password = pairfind(request->packet->vps,
- PW_CHAP_PASSWORD);
+ PW_CHAP_PASSWORD, 0);
}
if ((get_hv_content(rad_reply_hv, &vp)) > 0 ) {
vp = NULL;
}
+#ifdef WITH_PROXY
if (request->proxy &&
(get_hv_content(rad_request_proxy_hv, &vp) > 0)) {
pairfree(&request->proxy->vps);
request->proxy_reply->vps = vp;
vp = NULL;
}
+#endif
}
return exitstatus;
VALUE_PAIR *pair;
int acctstatustype=0;
- if ((pair = pairfind(request->packet->vps, PW_ACCT_STATUS_TYPE)) != NULL) {
+ if ((pair = pairfind(request->packet->vps, PW_ACCT_STATUS_TYPE, 0)) != NULL) {
acctstatustype = pair->vp_integer;
} else {
radlog(L_ERR, "Invalid Accounting Packet");
return rlmperl_call(instance, request,
((PERL_INST *)instance)->func_checksimul);
}
+
+#ifdef WITH_PROXY
/*
* Pre-Proxy request
*/
return rlmperl_call(instance, request,
((PERL_INST *)instance)->func_post_proxy);
}
+#endif
+
/*
* Pre-Auth request
*/
perl_free(inst->perl);
#endif
+ PERL_SYS_TERM();
free(inst);
return exitstatus;
}
perl_preacct, /* preacct */
perl_accounting, /* accounting */
perl_checksimul, /* check simul */
+#ifdef WITH_PROXY
perl_pre_proxy, /* pre-proxy */
perl_post_proxy, /* post-proxy */
+#else
+ NULL, NULL,
+#endif
perl_post_auth /* post-auth */
#ifdef WITH_COA
, perl_recv_coa,