diff --git a/coreapi/address.c b/coreapi/address.c index 1d893aede..4d4b1d2d6 100644 --- a/coreapi/address.c +++ b/coreapi/address.c @@ -136,5 +136,11 @@ void linphone_address_destroy(LinphoneAddress *u){ sal_address_destroy(u); } +int linphone_address_get_port_int(const LinphoneAddress *u) { + return sal_address_get_port_int(u); +} +const char* linphone_address_get_port(const LinphoneAddress *u) { + return sal_address_get_port(u); +} /** @} */ diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 11674665d..b369bb82c 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -646,9 +646,16 @@ static void sip_config_read(LinphoneCore *lc) } linphone_core_enable_ipv6(lc,ipv6); memset(&tr,0,sizeof(tr)); - tr.udp_port=lp_config_get_int(lc->config,"sip","sip_port",5060); - tr.tcp_port=lp_config_get_int(lc->config,"sip","sip_tcp_port",0); - + if (lp_config_get_int(lc->config,"sip","sip_random_port",0)) { + tr.udp_port=(0xDFF&+random())+1024; + } else { + tr.udp_port=lp_config_get_int(lc->config,"sip","sip_port",5060); + } + if (lp_config_get_int(lc->config,"sip","sip_tcp_random_port",0)) { + tr.tcp_port=(0xDFF&+random())+1024; + } else { + tr.tcp_port=lp_config_get_int(lc->config,"sip","sip_tcp_port",0); + } /*start listening on ports*/ linphone_core_set_sip_transports(lc,&tr); diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 34a3483ea..b780956ff 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -75,6 +75,15 @@ const char *linphone_address_get_scheme(const LinphoneAddress *u); const char *linphone_address_get_display_name(const LinphoneAddress* u); const char *linphone_address_get_username(const LinphoneAddress *u); const char *linphone_address_get_domain(const LinphoneAddress *u); +/** + * Get port number as an integer value. + * + */ +int linphone_address_get_port_int(const LinphoneAddress *u); +/** + * Get port number, null if not present. + */ +const char* linphone_address_get_port(const LinphoneAddress *u); void linphone_address_set_display_name(LinphoneAddress *u, const char *display_name); void linphone_address_set_username(LinphoneAddress *uri, const char *username); void linphone_address_set_domain(LinphoneAddress *uri, const char *host); diff --git a/coreapi/sal.h b/coreapi/sal.h index 9790b8c71..58d250e90 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -48,6 +48,9 @@ const char *sal_address_get_display_name(const SalAddress* addr); char *sal_address_get_display_name_unquoted(const SalAddress *addr); const char *sal_address_get_username(const SalAddress *addr); const char *sal_address_get_domain(const SalAddress *addr); +const char * sal_address_get_port(const SalAddress *addr); +int sal_address_get_port_int(const SalAddress *uri); + void sal_address_set_display_name(SalAddress *addr, const char *display_name); void sal_address_set_username(SalAddress *addr, const char *username); void sal_address_set_domain(SalAddress *addr, const char *host); diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index fa6fb5f11..8a427a2df 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1758,4 +1758,16 @@ void sal_set_keepalive_period(Sal *ctx,unsigned int value) { ctx->keepalive_period=value; eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value); } +const char * sal_address_get_port(const SalAddress *addr) { + const osip_from_t *u=(const osip_from_t*)addr; + return null_if_empty(u->url->port); +} +int sal_address_get_port_int(const SalAddress *uri) { + const char* port = sal_address_get_port(uri); + if (port != NULL) { + return atoi(port); + } else { + return 5060; + } +}