Module: sip-router Branch: master Commit: 9fa304f16f3152cae3b35b18b00ecd560c03c404 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=9fa304f16f3152cae3b35b18b00ecd560c03c404
Author: Alex Hermann <a...@speakup.nl> Committer: Alex Hermann <a...@speakup.nl> Date: Fri Aug 5 14:49:16 2011 +0200 core: add functions remove_branch(int) and clear_branches() remove_branch(int) - removes the specified branch from the destination set. If the parameter is absent, the last branch is removed. clear_branches() - empties the destination set. --- action.c | 15 +++++++++++++++ cfg.lex | 6 ++++++ cfg.y | 13 +++++++++++++ route_struct.h | 2 +- 4 files changed, 35 insertions(+), 1 deletions(-) diff --git a/action.c b/action.c index 8ca143a..6d22bf2 100644 --- a/action.c +++ b/action.c @@ -559,6 +559,21 @@ int do_action(struct run_act_ctx* h, struct action* a, struct sip_msg* msg) ruri_mark_consumed(); break; + /* remove last branch */ + case REMOVE_BRANCH_T: + if (a->val[0].type!=NUMBER_ST) { + ret=drop_sip_branch(0) ? -1 : 1; + } else { + ret=drop_sip_branch(a->val[0].u.number) ? -1 : 1; + } + break; + + /* remove all branches */ + case CLEAR_BRANCHES_T: + clear_branches(); + ret=1; + break; + /* jku begin: is_length_greater_than */ case LEN_GT_T: if (a->val[0].type!=NUMBER_ST) { diff --git a/cfg.lex b/cfg.lex index bfcf832..ff35a8a 100644 --- a/cfg.lex +++ b/cfg.lex @@ -237,6 +237,8 @@ STRIP "strip" STRIP_TAIL "strip_tail" SET_USERPHONE "userphone" APPEND_BRANCH "append_branch" +REMOVE_BRANCH "remove_branch" +CLEAR_BRANCHES "clear_branches" IF "if" ELSE "else" SET_ADV_ADDRESS "set_advertised_address" @@ -623,6 +625,10 @@ IMPORTFILE "import_file" <INITIAL>{STRIP_TAIL} { count(); yylval.strval=yytext; return STRIP_TAIL; } <INITIAL>{APPEND_BRANCH} { count(); yylval.strval=yytext; return APPEND_BRANCH; } +<INITIAL>{REMOVE_BRANCH} { count(); yylval.strval=yytext; + return REMOVE_BRANCH; } +<INITIAL>{CLEAR_BRANCHES} { count(); yylval.strval=yytext; + return CLEAR_BRANCHES; } <INITIAL>{SET_USERPHONE} { count(); yylval.strval=yytext; return SET_USERPHONE; } <INITIAL>{FORCE_RPORT} { count(); yylval.strval=yytext; return FORCE_RPORT; } diff --git a/cfg.y b/cfg.y index e5679e5..daf38e0 100644 --- a/cfg.y +++ b/cfg.y @@ -324,6 +324,8 @@ extern char *finame; %token STRIP_TAIL %token SET_USERPHONE %token APPEND_BRANCH +%token REMOVE_BRANCH +%token CLEAR_BRANCHES %token SET_USER %token SET_USERPASS %token SET_PORT @@ -3198,6 +3200,17 @@ cmd: NUMBER_ST, (void *)Q_UNSPECIFIED); set_cfg_pos($$); } + | REMOVE_BRANCH LPAREN NUMBER RPAREN { + $$=mk_action(REMOVE_BRANCH_T, 1, NUMBER_ST, (void*)$3); + set_cfg_pos($$); + } + | REMOVE_BRANCH LPAREN RPAREN { + $$=mk_action(REMOVE_BRANCH_T, 0); + set_cfg_pos($$); + } + | REMOVE_BRANCH error { $$=0; yyerror("missing '(' or ')' ?"); } + | REMOVE_BRANCH LPAREN error RPAREN { $$=0; yyerror("bad argument, number expected"); } + | CLEAR_BRANCHES LPAREN RPAREN { $$=mk_action(CLEAR_BRANCHES_T, 0); set_cfg_pos($$); } | SET_HOSTPORT LPAREN STRING RPAREN { $$=mk_action(SET_HOSTPORT_T, 1, STRING_ST, $3); set_cfg_pos($$); } | SET_HOSTPORT error { $$=0; yyerror("missing '(' or ')' ?"); } | SET_HOSTPORT LPAREN error RPAREN { $$=0; yyerror("bad argument, string expected"); } diff --git a/route_struct.h b/route_struct.h index 08a576c..4bb5045 100644 --- a/route_struct.h +++ b/route_struct.h @@ -94,7 +94,7 @@ enum action_type{ SETFLAG_T, RESETFLAG_T, ISFLAGSET_T , AVPFLAG_OPER_T, LEN_GT_T, PREFIX_T, STRIP_T,STRIP_TAIL_T, - APPEND_BRANCH_T, + APPEND_BRANCH_T, REMOVE_BRANCH_T, CLEAR_BRANCHES_T, REVERT_URI_T, FORWARD_TCP_T, FORWARD_UDP_T, _______________________________________________ sr-dev mailing list sr-dev@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev