UNLANG_ACTION_STOP_PROCESSING //!< Break out of processing the current request (unwind).
} unlang_action_t;
+#define UNLANG_TOP_FRAME (true)
+#define UNLANG_SUB_FRAME (false)
+
/** Function to call when first evaluating a frame
*
* @param[in] request The current request.
void unlang_push_function(REQUEST *request, unlang_function_t func, unlang_function_t repeat, void *uctx);
-void unlang_push_section(REQUEST *request, CONF_SECTION *cs, rlm_rcode_t default_action);
+void unlang_push_section(REQUEST *request, CONF_SECTION *cs, rlm_rcode_t default_action, bool top_frame);
rlm_rcode_t unlang_interpret_continue(REQUEST *request);
/** Push a configuration section onto the request stack for later interpretation.
*
*/
-void unlang_push_section(REQUEST *request, CONF_SECTION *cs, rlm_rcode_t action)
+void unlang_push_section(REQUEST *request, CONF_SECTION *cs, rlm_rcode_t action, bool top_frame)
{
unlang_t *instruction = NULL;
unlang_stack_t *stack = request->stack;
if (cs) {
instruction = (unlang_t *)cf_data_value(cf_data_find(cs, unlang_group_t, NULL));
if (!instruction) {
- RPEDEBUG("Failed to find pre-compiled unlang for section %s %s { ... }",
+ REDEBUG("Failed to find pre-compiled unlang for section %s %s { ... }",
cf_section_name1(cs), cf_section_name2(cs));
}
}
* Push the default action, and the instruction which has
* no action.
*/
- unlang_push(stack, NULL, action, UNLANG_NEXT_STOP, UNLANG_TOP_FRAME);
+ if (top_frame) unlang_push(stack, NULL, action, UNLANG_NEXT_STOP, UNLANG_TOP_FRAME);
if (instruction) unlang_push(stack, instruction, RLM_MODULE_UNKNOWN, UNLANG_NEXT_CONTINUE, UNLANG_SUB_FRAME);
RDEBUG4("** [%i] %s - substack begins", stack->depth, __FUNCTION__);
* This pushes a new frame onto the stack, which is the
* start of a new unlang section...
*/
- unlang_push_section(request, cs, action);
+ unlang_push_section(request, cs, action, UNLANG_TOP_FRAME);
return unlang_run(request);
}
}
RDEBUG("Running 'recv' from file %s", cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_RECV;
/* FALL-THROUGH */
if (!unlang) goto send_reply;
RDEBUG("Running 'send %s { ... }' from file %s", cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_SEND;
/* FALL-THROUGH */
RDEBUG("Running '%s %s' from file %s", cf_section_name1(unlang),
cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_RECV;
/* FALL-THROUGH */
}
RDEBUG("Running 'recv Accounting-Request' from file %s", cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_RECV;
/* FALL-THROUGH */
if (!unlang) goto send_reply;
RDEBUG("Running 'send %s' from file %s", cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_SEND;
/* FALL-THROUGH */
* Push the conf section into the unlang stack.
*/
RDEBUG("Running 'recv Access-Request' from file %s", cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_REJECT);
+ unlang_push_section(request, unlang, RLM_MODULE_REJECT, UNLANG_TOP_FRAME);
request->request_state = REQUEST_RECV;
/* FALL-THROUGH */
}
RDEBUG("Running 'authenticate %s' from file %s", cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOTFOUND);
+ unlang_push_section(request, unlang, RLM_MODULE_NOTFOUND, UNLANG_TOP_FRAME);
request->request_state = REQUEST_PROCESS;
/* FALL-THROUGH */
}
RDEBUG("Running 'send %s' from file %s", cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_SEND;
/* FALL-THROUGH */
}
RDEBUG("Running 'recv %s' from file %s", dv->alias, cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_RECV;
/* FALL-THROUGH */
*/
rerun_nak:
RDEBUG("Running 'send %s' from file %s", cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
rad_assert(request->log.unlang_indent == 0);
request->request_state = REQUEST_SEND;
}
RDEBUG("Running 'new client' from file %s", cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_RECV;
/* FALL-THROUGH */
rerun_nak:
RDEBUG("Running '%s client' from file %s", cf_section_name1(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_SEND;
/* FALL-THROUGH */
}
RDEBUG("Running 'recv Status-Server' from file %s", cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_RECV;
/* FALL-THROUGH */
rerun_nak:
RDEBUG("Running 'send %s' from file %s", cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_SEND;
/* FALL-THROUGH */
}
RDEBUG("Running 'recv %s' from file %s", cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_REJECT);
+ unlang_push_section(request, unlang, RLM_MODULE_REJECT, UNLANG_TOP_FRAME);
request->request_state = REQUEST_RECV;
/* FALL-THROUGH */
}
RDEBUG("Running 'process %s' from file %s", cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOTFOUND);
+ unlang_push_section(request, unlang, RLM_MODULE_NOTFOUND, UNLANG_TOP_FRAME);
request->request_state = REQUEST_PROCESS;
/* FALL-THROUGH */
if (!unlang) goto send_reply;
RDEBUG("Running 'send %s' from file %s", cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_SEND;
/* FALL-THROUGH */
}
RDEBUG("Running 'recv %s' from file %s", cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_RECV;
/* FALL-THROUGH */
rerun_nak:
RDEBUG("Running 'send %s' from file %s", cf_section_name2(unlang), cf_filename(unlang));
- unlang_push_section(request, unlang, RLM_MODULE_NOOP);
+ unlang_push_section(request, unlang, RLM_MODULE_NOOP, UNLANG_TOP_FRAME);
request->request_state = REQUEST_SEND;
/* FALL-THROUGH */
return RLM_MODULE_OK;
}
- unlang_push_section(request, unlang, RLM_MODULE_FAIL);
+ unlang_push_section(request, unlang, RLM_MODULE_FAIL, UNLANG_TOP_FRAME);
eap_session->process = mod_process_auth_type;
if (!unlang) {
rcode = process_authenticate(inst->auth_type_mschap, request);
} else {
- unlang_push_section(request, unlang, RLM_MODULE_FAIL);
+ unlang_push_section(request, unlang, RLM_MODULE_FAIL, UNLANG_TOP_FRAME);
rcode = unlang_interpret_continue(request);
/*
if (!unlang) {
rcode = process_authenticate(enumv->value->vb_uint32, fake);
} else {
- unlang_push_section(request, unlang, RLM_MODULE_FAIL);
+ unlang_push_section(request, unlang, RLM_MODULE_FAIL, UNLANG_TOP_FRAME);
rcode = unlang_interpret_continue(request);
}