Module: sip-router
Branch: andrei/script_vars
Commit: 1c7e485e4a8b77271d7a65c5e7a1263d2d73dda8
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1c7e485…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Thu Dec 4 00:47:29 2008 +0100
script engine: generalised lvalues & rvalues
- support for rvalues (anything that can appear on the right side
of an assignment). For now an rvalue can be an avp, pvar,
select, number, string, logical expression or script command.
rvalues expressions are also supported (rvalue operator rvalue
...).
Evaluation of integer rvalue expression is highly optimized.
For performance reasons the rvalue expressions are completely
separated from the logical expressions (eval_elem/eval_expr).
- rvalue expression fixup (apart for normal fixup stuff will also
optimize away simple expressions, like 2+3 or "a" + "b").
- support for more general lvalues (anything in the left side of
an assignment operator). For now an lvalue is either an avp or a
script pvar. lvalue = rvalue_expression.
Direct assignments (lvalue to avp or pvar) are optimised.
---
lvalue.c | 361 ++++++++++++++++
lvalue.h | 67 +++
rvalue.c | 1377 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rvalue.h | 175 ++++++++
4 files changed, 1980 insertions(+), 0 deletions(-)
Diff: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commitdiff;h=1c7…
Hi,
several kamailio modules need various string utility functions in the core,
e.g.:
- shm_strdup, pkg_strdup
- str_strcmp, str_casecmp
In the kamailio core we implemented this in the ut.h file. Does the SER core
already provide similiar functions? If not i can move the implementation code
from kamailio to this file, if this place is appropriate.
Henning
Hello all,
i'll be present this year at the 25th Chaos Communication Congress in Berlin
[1], December 27th to 30th, 2008.
So if some people here also participate in this event, and want to meet for
some hacking sessions and discussions around the Kamailio/ sip-router project
please drop me a personal mail.
Regards,
Henning
[1] http://events.ccc.de/congress/2008/
Module: sip-router
Branch: andrei/script_vars
Commit: f69ff7d9697349bf767f355be93eb15cdeab4e60
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=f69ff7d…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Sat Nov 29 17:12:16 2008 +0100
script: ser, kamailio and max compat mode support
- script mode can be switched between ser compatible, kamailio
compatible and max compatibility (compatible with both as much as
possible), using #!SER, #!KAMAILIO or #!ALL on the first line
(#!OPENSER and #!MAXCOMPAT are also allowed)
---
NEWS | 18 +++++++++++++++-
cfg.lex | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
sr_compat.c | 43 ++++++++++++++++++++++++++++++++++++++++
sr_compat.h | 44 +++++++++++++++++++++++++++++++++++++++++
4 files changed, 162 insertions(+), 6 deletions(-)
diff --git a/NEWS b/NEWS
index f9c0867..03852ee 100644
--- a/NEWS
+++ b/NEWS
@@ -1,8 +1,24 @@
-Release notes for SIP Express Router (ser)
+Release notes for SIP Router (sr)
***********************************************
$Id$
+sip-router changes
+
+core:
+ - support for dual module interfaces: ser and kamailio
+config script changes:
+ - script mode can be switched between ser compatible, kamailio compatible
+ and max compatibility (compatible with both as much as possible), using
+ #!SER
+ #!KAMAILIO
+ #!OPENSER
+ #!ALL
+ #!MAXCOMPAT
+ where #!KAMAILIO is equivalent with #!OPENSER and #!ALL with #!MAXCOMPAT
+ - support for kamailio style pvars
+
+
2.1.0 changes
diff --git a/cfg.lex b/cfg.lex
index b196c32..c4f5a14 100644
--- a/cfg.lex
+++ b/cfg.lex
@@ -89,6 +89,7 @@
#include "usr_avp.h"
#include "select.h"
#include "cfg.tab.h"
+ #include "sr_compat.h"
/* states */
#define INITIAL_S 0
@@ -99,6 +100,7 @@
#define SELECT_S 5
#define AVP_PVAR_S 6 /* avp or pvar */
#define PVAR_P_S 7 /* pvar: $(...) or $foo(...)*/
+ #define PVARID_S 8 /* $foo.bar...*/
#define STR_BUF_ALLOC_UNIT 128
struct str_buf{
@@ -124,7 +126,12 @@
%}
/* start conditions */
-%x STRING1 STRING2 COMMENT COMMENT_LN ATTR SELECT AVP_PVAR PVAR_P
+%x STRING1 STRING2 COMMENT COMMENT_LN ATTR SELECT AVP_PVAR PVAR_P PVARID
+
+/* config script types : #!SER or #!KAMAILIO or #!MAX_COMPAT */
+SER_CFG SER
+KAMAILIO_CFG KAMAILIO|OPENSER
+MAXCOMPAT_CFG MAXCOMPAT|ALL
/* action keywords */
FORWARD forward
@@ -761,8 +768,22 @@ EAT_ABLE [\ \t\b\r]
return ID;
}
-<INITIAL>{VAR_MARK}{LPAREN} { state = PVAR_P_S; BEGIN(PVAR_P); p_nest=1;
- yymore();}
+<INITIAL>{VAR_MARK}{LPAREN} {
+ switch(sr_cfg_compat){
+ case SR_COMPAT_SER:
+ state=ATTR_S; BEGIN(ATTR);
+ yyless(1);
+ count();
+ return ATTR_MARK;
+ break;
+ case SR_COMPAT_KAMAILIO:
+ case SR_COMPAT_MAX:
+ default:
+ state = PVAR_P_S; BEGIN(PVAR_P);
+ p_nest=1; yymore();
+ break;
+ }
+ }
/* eat everything between 2 () and return PVAR token and a string
containing everything (including $ and ()) */
<PVAR_P>{RPAREN} { p_nest--;
@@ -779,14 +800,38 @@ EAT_ABLE [\ \t\b\r]
}
<PVAR_P>. { yymore(); }
+<PVARID>{ID}|'.' {yymore(); }
+<PVARID>{LPAREN} { state = PVAR_P_S; BEGIN(PVAR_P);
+ p_nest=1; yymore(); }
+<PVARID>. { count(); state=INITIAL_S; BEGIN(INITIAL);
+ return PVAR;
+ }
-<INITIAL>{VAR_MARK} { state=AVP_PVAR_S; BEGIN(AVP_PVAR); yymore(); }
+
+<INITIAL>{VAR_MARK} {
+ switch(sr_cfg_compat){
+ case SR_COMPAT_SER:
+ count();
+ state=ATTR_S; BEGIN(ATTR);
+ return ATTR_MARK;
+ break;
+ case SR_COMPAT_KAMAILIO:
+ state=PVARID_S; BEGIN(PVARID);
+ yymore();
+ break;
+ case SR_COMPAT_MAX:
+ default:
+ state=AVP_PVAR_S; BEGIN(AVP_PVAR);
+ yymore();
+ break;
+ }
+ }
/* avp prefix detected -> go to avp mode */
<AVP_PVAR>{AVP_PREF} |
<AVP_PVAR>{ID}{LBRACK} { state = ATTR_S; BEGIN(ATTR); yyless(1);
return ATTR_MARK; }
<AVP_PVAR>{ID}{LPAREN} { state = PVAR_P_S; BEGIN(PVAR_P); yymore(); }
-<AVP_PVAR>{ID} { count(); addstr(&s_buf, yytext, yyleng);
+<AVP_PVAR>{ID} { count(); addstr(&s_buf, yytext, yyleng);
yylval.strval=s_buf.s;
memset(&s_buf, 0, sizeof(s_buf));
state = INITIAL_S;
@@ -882,6 +927,12 @@ EAT_ABLE [\ \t\b\r]
}
<COMMENT>.|{EAT_ABLE}|{CR} { count(); };
+<INITIAL>{COM_LINE}!{SER_CFG}{CR} { count();
+ sr_cfg_compat=SR_COMPAT_SER;}
+<INITIAL>{COM_LINE}!{KAMAILIO_CFG}{CR} { count();
+ sr_cfg_compat=SR_COMPAT_KAMAILIO;}
+<INITIAL>{COM_LINE}!{MAXCOMPAT_CFG}{CR} { count();
+ sr_cfg_compat=SR_COMPAT_MAX;}
<INITIAL>{COM_LINE}.*{CR} { count(); }
<INITIAL>{ID} { count(); addstr(&s_buf, yytext, yyleng);
@@ -916,6 +967,8 @@ EAT_ABLE [\ \t\b\r]
" while parsing"
" avp name\n");
break;
+ case PVARID_S:
+ p_nest=0;
case PVAR_P_S:
LOG(L_CRIT, "ERROR: unexpected EOF"
" while parsing pvar name"
diff --git a/sr_compat.c b/sr_compat.c
new file mode 100644
index 0000000..79660ab
--- /dev/null
+++ b/sr_compat.c
@@ -0,0 +1,43 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2008 iptelorg GmbH
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/**
+ * @file
+ * @brief ser/kamailio/openser compatibility macros & vars.
+ */
+/*
+ * History:
+ * --------
+ * 2008-11-29 initial version (andrei)
+ */
+
+
+#include "sr_compat.h"
+
+#ifdef SR_SER
+#define SR_DEFAULT_COMPAT SR_COMPAT_SER
+#elif defined SR_KAMAILIO || defined SR_OPENSER
+#define SR_DEFAULT_COMPAT SR_COMPAT_KAMAILIO
+#elif defined SR_ALL || defined SR_MAX_COMPAT
+#define SR_DEFAULT_COMPAT SR_COMPAT_MAX
+#else
+/* default */
+#define SR_DEFAULT_COMPAT SR_COMPAT_MAX
+#endif
+
+int sr_compat=SR_DEFAULT_COMPAT;
+int sr_cfg_compat=SR_DEFAULT_COMPAT;
diff --git a/sr_compat.h b/sr_compat.h
new file mode 100644
index 0000000..ba46bde
--- /dev/null
+++ b/sr_compat.h
@@ -0,0 +1,44 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2008 iptelorg GmbH
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/**
+ * @file
+ * @brief ser/kamailio/openser compatibility macros & vars.
+ */
+/*
+ * History:
+ * --------
+ * 2008-11-29 initial version (andrei)
+ */
+
+
+#ifndef _sr_compat_h
+#define _sr_compat_h
+
+/** max compat mode: support as many features as possible from all xSERs */
+#define SR_COMPAT_MAX 0
+/** maximum compatibility mode with ser */
+#define SR_COMPAT_SER 1
+/** maximum compatibility mode with kamailio/openser */
+#define SR_COMPAT_KAMAILIO 2
+#define SR_COMPAT_OPENSER 2
+
+
+extern int sr_compat;
+extern int sr_cfg_compat;
+
+#endif /* _sr_compat_h */