summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib/pjsua_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_core.c')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c53
1 files changed, 47 insertions, 6 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index dd0b2622..96ca174a 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -678,14 +678,34 @@ static void stun_dns_srv_resolver_cb(void *user_data,
* it with gethostbyname()
*/
if (pjsua_var.ua_cfg.stun_host.slen) {
+ pj_str_t str_host, str_port;
+ int port;
pj_hostent he;
- pjsua_var.stun_status = pj_gethostbyname(&pjsua_var.ua_cfg.stun_host, &he);
+ str_port.ptr = pj_strchr(&pjsua_var.ua_cfg.stun_host, ':');
+ if (str_port.ptr != NULL) {
+ str_host.ptr = pjsua_var.ua_cfg.stun_host.ptr;
+ str_host.slen = (str_port.ptr - str_host.ptr);
+ str_port.ptr++;
+ str_port.slen = pjsua_var.ua_cfg.stun_host.slen -
+ str_host.slen - 1;
+ port = (int)pj_strtoul(&str_port);
+ if (port < 1 || port > 65535) {
+ pjsua_perror(THIS_FILE, "Invalid STUN server", PJ_EINVAL);
+ pjsua_var.stun_status = PJ_EINVAL;
+ return;
+ }
+ } else {
+ str_host = pjsua_var.ua_cfg.stun_host;
+ port = 3478;
+ }
+
+ pjsua_var.stun_status = pj_gethostbyname(&str_host, &he);
if (pjsua_var.stun_status == PJ_SUCCESS) {
pj_sockaddr_in_init(&pjsua_var.stun_srv.ipv4, NULL, 0);
pjsua_var.stun_srv.ipv4.sin_addr = *(pj_in_addr*)he.h_addr;
- pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)3478);
+ pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)port);
PJ_LOG(3,(THIS_FILE,
"STUN server %.*s resolved, address is %s:%d",
@@ -772,14 +792,35 @@ pj_status_t pjsua_resolve_stun_server(pj_bool_t wait)
* gethostbyname().
*/
else if (pjsua_var.ua_cfg.stun_host.slen) {
+ pj_str_t str_host, str_port;
+ int port;
pj_hostent he;
- pjsua_var.stun_status = pj_gethostbyname(&pjsua_var.ua_cfg.stun_host, &he);
+ str_port.ptr = pj_strchr(&pjsua_var.ua_cfg.stun_host, ':');
+ if (str_port.ptr != NULL) {
+ str_host.ptr = pjsua_var.ua_cfg.stun_host.ptr;
+ str_host.slen = (str_port.ptr - str_host.ptr);
+ str_port.ptr++;
+ str_port.slen = pjsua_var.ua_cfg.stun_host.slen -
+ str_host.slen - 1;
+ port = (int)pj_strtoul(&str_port);
+ if (port < 1 || port > 65535) {
+ pjsua_perror(THIS_FILE, "Invalid STUN server", PJ_EINVAL);
+ pjsua_var.stun_status = PJ_EINVAL;
+ return pjsua_var.stun_status;
+ }
+ } else {
+ str_host = pjsua_var.ua_cfg.stun_host;
+ port = 3478;
+ }
+
+
+ pjsua_var.stun_status = pj_gethostbyname(&str_host, &he);
if (pjsua_var.stun_status == PJ_SUCCESS) {
pj_sockaddr_in_init(&pjsua_var.stun_srv.ipv4, NULL, 0);
pjsua_var.stun_srv.ipv4.sin_addr = *(pj_in_addr*)he.h_addr;
- pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)3478);
+ pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)port);
PJ_LOG(3,(THIS_FILE,
"STUN server %.*s resolved, address is %s:%d",
@@ -1055,8 +1096,8 @@ static pj_status_t create_sip_udp_sock(pj_in_addr bound_addr,
* STUN is specified, resolve the address with STUN.
*/
status = pjstun_get_mapped_addr(&pjsua_var.cp.factory, 1, &sock,
- &stun_srv, 3478,
- &stun_srv, 3478,
+ &stun_srv, pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port),
+ &stun_srv, pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port),
p_pub_addr);
if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE, "Error contacting STUN server", status);