]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
make "call" run its children again
authorAlan T. DeKok <aland@freeradius.org>
Fri, 3 Dec 2021 15:33:23 +0000 (10:33 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 3 Dec 2021 15:33:51 +0000 (10:33 -0500)
src/lib/unlang/call.c

index 57c03113206ef2be467bcd122ef32ef30668e61a..4841d0e1ba20b73465b754283a652fe0ff7b3e25 100644 (file)
@@ -30,8 +30,8 @@ RCSID("$Id$")
 #include "call_priv.h"
 #include "module_priv.h"
 
-static unlang_action_t unlang_call_resume(UNUSED rlm_rcode_t *p_result, request_t *request,
-                                         unlang_stack_frame_t *frame)
+static unlang_action_t unlang_call_finalize(UNUSED rlm_rcode_t *p_result, request_t *request,
+                                           unlang_stack_frame_t *frame)
 {
        unlang_group_t                  *g = unlang_generic_to_group(frame->instruction);
        unlang_call_t                   *gext = unlang_group_to_call(g);
@@ -49,6 +49,28 @@ static unlang_action_t unlang_call_resume(UNUSED rlm_rcode_t *p_result, request_
        return UNLANG_ACTION_CALCULATE_RESULT;
 }
 
+static unlang_action_t unlang_call_children(UNUSED rlm_rcode_t *p_result, request_t *request,
+                                           unlang_stack_frame_t *frame)
+{
+       unlang_group_t                  *g = unlang_generic_to_group(frame->instruction);
+
+       fr_assert(g->children);
+
+       /*
+        *      Push the contents of the call { } section onto the stack.
+        *      This gets executed after the server returns.
+        */
+       if (unlang_interpret_push(request, g->children, frame->result,
+                                 UNLANG_NEXT_SIBLING, UNLANG_SUB_FRAME) < 0) {
+               *p_result = RLM_MODULE_FAIL;
+               return UNLANG_ACTION_STOP_PROCESSING;
+       }
+
+       frame_repeat(frame, unlang_call_finalize);
+       return UNLANG_ACTION_PUSHED_CHILD;
+}
+
+
 static unlang_action_t unlang_call_frame_init(rlm_rcode_t *p_result, request_t *request,
                                              unlang_stack_frame_t *frame)
 {
@@ -116,7 +138,11 @@ static unlang_action_t unlang_call_frame_init(rlm_rcode_t *p_result, request_t *
         *      DIE DIE DIE DIE DIE DIE DIE DIE DIE
         *      DIE DIE DIE DIE DIE DIE DIE DIE DIE.
         */
-       frame_repeat(frame, unlang_call_resume);
+       if (!g->children) {
+               frame_repeat(frame, unlang_call_finalize);
+       } else {
+               frame_repeat(frame, unlang_call_children);
+       }
 
        if (virtual_server_push(request, gext->server_cs, UNLANG_SUB_FRAME) < 0) goto error;