/* flags passed to custom actions */
enum act_flag {
ACT_FLAG_NONE = 0x00000000, /* no flag */
+ ACT_FLAG_FINAL = 0x00000001, /* last call, cannot yield */
};
enum act_name {
/* Custom keywords. */
if (!rule->action_ptr)
continue;
- switch (rule->action_ptr(rule, s->be, s->sess, s, 0)) {
+
+ switch (rule->action_ptr(rule, s->be, s->sess, s, (partial & SMP_OPT_FINAL) ? ACT_FLAG_FINAL : 0)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
continue;
/* Custom keywords. */
if (!rule->action_ptr)
continue;
- switch (rule->action_ptr(rule, s->be, s->sess, s, 0)) {
+ switch (rule->action_ptr(rule, s->be, s->sess, s, (partial & SMP_OPT_FINAL) ? ACT_FLAG_FINAL : 0)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
continue;
/* Custom keywords. */
if (rule->action_ptr)
break;
- switch (rule->action_ptr(rule, sess->fe, sess, NULL, 0)) {
+ switch (rule->action_ptr(rule, sess->fe, sess, NULL, ACT_FLAG_FINAL)) {
case ACT_RET_YIELD:
/* yield is not allowed at this point. If this return code is
* used it is a bug, so I prefer to abort the process.