Include session-state in rlm_perl
[freeradius.git] / src / modules / rlm_perl / rlm_perl.c
index d2b4e5b..2f9eb23 100644 (file)
@@ -116,8 +116,7 @@ static const CONF_PARSER module_config[] = {
        { "func_start_accounting", FR_CONF_OFFSET(PW_TYPE_STRING, rlm_perl_t, func_start_accounting), NULL },
 
        { "func_stop_accounting", FR_CONF_OFFSET(PW_TYPE_STRING, rlm_perl_t, func_stop_accounting), NULL },
-
-       { NULL, -1, 0, NULL, NULL }             /* end the list */
+       CONF_PARSER_TERMINATOR
 };
 
 /*
@@ -617,7 +616,7 @@ static void perl_store_vps(UNUSED TALLOC_CTX *ctx, REQUEST *request, VALUE_PAIR
        vp_cursor_t cursor;
 
        RINDENT();
-       pairsort(vps, attrtagcmp);
+       fr_pair_list_sort(vps, fr_pair_cmp_by_da_tag);
        for (vp = fr_cursor_init(&cursor, vps);
             vp;
             vp = fr_cursor_next(&cursor)) {
@@ -698,7 +697,7 @@ static int pairadd_sv(TALLOC_CTX *ctx, REQUEST *request, VALUE_PAIR **vps, char
        if (SvOK(sv)) {
                STRLEN len;
                val = SvPV(sv, len);
-               vp = pairmake(ctx, vps, key, NULL, op);
+               vp = fr_pair_make(ctx, vps, key, NULL, op);
                if (!vp) {
                fail:
                        REDEBUG("Failed to create pair %s:%s %s %s", list_name, key,
@@ -708,11 +707,11 @@ static int pairadd_sv(TALLOC_CTX *ctx, REQUEST *request, VALUE_PAIR **vps, char
 
                switch (vp->da->type) {
                case PW_TYPE_STRING:
-                       pairbstrncpy(vp, val, len);
+                       fr_pair_value_bstrncpy(vp, val, len);
                        break;
 
                default:
-                       if (pairparsevalue(vp, val, len) < 0) goto fail;
+                       if (fr_pair_value_from_str(vp, val, len) < 0) goto fail;
                }
 
                RDEBUG("&%s:%s %s $%s{'%s'} -> '%s'", list_name, key, fr_int2str(fr_tokens, op, "<INVALID>"),
@@ -767,6 +766,7 @@ static int do_perl(void *instance, REQUEST *request, char const *function_name)
        HV              *rad_check_hv;
        HV              *rad_config_hv;
        HV              *rad_request_hv;
+       HV              *rad_state_hv;
 #ifdef WITH_PROXY
        HV              *rad_request_proxy_hv;
        HV              *rad_request_proxy_reply_hv;
@@ -804,11 +804,13 @@ static int do_perl(void *instance, REQUEST *request, char const *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);
+               rad_state_hv = get_hv("RAD_STATE", 1);
 
                perl_store_vps(request->packet, request, &request->packet->vps, rad_request_hv, "RAD_REQUEST", "request");
                perl_store_vps(request->reply, request, &request->reply->vps, rad_reply_hv, "RAD_REPLY", "reply");
                perl_store_vps(request, request, &request->config, rad_check_hv, "RAD_CHECK", "control");
                perl_store_vps(request, request, &request->config, rad_config_hv, "RAD_CONFIG", "control");
+               perl_store_vps(request, request, &request->state, rad_state_hv, "RAD_STATE", "session-state");
 
 #ifdef WITH_PROXY
                rad_request_proxy_hv = get_hv("RAD_REQUEST_PROXY",1);
@@ -862,36 +864,42 @@ static int do_perl(void *instance, REQUEST *request, char const *function_name)
 
                vp = NULL;
                if ((get_hv_content(request->packet, request, rad_request_hv, &vp, "RAD_REQUEST", "request")) == 0) {
-                       pairfree(&request->packet->vps);
+                       fr_pair_list_free(&request->packet->vps);
                        request->packet->vps = vp;
                        vp = NULL;
 
                        /*
                         *      Update cached copies
                         */
-                       request->username = pairfind(request->packet->vps, PW_USER_NAME, 0, TAG_ANY);
-                       request->password = pairfind(request->packet->vps, PW_USER_PASSWORD, 0, TAG_ANY);
+                       request->username = fr_pair_find_by_num(request->packet->vps, PW_USER_NAME, 0, TAG_ANY);
+                       request->password = fr_pair_find_by_num(request->packet->vps, PW_USER_PASSWORD, 0, TAG_ANY);
                        if (!request->password)
-                               request->password = pairfind(request->packet->vps, PW_CHAP_PASSWORD, 0, TAG_ANY);
+                               request->password = fr_pair_find_by_num(request->packet->vps, PW_CHAP_PASSWORD, 0, TAG_ANY);
                }
 
                if ((get_hv_content(request->reply, request, rad_reply_hv, &vp, "RAD_REPLY", "reply")) == 0) {
-                       pairfree(&request->reply->vps);
+                       fr_pair_list_free(&request->reply->vps);
                        request->reply->vps = vp;
                        vp = NULL;
                }
 
                if ((get_hv_content(request, request, rad_check_hv, &vp, "RAD_CHECK", "control")) == 0) {
-                       pairfree(&request->config);
+                       fr_pair_list_free(&request->config);
                        request->config = vp;
                        vp = NULL;
                }
 
+               if ((get_hv_content(request, request, rad_state_hv, &vp, "RAD_STATE", "session-state")) == 0) {
+                       fr_pair_list_free(&request->state);
+                       request->state = vp;
+                       vp = NULL;
+               }
+
 #ifdef WITH_PROXY
                if (request->proxy &&
                    (get_hv_content(request->proxy, request, rad_request_proxy_hv, &vp,
                                    "RAD_REQUEST_PROXY", "proxy-request") == 0)) {
-                       pairfree(&request->proxy->vps);
+                       fr_pair_list_free(&request->proxy->vps);
                        request->proxy->vps = vp;
                        vp = NULL;
                }
@@ -899,7 +907,7 @@ static int do_perl(void *instance, REQUEST *request, char const *function_name)
                if (request->proxy_reply &&
                    (get_hv_content(request->proxy_reply, request, rad_request_proxy_reply_hv, &vp,
                                    "RAD_REQUEST_PROXY_REPLY", "proxy-reply") == 0)) {
-                       pairfree(&request->proxy_reply->vps);
+                       fr_pair_list_free(&request->proxy_reply->vps);
                        request->proxy_reply->vps = vp;
                        vp = NULL;
                }
@@ -941,7 +949,7 @@ static rlm_rcode_t CC_HINT(nonnull) mod_accounting(void *instance, REQUEST *requ
        VALUE_PAIR      *pair;
        int             acctstatustype=0;
 
-       if ((pair = pairfind(request->packet->vps, PW_ACCT_STATUS_TYPE, 0, TAG_ANY)) != NULL) {
+       if ((pair = fr_pair_find_by_num(request->packet->vps, PW_ACCT_STATUS_TYPE, 0, TAG_ANY)) != NULL) {
                acctstatustype = pair->vp_integer;
        } else {
                RDEBUG("Invalid Accounting Packet");