Module: kamailio
Branch: master
Commit: a83e44b7a942afcf1770fa179cda8e530c74e28a
URL: 
https://github.com/kamailio/kamailio/commit/a83e44b7a942afcf1770fa179cda8e530c74e28a

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date: 2022-11-17T13:08:59+01:00

core: new global parameter return_mode

- control the return code evaluation mode:
  - 0 (default) - evaluation is like so far (negative is false, positive
    is true)
  - 1 - propagate return value and evaluation has to be done with >0 or
    <0, otherwise value!=0 is evaluated to true no matter is negative
    or positive

---

Modified: src/core/action.c
Modified: src/core/cfg.lex
Modified: src/core/cfg.y
Modified: src/core/globals.h
Modified: src/core/rvalue.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/a83e44b7a942afcf1770fa179cda8e530c74e28a.diff
Patch: 
https://github.com/kamailio/kamailio/commit/a83e44b7a942afcf1770fa179cda8e530c74e28a.patch

---

diff --git a/src/core/action.c b/src/core/action.c
index 48b150dd70..b95c531e1d 100644
--- a/src/core/action.c
+++ b/src/core/action.c
@@ -1065,7 +1065,7 @@ int do_action(struct run_act_ctx* h, struct action* a, 
struct sip_msg* msg)
                                        h->run_flags &= 
~(RETURN_R_F|BREAK_R_F); /* catch return &
                                                                                
                                            break in expr*/
                                        ret=1;  /*default is continue */
-                                       if (v>0) {
+                                       if ((ksr_return_mode==0 && v>0) || 
(ksr_return_mode!=0 && v!=0)) {
                                                if 
((a->val[1].type==ACTIONS_ST)&&a->val[1].u.data){
                                                        ret=run_actions(h,
                                                                                
(struct action*)a->val[1].u.data, msg);
@@ -1363,12 +1363,13 @@ int do_action(struct run_act_ctx* h, struct action* a, 
struct sip_msg* msg)
                        rve=(struct rval_expr*)a->val[0].u.data;
                        ret=1;
                        while(!(flags & (BREAK_R_F|RETURN_R_F|EXIT_R_F)) &&
-                                       (rval_expr_eval_int(h, msg, &v, rve) == 
0) && v){
+                                       (rval_expr_eval_int(h, msg, &v, rve) == 
0) &&
+                                       ((ksr_return_mode==0 && v>0) || 
(ksr_return_mode!=0 && v!=0))) {
                                if (cfg_get(core, core_cfg, max_while_loops) > 
0)
                                        i++;
 
                                if (unlikely(i > cfg_get(core, core_cfg, 
max_while_loops))){
-                                       LM_ERR("runaway while (%d, %d): more 
then %d loops\n", 
+                                       LM_ERR("runaway while (%d, %d): more 
then %d loops\n",
                                                                
rve->fpos.s_line, rve->fpos.s_col,
                                                                cfg_get(core, 
core_cfg, max_while_loops));
                                        ret=-1;
diff --git a/src/core/cfg.lex b/src/core/cfg.lex
index cc0afb8f22..d4379da3fc 100644
--- a/src/core/cfg.lex
+++ b/src/core/cfg.lex
@@ -147,6 +147,7 @@ FORWARD_SCTP        forward_sctp
 DROP   "drop"
 EXIT   "exit"
 RETURN "return"
+RETURN_MODE    "return_mode"
 BREAK  "break"
 LOG            log
 ERROR  error
@@ -1049,6 +1050,7 @@ IMPORTFILE      "import_file"
 <INITIAL>{CFGENGINE}   { count(); yylval.strval=yytext; return CFGENGINE; }
 <INITIAL>{URI_HOST_EXTRA_CHARS}        { yylval.strval=yytext; return 
URI_HOST_EXTRA_CHARS; }
 <INITIAL>{HDR_NAME_EXTRA_CHARS}        { yylval.strval=yytext; return 
HDR_NAME_EXTRA_CHARS; }
+<INITIAL>{RETURN_MODE} { count(); yylval.strval=yytext; return RETURN_MODE; }
 
 <INITIAL>{EQUAL}       { count(); return EQUAL; }
 <INITIAL>{ADDEQ}          { count(); return ADDEQ; }
diff --git a/src/core/cfg.y b/src/core/cfg.y
index 89eb5c210f..230be193dd 100644
--- a/src/core/cfg.y
+++ b/src/core/cfg.y
@@ -227,6 +227,7 @@ extern char *default_routename;
 %token EXIT
 %token DROP
 %token RETURN
+%token RETURN_MODE
 %token BREAK
 %token LOG_TOK
 %token ERROR
@@ -1900,6 +1901,8 @@ assign_stm:
        | WAIT_WORKER1_USLEEP EQUAL error { yyerror("number expected"); }
     | SERVER_ID EQUAL NUMBER { server_id=$3; }
        | SERVER_ID EQUAL error  { yyerror("number expected"); }
+    | RETURN_MODE EQUAL NUMBER { ksr_return_mode=$3; }
+       | RETURN_MODE EQUAL error  { yyerror("number expected"); }
        | KEMI DOT ONSEND_ROUTE_CALLBACK EQUAL STRING {
                        kemi_onsend_route_callback.s = $5;
                        kemi_onsend_route_callback.len = strlen($5);
diff --git a/src/core/globals.h b/src/core/globals.h
index 03eb1ef897..8d72807aee 100644
--- a/src/core/globals.h
+++ b/src/core/globals.h
@@ -219,6 +219,7 @@ extern str _ksr_xavp_via_params;
 extern str _ksr_xavp_via_fields;
 extern int ksr_sip_parser_mode;
 extern int ksr_cfg_print_mode;
+extern int ksr_return_mode;
 
 extern int ksr_wait_worker1_mode;
 extern int ksr_wait_worker1_time;
diff --git a/src/core/rvalue.c b/src/core/rvalue.c
index 9e5268c888..4ab93f44f4 100644
--- a/src/core/rvalue.c
+++ b/src/core/rvalue.c
@@ -82,6 +82,9 @@
 #define rv_unref(rv) ((--(rv)->refcnt)==0)
 
 
+/* control return code evaluation mode */
+int ksr_return_mode = 0;
+
 inline static void rval_force_clean(struct rvalue* rv)
 {
        if (rv->flags & RV_CNT_ALLOCED_F){
@@ -946,7 +949,11 @@ int rval_get_int(struct run_act_ctx* h, struct sip_msg* 
msg,
                        break;
                case RV_ACTION_ST:
                        if (rv->v.action) {
-                               *i=(run_actions_safe(h, rv->v.action, msg)>0);
+                               if(unlikely(ksr_return_mode==1)) {
+                                       *i=run_actions_safe(h, rv->v.action, 
msg);
+                               } else {
+                                       *i=(run_actions_safe(h, rv->v.action, 
msg)>0);
+                               }
                                h->run_flags &= ~(RETURN_R_F|BREAK_R_F);
                                /* catch return & break in expr*/
                        } else


_______________________________________________
Kamailio (SER) - Development Mailing List
[email protected]
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to