Module: sip-router Branch: andrei/script_vars Commit: f69ff7d9697349bf767f355be93eb15cdeab4e60 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=f69ff7d9...
Author: Andrei Pelinescu-Onciul andrei@iptel.org Committer: Andrei Pelinescu-Onciul andrei@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 */