From 227a0db6051337b23d08af6c34ca02ea236c7c25 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Fri, 8 Jan 2010 10:02:51 +0000 Subject: Ticket #1013: PJSIP resolver should not try to resolve the target if IP address is given (thanks Emil Sturniolo for the report) git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3049 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsip/sip_resolve.c | 76 +++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 35 deletions(-) (limited to 'pjsip') diff --git a/pjsip/src/pjsip/sip_resolve.c b/pjsip/src/pjsip/sip_resolve.c index 8d817c6f..4ec74a78 100644 --- a/pjsip/src/pjsip/sip_resolve.c +++ b/pjsip/src/pjsip/sip_resolve.c @@ -198,7 +198,7 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver, } else { /* No type or explicit port is specified, and the address is * not IP address. - * In this case, full resolution must be performed. + * In this case, full NAPTR resolution must be performed. * But we don't support it (yet). */ #if PJ_HAS_TCP @@ -225,63 +225,69 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver, * we can just finish the resolution now using pj_gethostbyname() */ if (ip_addr_ver || resolver->res == NULL) { - - char ip_addr[PJ_INET6_ADDRSTRLEN]; - int af; - pj_addrinfo ai; - unsigned count; + char addr_str[PJ_INET6_ADDRSTRLEN+10]; pj_uint16_t srv_port; - if (!ip_addr_ver) { - PJ_LOG(5,(THIS_FILE, + if (ip_addr_ver != 0) { + /* Target is an IP address, no need to resolve */ + if (ip_addr_ver == 4) { + svr_addr.entry[0].addr.addr.sa_family = pj_AF_INET(); + pj_inet_aton(&target->addr.host, + &svr_addr.entry[0].addr.ipv4.sin_addr); + } else { + svr_addr.entry[0].addr.addr.sa_family = pj_AF_INET6(); + pj_inet_pton(pj_AF_INET6(), &target->addr.host, + &svr_addr.entry[0].addr.ipv4.sin_addr); + } + } else { + pj_addrinfo ai; + unsigned count; + int af; + + PJ_LOG(5,(THIS_FILE, "DNS resolver not available, target '%.*s:%d' type=%s " - "will be resolved with gethostbyname()", + "will be resolved with getaddrinfo()", target->addr.host.slen, target->addr.host.ptr, target->addr.port, pjsip_transport_get_type_name(target->type))); + + if (type & PJSIP_TRANSPORT_IPV6) { + af = pj_AF_INET6(); + } else { + af = pj_AF_INET(); + } + + /* Resolve */ + count = 1; + status = pj_getaddrinfo(af, &target->addr.host, &count, &ai); + if (status != PJ_SUCCESS) + goto on_error; + + svr_addr.entry[0].addr.addr.sa_family = (pj_uint16_t)af; + pj_memcpy(&svr_addr.entry[0].addr, &ai.ai_addr, + sizeof(pj_sockaddr)); } - /* Set the port number if not specified. */ + /* Set the port number */ if (target->addr.port == 0) { srv_port = (pj_uint16_t) pjsip_transport_get_default_port_for_type(type); } else { srv_port = (pj_uint16_t)target->addr.port; } - - if (type & PJSIP_TRANSPORT_IPV6) { - af = pj_AF_INET6(); - } else { - af = pj_AF_INET(); - } - - /* Resolve */ - count = 1; - status = pj_getaddrinfo(af, &target->addr.host, &count, &ai); - if (status != PJ_SUCCESS) - goto on_error; - - svr_addr.entry[0].addr.addr.sa_family = (pj_uint16_t)af; - pj_memcpy(&svr_addr.entry[0].addr, &ai.ai_addr, sizeof(pj_sockaddr)); - - if (af == pj_AF_INET6()) { - svr_addr.entry[0].addr.ipv6.sin6_port = pj_htons(srv_port); - } else { - svr_addr.entry[0].addr.ipv4.sin_port = pj_htons(srv_port); - } + pj_sockaddr_set_port(&svr_addr.entry[0].addr, srv_port); /* Call the callback. */ PJ_LOG(5,(THIS_FILE, "Target '%.*s:%d' type=%s resolved to " - "'%s:%d' type=%s (%s)", + "'%s' type=%s (%s)", (int)target->addr.host.slen, target->addr.host.ptr, target->addr.port, pjsip_transport_get_type_name(target->type), - pj_inet_ntop2(af, pj_sockaddr_get_addr(&svr_addr.entry[0].addr), - ip_addr, sizeof(ip_addr)), - srv_port, + pj_sockaddr_print(&svr_addr.entry[0].addr, addr_str, + sizeof(addr_str), 3), pjsip_transport_get_type_name(type), pjsip_transport_get_type_desc(type))); svr_addr.count = 1; -- cgit v1.2.3