[sr-dev] git:tirpi/cfg_framework_multivalue: cfg framework: cfg_select() and cfg_reset() added
Miklos Tirpak
miklos at iptel.org
Mon Oct 4 17:21:09 CEST 2010
Sorry, the cfg_select() function description is wrong in the commit log,
the correct syntax for switching to the configuration of a specific
group instance is:
cfg_select("group_name", instance_id);
Miklos
On 10/04/2010 04:29 PM, Miklos Tirpak wrote:
> Module: sip-router
> Branch: tirpi/cfg_framework_multivalue
> Commit: 415f24a4f46c8f76c58122d18b943f6e4f0b58d3
> URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=415f24a4f46c8f76c58122d18b943f6e4f0b58d3
>
> Author: Miklos Tirpak<miklos at iptel.org>
> Committer: Miklos Tirpak<miklos at iptel.org>
> Date: Mon Oct 4 15:35:59 2010 +0200
>
> cfg framework: cfg_select() and cfg_reset() added
>
> cfg_select("group_name", "var_name") can be used to move a group
> handle to a specifig group instance in the script. Evey variable
> access within that group will be made from the new group instance
> until the handle is reset, practically until the end of the script
> unless cfg_reset("group_name") is explicitely called.
> This is true both for custom, module, and core variables, i.e. every
> configuration group can have multiple set of values.
>
> ---
>
> action.c | 35 +++++++++++++++++++++++++++++++++++
> cfg.lex | 6 ++++++
> cfg.y | 17 ++++++++++++++++-
> route.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> route_struct.h | 7 +++++--
> 5 files changed, 117 insertions(+), 3 deletions(-)
>
> diff --git a/action.c b/action.c
> index 8349ff9..317b192 100644
> --- a/action.c
> +++ b/action.c
> @@ -93,6 +93,7 @@
> #endif
> #include "switch.h"
> #include "events.h"
> +#include "cfg/cfg_struct.h"
>
> #include<sys/types.h>
> #include<sys/socket.h>
> @@ -1463,6 +1464,40 @@ match_cleanup:
> msg->rpl_send_flags.f|= SND_F_CON_CLOSE;
> ret=1; /* continue processing */
> break;
> + case CFG_SELECT_T:
> + if (a->val[0].type != CFG_GROUP_ST) {
> + BUG("unsupported parameter in CFG_SELECT_T: %d\n",
> + a->val[0].type);
> + ret=-1;
> + goto error;
> + }
> + switch(a->val[1].type) {
> + case NUMBER_ST:
> + v=(int)a->val[1].u.number;
> + break;
> + case RVE_ST:
> + if (rval_expr_eval_int(h, msg,&v, (struct rval_expr*)a->val[1].u.data)< 0) {
> + ret=-1;
> + goto error;
> + }
> + break;
> + default:
> + BUG("unsupported group id type in CFG_SELECT_T: %d\n",
> + a->val[1].type);
> + ret=-1;
> + goto error;
> + }
> + ret=(cfg_select((cfg_group_t*)a->val[0].u.data, v) == 0) ? 1 : -1;
> + break;
> + case CFG_RESET_T:
> + if (a->val[0].type != CFG_GROUP_ST) {
> + BUG("unsupported parameter in CFG_RESET_T: %d\n",
> + a->val[0].type);
> + ret=-1;
> + goto error;
> + }
> + ret=(cfg_reset((cfg_group_t*)a->val[0].u.data) == 0) ? 1 : -1;
> + break;
> /*
> default:
> LOG(L_CRIT, "BUG: do_action: unknown type %d\n", a->type);
> diff --git a/cfg.lex b/cfg.lex
> index 11822ea..07c7b90 100644
> --- a/cfg.lex
> +++ b/cfg.lex
> @@ -251,6 +251,9 @@ WHILE "while"
>
> INCLUDEFILE "include_file"
>
> +CFG_SELECT "cfg_select"
> +CFG_RESET "cfg_reset"
> +
> /*ACTION LVALUES*/
> URIHOST "uri:host"
> URIPORT "uri:port"
> @@ -635,6 +638,9 @@ SUBST subst
>
> <INITIAL>{INCLUDEFILE} { count(); BEGIN(INCLF); }
>
> +<INITIAL>{CFG_SELECT} { count(); yylval.strval=yytext; return CFG_SELECT; }
> +<INITIAL>{CFG_RESET} { count(); yylval.strval=yytext; return CFG_RESET; }
> +
> <INITIAL>{URIHOST} { count(); yylval.strval=yytext; return URIHOST; }
> <INITIAL>{URIPORT} { count(); yylval.strval=yytext; return URIPORT; }
>
> diff --git a/cfg.y b/cfg.y
> index c43792b..9f913c6 100644
> --- a/cfg.y
> +++ b/cfg.y
> @@ -101,7 +101,7 @@
> * 2010-02-17 added blacklist imask (DST_BLST_*_IMASK) support (andrei)
> */
>
> -%expect 5
> +%expect 6
>
> %{
>
> @@ -347,6 +347,8 @@ extern char *finame;
> %token CASE
> %token DEFAULT
> %token WHILE
> +%token CFG_SELECT
> +%token CFG_RESET
> %token URIHOST
> %token URIPORT
> %token MAX_LEN
> @@ -3259,6 +3261,19 @@ cmd:
> | SET_RPL_CLOSE {
> $$=mk_action(SET_RPL_CLOSE_T, 0); set_cfg_pos($$);
> }
> + | CFG_SELECT LPAREN STRING COMMA NUMBER RPAREN {
> + $$=mk_action(CFG_SELECT_T, 2, STRING_ST, $3, NUMBER_ST, (void*)$5); set_cfg_pos($$);
> + }
> + | CFG_SELECT LPAREN STRING COMMA rval_expr RPAREN {
> + $$=mk_action(CFG_SELECT_T, 2, STRING_ST, $3, RVE_ST, $5); set_cfg_pos($$);
> + }
> + | CFG_SELECT error { $$=0; yyerror("missing '(' or ')' ?"); }
> + | CFG_SELECT LPAREN error RPAREN { $$=0; yyerror("bad arguments, string and number expected"); }
> + | CFG_RESET LPAREN STRING RPAREN {
> + $$=mk_action(CFG_RESET_T, 1, STRING_ST, $3); set_cfg_pos($$);
> + }
> + | CFG_RESET error { $$=0; yyerror("missing '(' or ')' ?"); }
> + | CFG_RESET LPAREN error RPAREN { $$=0; yyerror("bad arguments, string expected"); }
> | ID {mod_func_action = mk_action(MODULE0_T, 2, MODEXP_ST, NULL, NUMBER_ST,
> 0); } LPAREN func_params RPAREN {
> mod_func_action->val[0].u.data =
> diff --git a/route.c b/route.c
> index 45de184..dbdbf78 100644
> --- a/route.c
> +++ b/route.c
> @@ -94,6 +94,7 @@
> #include "ut.h"
> #include "rvalue.h"
> #include "switch.h"
> +#include "cfg/cfg_struct.h"
>
> #define RT_HASH_SIZE 8 /* route names hash */
>
> @@ -1149,6 +1150,60 @@ int fix_actions(struct action* a)
> goto error;
> }
> break;
> + case CFG_SELECT_T:
> + if (t->val[1].type == RVE_ST) {
> + rve = t->val[1].u.data;
> + if (rve_is_constant(rve)) {
> + /* if expression is constant => evaluate it
> + as integer and replace it with the corresp.
> + int */
> + rv = rval_expr_eval(0, 0, rve);
> + if (rv == 0 ||
> + rval_get_int( 0, 0,&i, rv, 0)< 0 ) {
> + ERR("failed to fix constant rve");
> + if (rv) rval_destroy(rv);
> + ret = E_BUG;
> + goto error;
> + }
> + rval_destroy(rv);
> + rve_destroy(rve);
> + t->val[1].type = NUMBER_ST;
> + t->val[1].u.number = i;
> + } else {
> + /* expression is not constant => fixup&
> + optimize it */
> + if ((ret=fix_rval_expr(rve))
> + < 0) {
> + ERR("rve fixup failed\n");
> + ret = E_BUG;
> + goto error;
> + }
> + }
> + } else if (t->val[1].type != NUMBER_ST) {
> + BUG("invalid subtype %d for cfg_select()\n",
> + t->val[1].type);
> + ret = E_BUG;
> + goto error;
> + }
> +
> + case CFG_RESET_T:
> + if (t->val[0].type != STRING_ST) {
> + BUG("invalid subtype %d for cfg_select() or cfg_reset()\n",
> + t->val[0].type);
> + ret = E_BUG;
> + goto error;
> + }
> + tmp_p = (void *)cfg_lookup_group(t->val[0].u.string, strlen(t->val[0].u.string));
> + if (!tmp_p) {
> + ERR("configuration group \"%s\" not found\n",
> + t->val[0].u.string);
> + ret = E_SCRIPT;
> + goto error;
> + }
> + pkg_free(t->val[0].u.string);
> + t->val[0].u.data = tmp_p;
> + t->val[0].type = CFG_GROUP_ST;
> + break;
> default:
> /* no fixup required for the rest */
> break;
> diff --git a/route_struct.h b/route_struct.h
> index 2d4a643..9c504d1 100644
> --- a/route_struct.h
> +++ b/route_struct.h
> @@ -115,7 +115,9 @@ enum action_type{
> SET_FWD_NO_CONNECT_T,
> SET_RPL_NO_CONNECT_T,
> SET_FWD_CLOSE_T,
> - SET_RPL_CLOSE_T
> + SET_RPL_CLOSE_T,
> + CFG_SELECT_T,
> + CFG_RESET_T
> };
> /* parameter types for actions or types for expression right operands
> (WARNING right operands only, not working for left operands) */
> @@ -130,7 +132,8 @@ enum _operand_subtype{
> SELECT_UNFIXED_ST,
> STRING_RVE_ST /* RVE converted to a string (fparam hack) */,
> RVE_FREE_FIXUP_ST /* (str)RVE fixed up by a reversable fixup */,
> - FPARAM_DYN_ST /* temporary only (fparam hack) */
> + FPARAM_DYN_ST /* temporary only (fparam hack) */,
> + CFG_GROUP_ST
> };
>
> typedef enum _expr_l_type expr_l_type;
>
>
> _______________________________________________
> sr-dev mailing list
> sr-dev at lists.sip-router.org
> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
More information about the sr-dev
mailing list