@@ -298,6 +298,82 @@ int do_assign(struct sip_msg* msg, struct action* a)
298
298
return -1 ;
299
299
}
300
300
301
+ static int do_action_set_adv_address (struct sip_msg * msg , struct action * a )
302
+ {
303
+ str adv_addr ;
304
+ int ret = 1 ; /* continue processing */
305
+
306
+ if (a -> elem [0 ].type != STR_ST ) {
307
+ report_programming_bug ("set_advertised_address type %d" , a -> elem [0 ].type );
308
+ ret = E_BUG ;
309
+ goto out ;
310
+ }
311
+
312
+ if (pv_printf_s (msg , (pv_elem_t * )a -> elem [0 ].u .data , & adv_addr ) != 0
313
+ || adv_addr .len <= 0 ) {
314
+
315
+ LM_WARN ("cannot get string for value\n" );
316
+ ret = E_BUG ;
317
+ goto out ;
318
+ }
319
+
320
+ LM_DBG ("setting adv address = [%.*s]\n" , adv_addr .len , adv_addr .s );
321
+
322
+ /* duplicate the advertised address into private memory */
323
+ if (adv_addr .len > msg -> set_global_address .len ) {
324
+ msg -> set_global_address .s = pkg_realloc (msg -> set_global_address .s ,
325
+ adv_addr .len );
326
+ if (!msg -> set_global_address .s ) {
327
+ LM_ERR ("out of pkg mem\n" );
328
+ ret = E_OUT_OF_MEM ;
329
+ goto out ;
330
+ }
331
+ }
332
+ memcpy (msg -> set_global_address .s , adv_addr .s , adv_addr .len );
333
+ msg -> set_global_address .len = adv_addr .len ;
334
+
335
+ out :
336
+ return ret ;
337
+ }
338
+
339
+ static int do_action_set_adv_port (struct sip_msg * msg , struct action * a )
340
+ {
341
+ str adv_port ;
342
+ int ret = 1 ;
343
+
344
+ if (a -> elem [0 ].type != STR_ST ) {
345
+ report_programming_bug ("set_advertised_port type %d" , a -> elem [0 ].type );
346
+ ret = E_BUG ;
347
+ goto out ;
348
+ }
349
+
350
+ if (pv_printf_s (msg , (pv_elem_t * )a -> elem [0 ].u .data , & adv_port ) != 0
351
+ || adv_port .len <= 0 ) {
352
+
353
+ LM_WARN ("cannot get string for value\n" );
354
+ ret = E_BUG ;
355
+ goto out ;
356
+ }
357
+
358
+ LM_DBG ("setting adv port '%.*s'\n" , adv_port .len , adv_port .s );
359
+
360
+ /* duplicate the advertised port into private memory */
361
+ if (adv_port .len > msg -> set_global_port .len ) {
362
+ msg -> set_global_port .s = pkg_realloc (msg -> set_global_port .s ,
363
+ adv_port .len );
364
+ if (!msg -> set_global_port .s ) {
365
+ LM_ERR ("out of pkg mem\n" );
366
+ ret = E_OUT_OF_MEM ;
367
+ goto out ;
368
+ }
369
+ }
370
+ memcpy (msg -> set_global_port .s , adv_port .s , adv_port .len );
371
+ msg -> set_global_port .len = adv_port .len ;
372
+
373
+ out :
374
+ return ret ;
375
+ }
376
+
301
377
#define update_longest_action () do { \
302
378
if (execmsgthreshold) { \
303
379
end_time = get_time_diff(&start); \
@@ -1759,38 +1835,17 @@ int do_action(struct action* a, struct sip_msg* msg)
1759
1835
msg -> msg_flags |=FL_FORCE_LOCAL_RPORT ;
1760
1836
ret = 1 ; /* continue processing */
1761
1837
break ;
1838
+
1762
1839
case SET_ADV_ADDR_T :
1763
- script_trace ("core" , "set_adv_addr" , msg , a -> line ) ;
1764
- if (a -> elem [0 ].type != STR_ST ){
1765
- LM_ALERT ("BUG in set_advertised_address() "
1766
- "type %d\n" , a -> elem [0 ].type );
1767
- ret = E_BUG ;
1768
- break ;
1769
- }
1770
- str adv_addr ;
1771
- pve = (pv_elem_t * )a -> elem [0 ].u .data ;
1772
- if ( pv_printf_s (msg , pve , & adv_addr )!= 0 ||
1773
- adv_addr .len == 0 || adv_addr .s == NULL ) {
1774
- LM_WARN ("cannot get string for value\n" );
1775
- ret = E_BUG ;
1776
- break ;
1777
- }
1778
- LM_DBG ("adv address = [%.*s]\n" ,adv_addr .len ,adv_addr .s );
1779
- msg -> set_global_address = adv_addr ;
1780
- ret = 1 ; /* continue processing */
1840
+ script_trace ("core" , "set_adv_addr" , msg , a -> line );
1841
+ ret = do_action_set_adv_address (msg , a );
1781
1842
break ;
1782
- case SET_ADV_PORT_T :
1783
- script_trace ("core" , "set_adv_port" , msg , a -> line ) ;
1784
- if (a -> elem [0 ].type != STR_ST ){
1785
- LM_ALERT ("BUG in set_advertised_port() "
1786
- "type %d\n" , a -> elem [0 ].type );
1787
- ret = E_BUG ;
1788
- break ;
1789
- }
1790
1843
1791
- msg -> set_global_port = * ((str * )a -> elem [0 ].u .data );
1792
- ret = 1 ; /* continue processing */
1844
+ case SET_ADV_PORT_T :
1845
+ script_trace ("core" , "set_adv_port" , msg , a -> line );
1846
+ ret = do_action_set_adv_port (msg , a );
1793
1847
break ;
1848
+
1794
1849
#ifdef USE_TCP
1795
1850
case FORCE_TCP_ALIAS_T :
1796
1851
script_trace ("core" , "force_tcp_alias" , msg , a -> line ) ;
0 commit comments