@@ -106,8 +106,8 @@ mi_response_t *mi_check_hash(const mi_params_t *params,
106
106
static int pv_get_random_val (struct sip_msg * msg , pv_param_t * param ,
107
107
pv_value_t * res );
108
108
109
- static int ts_usec_delta (struct sip_msg * msg , int * t1s ,
110
- int * t1u , int * t2s , int * t2u , pv_spec_t * _res );
109
+ static int ts_usec_delta (struct sip_msg * msg , int * t1s , int * t1u ,
110
+ int * t2s , int * t2u , pv_spec_t * pv_delta_str , pv_spec_t * pv_delta_int );
111
111
int check_time_rec (struct sip_msg * _ , char * time_rec , unsigned int * ptime );
112
112
113
113
#ifdef HAVE_TIMER_FD
@@ -182,7 +182,8 @@ static const cmd_export_t cmds[]={
182
182
{CMD_PARAM_INT , 0 , 0 },
183
183
{CMD_PARAM_INT , 0 , 0 },
184
184
{CMD_PARAM_INT , 0 , 0 },
185
- {CMD_PARAM_VAR , fixup_check_pv_setf , 0 }, {0 ,0 ,0 }},
185
+ {CMD_PARAM_VAR |CMD_PARAM_OPT , fixup_check_pv_setf , 0 },
186
+ {CMD_PARAM_VAR |CMD_PARAM_OPT , fixup_check_pv_setf , 0 }, {0 ,0 ,0 }},
186
187
REQUEST_ROUTE |FAILURE_ROUTE |ONREPLY_ROUTE |BRANCH_ROUTE |LOCAL_ROUTE |
187
188
STARTUP_ROUTE |TIMER_ROUTE |EVENT_ROUTE },
188
189
{"get_static_lock" ,(cmd_function )get_static_lock , {
@@ -307,8 +308,8 @@ struct module_exports exports = {
307
308
308
309
static int fixup_check_pv_setf (void * * param )
309
310
{
310
- if ((( pv_spec_t * )* param )-> setf == 0 ) {
311
- LM_ERR ("invalid pvar\n" );
311
+ if (! pv_is_w ((( pv_spec_t * )* param )) ) {
312
+ LM_ERR ("invalid pvar: must be writable \n" );
312
313
return E_SCRIPT ;
313
314
}
314
315
@@ -824,18 +825,44 @@ static int pv_sel_weight(struct sip_msg* msg, pv_spec_t *pv_name)
824
825
return -1 ;
825
826
}
826
827
827
- static int ts_usec_delta (struct sip_msg * msg , int * t1s ,
828
- int * t1u , int * t2s , int * t2u , pv_spec_t * _res )
828
+ static int ts_usec_delta (struct sip_msg * msg , int * t1s , int * t1u ,
829
+ int * t2s , int * t2u , pv_spec_t * pv_delta_str , pv_spec_t * pv_delta_int )
829
830
{
830
- pv_value_t res ;
831
+ pv_value_t val ;
832
+ long long diff ;
831
833
832
- res .ri = abs (1000000 * (* t1s - * t2s ) + * t1u - * t2u );
833
- res .flags = PV_TYPE_INT ;
834
+ diff = llabs (1000000LL * (* t1s - * t2s ) + * t1u - * t2u );
834
835
835
- if (pv_set_value (msg , _res , 0 , & res )) {
836
- LM_ERR ("cannot store result value\n" );
837
- return -1 ;
836
+ if (pv_delta_str ) {
837
+ char diff_buf [20 + 1 ];
838
+
839
+ val .rs .s = diff_buf ;
840
+ val .rs .len = sprintf (diff_buf , "%lld" , diff );
841
+ val .flags = PV_VAL_STR ;
842
+
843
+ if (pv_set_value (msg , pv_delta_str , 0 , & val ) != 0 ) {
844
+ LM_ERR ("failed to set the 'delta_str' output variable\n" );
845
+ return -1 ;
846
+ }
847
+ }
848
+
849
+ if (pv_delta_int ) {
850
+ if (diff > INT_MAX ) {
851
+ LM_ERR ("diff is too large to store in 'delta_int' (%lld us), "
852
+ "use the 'delta_str' output variable instead!\n" , diff );
853
+ return -1 ;
854
+ }
855
+
856
+ val .rs = STR_NULL ;
857
+ val .ri = (int )diff ;
858
+ val .flags = PV_VAL_INT |PV_TYPE_INT ;
859
+
860
+ if (pv_set_value (msg , pv_delta_int , 0 , & val )) {
861
+ LM_ERR ("failed to set the 'delta_int' output variable\n" );
862
+ return -1 ;
863
+ }
838
864
}
865
+
839
866
return 1 ;
840
867
}
841
868
0 commit comments