@@ -438,6 +438,9 @@ int do_action(struct action* a, struct sip_msg* msg)
438
438
struct timeval start ;
439
439
int end_time ;
440
440
int aux_counter ;
441
+ cmd_export_t * cmd = NULL ;
442
+ acmd_export_t * acmd ;
443
+ void * cmdp [MAX_CMD_PARAMS ];
441
444
442
445
/* reset the value of error to E_UNSPEC so avoid unknowledgable
443
446
functions to return with error (status<0) and not setting it
@@ -1860,48 +1863,88 @@ int do_action(struct action* a, struct sip_msg* msg)
1860
1863
ret = return_code ;
1861
1864
break ;
1862
1865
case MODULE_T :
1863
- script_trace ("module" , ((cmd_export_t * )(a -> elem [0 ].u .data ))-> name ,
1864
- msg , a -> file , a -> line ) ;
1865
- if ( (a -> elem [0 ].type == CMD_ST ) && a -> elem [0 ].u .data ) {
1866
- ret = ((cmd_export_t * )(a -> elem [0 ].u .data ))-> function (msg ,
1867
- (char * )a -> elem [1 ].u .data , (char * )a -> elem [2 ].u .data ,
1868
- (char * )a -> elem [3 ].u .data , (char * )a -> elem [4 ].u .data ,
1869
- (char * )a -> elem [5 ].u .data , (char * )a -> elem [6 ].u .data );
1870
- }else {
1866
+ if (a -> elem [0 ].type != CMD_ST ||
1867
+ ((cmd = (cmd_export_t * )a -> elem [0 ].u .data ) == NULL )) {
1871
1868
LM_ALERT ("BUG in module call\n" );
1869
+ break ;
1870
+ }
1871
+
1872
+ script_trace ("module" , cmd -> name , msg , a -> file , a -> line );
1873
+
1874
+ if ((ret = get_cmd_fixups (msg , cmd -> params , a -> elem , cmdp )) < 0 ) {
1875
+ LM_ERR ("Failed to get fixups for command <%s>\n" ,
1876
+ cmd -> name );
1877
+ break ;
1878
+ }
1879
+
1880
+ ret = cmd -> function (msg ,
1881
+ cmdp [0 ],cmdp [1 ],cmdp [2 ],
1882
+ cmdp [3 ],cmdp [4 ],cmdp [5 ]);
1883
+
1884
+ if ((ret = free_cmd_fixups (cmd -> params , a -> elem , cmdp )) < 0 ) {
1885
+ LM_ERR ("Failed to free fixups for command <%s>\n" ,
1886
+ cmd -> name );
1887
+ break ;
1872
1888
}
1889
+
1873
1890
break ;
1874
1891
case ASYNC_T :
1875
1892
/* first param - an ACTIONS_ST containing an ACMD_ST
1876
1893
* second param - a NUMBER_ST pointing to resume route */
1877
1894
aitem = (struct action * )(a -> elem [0 ].u .data );
1895
+ acmd = (acmd_export_t * )aitem -> elem [0 ].u .data ;
1896
+
1878
1897
if (async_script_start_f == NULL || a -> elem [0 ].type != ACTIONS_ST ||
1879
1898
a -> elem [1 ].type != NUMBER_ST || aitem -> type != AMODULE_T ) {
1880
1899
LM_ALERT ("BUG in async expression\n" );
1881
1900
} else {
1882
- script_trace ("async" ,
1883
- ((acmd_export_t * )(aitem -> elem [0 ].u .data ))-> name ,
1884
- msg , a -> file , a -> line ) ;
1885
- ret = async_script_start_f ( msg , aitem , a -> elem [1 ].u .number );
1901
+ script_trace ("async" , acmd -> name , msg , a -> file , a -> line );
1902
+
1903
+ if ((ret = get_cmd_fixups (msg , acmd -> params , aitem -> elem , cmdp )) < 0 ) {
1904
+ LM_ERR ("Failed to get fixups for async command <%s>\n" ,
1905
+ acmd -> name );
1906
+ break ;
1907
+ }
1908
+
1909
+ ret = async_script_start_f (msg , aitem , a -> elem [1 ].u .number , cmdp );
1886
1910
if (ret >=0 )
1887
1911
action_flags |= ACT_FL_TBCONT ;
1912
+
1913
+ if ((ret = free_cmd_fixups (acmd -> params , aitem -> elem , cmdp )) < 0 ) {
1914
+ LM_ERR ("Failed to free fixups for command <%s>\n" ,
1915
+ cmd -> name );
1916
+ break ;
1917
+ }
1888
1918
}
1889
1919
ret = 0 ;
1890
1920
break ;
1891
1921
case LAUNCH_T :
1892
1922
/* first param - an ACTIONS_ST containing an ACMD_ST
1893
1923
* second param - an optional NUMBER_ST pointing to an end route */
1894
1924
aitem = (struct action * )(a -> elem [0 ].u .data );
1925
+ acmd = (acmd_export_t * )aitem -> elem [0 ].u .data ;
1926
+
1895
1927
if (async_script_start_f == NULL || a -> elem [0 ].type != ACTIONS_ST ||
1896
1928
a -> elem [1 ].type != NUMBER_ST || aitem -> type != AMODULE_T ) {
1897
1929
LM_ALERT ("BUG in launch expression\n" );
1898
1930
} else {
1899
- script_trace ("launch" ,
1900
- ((acmd_export_t * )(aitem -> elem [0 ].u .data ))-> name ,
1901
- msg , a -> file , a -> line ) ;
1931
+ script_trace ("launch" , acmd -> name , msg , a -> file , a -> line );
1902
1932
/* NOTE that the routeID (a->elem[1].u.number) is set to
1903
1933
* -1 if no reporting route is set */
1904
- ret = async_script_launch ( msg , aitem , a -> elem [1 ].u .number );
1934
+
1935
+ if ((ret = get_cmd_fixups (msg , acmd -> params , aitem -> elem , cmdp )) < 0 ) {
1936
+ LM_ERR ("Failed to get fixups for async command <%s>\n" ,
1937
+ acmd -> name );
1938
+ break ;
1939
+ }
1940
+
1941
+ ret = async_script_launch ( msg , aitem , a -> elem [1 ].u .number , cmdp );
1942
+
1943
+ if ((ret = free_cmd_fixups (acmd -> params , aitem -> elem , cmdp )) < 0 ) {
1944
+ LM_ERR ("Failed to free fixups for command <%s>\n" ,
1945
+ cmd -> name );
1946
+ break ;
1947
+ }
1905
1948
}
1906
1949
break ;
1907
1950
case FORCE_RPORT_T :
0 commit comments