Enable building #WITHOUT_PROXY
[freeradius.git] / src / modules / rlm_perl / rlm_perl.c
index 174e74d..8acb1f0 100644 (file)
@@ -66,8 +66,10 @@ typedef struct perl_inst {
        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;
@@ -104,10 +106,12 @@ static const CONF_PARSER module_config[] = {
          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
@@ -271,8 +275,6 @@ static PerlInterpreter *rlm_perl_clone(PerlInterpreter *perl, pthread_key_t *key
 
        pthread_setspecific(*key, interp);
 
-       fprintf(stderr, "GOT CLONE %d %p\n", pthread_self(), interp);
-
        return interp;
 }
 #endif
@@ -404,14 +406,19 @@ static int perl_instantiate(CONF_SECTION *conf, void **instance)
        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
         */
@@ -449,6 +456,7 @@ static int perl_instantiate(CONF_SECTION *conf, void **instance)
                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 !");
@@ -495,15 +503,19 @@ static int perl_instantiate(CONF_SECTION *conf, void **instance)
        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)
@@ -530,7 +542,7 @@ static void perl_store_vps(VALUE_PAIR *vp, HV *rad_hv)
        AV              *av;
        char            namebuf[256], *name;
        char            buffer[1024];
-       int             attr, len;
+       int             attr, vendor, len;
 
        hv_undef(rad_hv);
        nvp = paircopy(vp);
@@ -538,7 +550,8 @@ static void perl_store_vps(VALUE_PAIR *vp, HV *rad_hv)
        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();
@@ -566,9 +579,9 @@ static void perl_store_vps(VALUE_PAIR *vp, HV *rad_hv)
                }
 
                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;
        }
 }
@@ -645,8 +658,10 @@ static int rlmperl_call(void *instance, REQUEST *request, char *function_name)
        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;
@@ -678,15 +693,17 @@ static int rlmperl_call(void *instance, REQUEST *request, char *function_name)
        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 {
@@ -698,6 +715,7 @@ static int rlmperl_call(void *instance, REQUEST *request, char *function_name)
        } else {
                hv_undef(rad_request_proxy_reply_hv);
        }
+#endif
 
        PUSHMARK(SP);
        /*
@@ -741,12 +759,12 @@ static int rlmperl_call(void *instance, REQUEST *request, char *function_name)
                 *      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 ) {
@@ -761,6 +779,7 @@ static int rlmperl_call(void *instance, REQUEST *request, char *function_name)
                vp = NULL;
        }
 
+#ifdef WITH_PROXY
        if (request->proxy &&
            (get_hv_content(rad_request_proxy_hv, &vp) > 0)) {
                pairfree(&request->proxy->vps);
@@ -774,6 +793,7 @@ static int rlmperl_call(void *instance, REQUEST *request, char *function_name)
                request->proxy_reply->vps = vp;
                vp = NULL;
        }
+#endif
 
        }
        return exitstatus;
@@ -815,7 +835,7 @@ static int perl_accounting(void *instance, REQUEST *request)
        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");
@@ -859,6 +879,8 @@ static int perl_checksimul(void *instance, REQUEST *request)
        return rlmperl_call(instance, request,
                        ((PERL_INST *)instance)->func_checksimul);
 }
+
+#ifdef WITH_PROXY
 /*
  *     Pre-Proxy request
  */
@@ -875,6 +897,8 @@ static int perl_post_proxy(void *instance, REQUEST *request)
        return rlmperl_call(instance, request,
                        ((PERL_INST *)instance)->func_post_proxy);
 }
+#endif
+
 /*
  *     Pre-Auth request
  */
@@ -970,6 +994,7 @@ static int perl_detach(void *instance)
        perl_free(inst->perl);
 #endif
 
+        PERL_SYS_TERM();
        free(inst);
        return exitstatus;
 }
@@ -1000,8 +1025,12 @@ module_t rlm_perl = {
                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,