]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add API to push bare instructions into a request
authorAlan T. DeKok <aland@freeradius.org>
Mon, 16 Dec 2019 18:28:50 +0000 (13:28 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 16 Dec 2019 18:30:03 +0000 (13:30 -0500)
which is faster than doing lookups in CONF_SECTIONS

src/lib/unlang/interpret.c
src/lib/unlang/interpret.h

index 652d765c2f5502dc59ab6b76bda5d65fb1b7b5f9..a90af3e8b671262c4a668808a7a56d4e53000949 100644 (file)
@@ -762,31 +762,31 @@ rlm_rcode_t unlang_interpret(REQUEST *request)
        return stack->result;
 }
 
+static unlang_group_t empty_group = {
+       .self = {
+               .type = UNLANG_TYPE_GROUP,
+               .debug_name = "empty-group",
+               .actions = {
+                       MOD_ACTION_RETURN,
+                       MOD_ACTION_RETURN,
+                       MOD_ACTION_RETURN,
+                       MOD_ACTION_RETURN,
+                       MOD_ACTION_RETURN,
+                       MOD_ACTION_RETURN,
+                       MOD_ACTION_RETURN,
+                       MOD_ACTION_RETURN,
+                       MOD_ACTION_RETURN
+               },
+       },
+};
+
+
 /** Push a configuration section onto the request stack for later interpretation.
  *
  */
 void unlang_interpret_push_section(REQUEST *request, CONF_SECTION *cs, rlm_rcode_t default_rcode, bool top_frame)
 {
        unlang_t        *instruction = NULL;
-       unlang_stack_t  *stack = request->stack;
-
-       static unlang_group_t empty_group = {
-               .self = {
-                       .type = UNLANG_TYPE_GROUP,
-                       .debug_name = "empty-group",
-                       .actions = {
-                               MOD_ACTION_RETURN,
-                               MOD_ACTION_RETURN,
-                               MOD_ACTION_RETURN,
-                               MOD_ACTION_RETURN,
-                               MOD_ACTION_RETURN,
-                               MOD_ACTION_RETURN,
-                               MOD_ACTION_RETURN,
-                               MOD_ACTION_RETURN,
-                               MOD_ACTION_RETURN
-                       },
-               },
-       };
 
        /*
         *      Interpretable unlang instructions are stored as CONF_DATA
@@ -800,7 +800,22 @@ void unlang_interpret_push_section(REQUEST *request, CONF_SECTION *cs, rlm_rcode
                }
        }
 
-       if (!instruction) instruction = unlang_group_to_generic(&empty_group);
+
+       unlang_interpret_push_instruction(request, instruction, default_rcode, top_frame);
+}
+
+/** Push an instruction onto the request stack for later interpretation.
+ *
+ */
+void unlang_interpret_push_instruction(REQUEST *request, void *instruction, rlm_rcode_t default_rcode, bool top_frame)
+{
+       unlang_stack_t  *stack = request->stack;
+
+       if (!instruction) {
+               instruction = unlang_group_to_generic(&empty_group);
+       } else {
+               (void) talloc_get_type_abort(instruction, unlang_t);
+       }
 
        /*
         *      Push the default action, and the instruction which has
index 83aa28774b4201458e59179e42d3002ff4db7ead..e79e4ab9e89b43d40a2a14bb033993fadb154ec9 100644 (file)
@@ -92,6 +92,9 @@ void          unlang_interpret_push_function(REQUEST *request,
 void           unlang_interpret_push_section(REQUEST *request, CONF_SECTION *cs,
                                              rlm_rcode_t default_action, bool top_frame);
 
+void           unlang_interpret_push_instruction(REQUEST *request, void *instruction,
+                                                 rlm_rcode_t default_rcode, bool top_frame);
+
 rlm_rcode_t    unlang_interpret(REQUEST *request);
 
 rlm_rcode_t    unlang_interpret_section(REQUEST *request, CONF_SECTION *cs, rlm_rcode_t default_action);