diff --git a/cfg.lex b/cfg.lex index c0739a3294c..4798b23ad18 100644 --- a/cfg.lex +++ b/cfg.lex @@ -212,6 +212,8 @@ SUBSCRIBE_EVENT "subscribe_event" CONSTRUCT_URI "construct_uri" GET_TIMESTAMP "get_timestamp" SCRIPT_TRACE "script_trace" +EVENT_ROUTE_SYNC sync +EVENT_ROUTE_ASYNC async /*ACTION LVALUES*/ URIHOST "uri:host" @@ -569,6 +571,10 @@ IMPORTFILE "import_file" return GET_TIMESTAMP;} {SCRIPT_TRACE} { count(); yylval.strval=yytext; return SCRIPT_TRACE;} +{EVENT_ROUTE_SYNC} { count(); yylval.strval=yytext; + return EVENT_ROUTE_SYNC;} +{EVENT_ROUTE_ASYNC} { count(); yylval.strval=yytext; + return EVENT_ROUTE_SYNC;} {MAX_LEN} { count(); yylval.strval=yytext; return MAX_LEN; } {METHOD} { count(); yylval.strval=yytext; return METHOD; } diff --git a/cfg.y b/cfg.y index fc7f485a810..c16f8c93889 100644 --- a/cfg.y +++ b/cfg.y @@ -433,6 +433,8 @@ extern char *finame; %token DB_VERSION_TABLE %token DB_DEFAULT_URL %token DISABLE_503_TRANSLATION +%token EVENT_ROUTE_SYNC +%token EVENT_ROUTE_ASYNC @@ -1914,12 +1916,12 @@ event_route_stm: ROUTE_EVENT LBRACK route_name RBRACK LBRACE actions RBRACE { } event_rlist[i_tmp].name = $3; - event_rlist[i_tmp].mode = EVENT_ROUTE_SYNC; + event_rlist[i_tmp].mode = EV_ROUTE_SYNC; push($6, &event_rlist[i_tmp].a); } - | ROUTE_EVENT LBRACK route_name COMMA STRING RBRACK LBRACE actions RBRACE { - int len; + | ROUTE_EVENT LBRACK route_name COMMA EVENT_ROUTE_SYNC RBRACK LBRACE actions RBRACE { + i_tmp = 1; while (event_rlist[i_tmp].a !=0 && i_tmp < EVENT_RT_NO) { if (strcmp($3, event_rlist[i_tmp].name) == 0) { @@ -1935,26 +1937,29 @@ event_route_stm: ROUTE_EVENT LBRACK route_name RBRACK LBRACE actions RBRACE { } event_rlist[i_tmp].name = $3; + event_rlist[i_tmp].mode = EV_ROUTE_SYNC; - len = strlen($5); + push($8, &event_rlist[i_tmp].a); + } + | ROUTE_EVENT LBRACK route_name COMMA EVENT_ROUTE_ASYNC RBRACK LBRACE actions RBRACE { - if (len < 4 /*"sync"*/ || - len > 5 /*"async"*/) { - yyerror("Invalid event route mode definition " - "[sync/async]"); - YYABORT; + i_tmp = 1; + while (event_rlist[i_tmp].a !=0 && i_tmp < EVENT_RT_NO) { + if (strcmp($3, event_rlist[i_tmp].name) == 0) { + LM_ERR("Script route <%s> redefined\n", $3); + YYABORT; + } + i_tmp++; } - if (len == 4 && !strcmp($5, "sync")) { - event_rlist[i_tmp].mode = EVENT_ROUTE_SYNC; - } else if (len == 5 && !strcmp($5, "async")) { - event_rlist[i_tmp].mode = EVENT_ROUTE_ASYNC; - } else { - yyerror("Invalid event route mode definition " - "[sync/async]"); + if (i_tmp == EVENT_RT_NO) { + yyerror("Too many event routes defined\n"); YYABORT; } + event_rlist[i_tmp].name = $3; + event_rlist[i_tmp].mode = EV_ROUTE_ASYNC; + push($8, &event_rlist[i_tmp].a); } | ROUTE_EVENT error { yyerror("invalid event_route statement"); } diff --git a/modules/event_route/README b/modules/event_route/README index eb29584bce3..dc50cdaf33a 100644 --- a/modules/event_route/README +++ b/modules/event_route/README @@ -53,7 +53,7 @@ Chapter 1. Admin Guide raised by the OpenSIPS Event Interface.Since version 1.12, the way an event is handlend (sync/async) should be specified from the configuration script with the desired keyword following the - name of the event (event_route[e, "sync"]). + name of the event (event_route[e, sync]). 1.2. ROUTE events parameters diff --git a/modules/event_route/doc/event_route_admin.xml b/modules/event_route/doc/event_route_admin.xml index aa38f39a6fb..5cfa9d1e763 100644 --- a/modules/event_route/doc/event_route_admin.xml +++ b/modules/event_route/doc/event_route_admin.xml @@ -15,7 +15,7 @@ the module when the corresponding event is raised by the &osips; Event Interface.Since version 1.12, the way an event is handlend (sync/async) should be specified from the configuration script with the desired keyword - following the name of the event (event_route[e, "sync"]). + following the name of the event (event_route[e, sync]). diff --git a/modules/event_route/event_route.c b/modules/event_route/event_route.c index 64a992d2d08..2a3209147b6 100644 --- a/modules/event_route/event_route.c +++ b/modules/event_route/event_route.c @@ -257,8 +257,9 @@ static evi_reply_sock* scriptroute_parse(str socket) mode_pos = q_memrchr(socket.s, EVENT_ROUTE_MODE_SEP, socket.len); if (mode_pos == NULL) mode = 0; /*default 'sync'*/ + else + mode_pos++; - mode_pos++; if (!strncmp(mode_pos, "sync", 4)) { mode = 0; } else if (!strncmp(mode_pos, "async", 5)) { @@ -271,15 +272,23 @@ static evi_reply_sock* scriptroute_parse(str socket) name_len = socket.len-(mode/*if async add 1*/+4/*sync len*/+1/*'/'*/); /* try to normalize the route name */ - name = pkg_realloc(dummy_buffer, name_len + 1); + if (mode_pos) + name = pkg_realloc(dummy_buffer, name_len + 1); + else + name = pkg_realloc(dummy_buffer, socket.len+1); + if (!name) { LM_ERR("no more pkg memory\n"); return NULL; } - memcpy(name, socket.s, name_len); - name[name_len] = '\0'; + if (mode_pos) { + memcpy(name, socket.s, name_len); + name[name_len] = '\0'; + } else { + memcpy(name, socket.s, socket.len + 1); + } dummy_buffer = name; @@ -290,7 +299,11 @@ static evi_reply_sock* scriptroute_parse(str socket) return NULL; } - sock = shm_malloc(sizeof(evi_reply_sock) + socket.len + 1); + if (mode_pos) + sock = shm_malloc(sizeof(evi_reply_sock) + name_len + 1); + else + sock = shm_malloc(sizeof(evi_reply_sock) + socket.len + 1); + if (!sock) { LM_ERR("no more memory for socket\n"); return NULL; @@ -298,8 +311,14 @@ static evi_reply_sock* scriptroute_parse(str socket) memset(sock, 0, sizeof(evi_reply_sock)); sock->address.s = (char *)(sock + 1); - sock->address.len = socket.len; - memcpy(sock->address.s, name, socket.len + 1); + + if (mode_pos) { + memcpy(sock->address.s, name, name_len + 1); + sock->address.len = name_len; + } else { + memcpy(sock->address.s, name, socket.len + 1); + sock->address.len = socket.len; + } sock->params = (void *)(unsigned long)idx; sock->params = (void *)((unsigned long)sock->params | diff --git a/route.h b/route.h index 6694008cd17..db613b6a28f 100644 --- a/route.h +++ b/route.h @@ -52,8 +52,8 @@ struct script_timer_route{ struct action* a; }; -#define EVENT_ROUTE_SYNC 0 -#define EVENT_ROUTE_ASYNC 1 +#define EV_ROUTE_SYNC 0 +#define EV_ROUTE_ASYNC 1 struct script_event_route{ char *name;