Hello,
false is 0 and it was actually designed for setting global parameters,
not for use as comparison with functions return code or as parameter for
return from route blocks. Like:
log_stderror = false
The grammar of the language defines a coupe of token variants for same
purpose:
YES "yes"|"true"|"on"|"enable"
NO "no"|"false"|"off"|"disable"
Where YES is replaced by 1 and NO is replaced by 0:
<INITIAL>{YES} { count(); yylval.intval=1;
yy_number_str=yytext; return NUMBER; }
<INITIAL>{NO} { count(); yylval.intval=0;
yy_number_str=yytext; return NUMBER; }
In the devel version (upcoming 5.7.0), the evaluation of return mode can
be controlled by core parameter return_mode, allowing to switch to a
more "standard" mode, similar to other scripting languages -- see:
-
https://www.kamailio.org/wikidocs/cookbooks/devel/core/#return_mode
Cheers,
Daniel
On 28.04.23 08:14, Patrick Wakano wrote:
Hi list,
Hope you are all well!
I'm using Kamailio version 5.6.4 (installed from the repo
rpm.kamailio.org/centos/7 <http://rpm.kamailio.org/centos/7>) and
noticed that every route that uses "return false" is exiting the
script, instead of returning.... This was not the case on version
5.4.6 as the same script is running fine.....
From this page
https://www.kamailio.org/wikidocs/tutorials/faq/main/#how-is-the-function-r…,
I would think that when a route returns false, it would return -1 and
not stop execution, since negative is equal to false, but it is
actually stopping (same as return 0)...
So, as an example, this test code doesn't work as expected. In case
the source is a public IP, the script doesn't print the "SRC public"
it just exits and then of course every other logic meant to be done is
not executed....
route[is_src_private]
{
if (is_ip_rfc1918("$si")) {
return true;
}
return false;
#return is_ip_rfc1918("$si"); *# this doesn't work too in case
the $si is a public IP*
}
request_route
{
...
if (route(is_src_private)) {
xlog("L_NOTICE", "SRC private\n");
} else {
xlog("L_NOTICE", "SRC public\n");
}
...
}
If is_src_private is changed to return -1 instead of false, then it
all works fine.
Also, I noticed that the following code will print "TEST: 0" in case
the $si is public and then stop execution. So looks like false is
really being converted to 0, but I guess that's unexpected... anyway
apologies if I'm missing something obvious....
route[is_src_private]
{
$var(t) = false;
if (is_ip_rfc1918("$si")) {
$var(t) = true;
}
xlog("L_ERR", "TEST: $var(t)\n");
return $var(t);
}
I could not find a recent ticket or email related to this situation
and I've already spent hours trying to understand what is the
logic/problem here, so would anyone have been across a similar case
that could provide some insight and clarify what is the expected
behaviour of the *false* usage (and boolean in general if possible)?
Thank you,
Kind regards,
Patrick Wakano
__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions
To unsubscribe send an email to sr-users-leave(a)lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the sender!
Edit mailing list options or unsubscribe:
--
Daniel-Constantin Mierla --
www.asipto.com
www.twitter.com/miconda --
www.linkedin.com/in/miconda
Kamailio World Conference - June 5-7, 2023 -
www.kamailioworld.com