Changeset 3049


Ignore:
Timestamp:
Jan 8, 2010 10:02:51 AM (14 years ago)
Author:
bennylp
Message:

Ticket #1013: PJSIP resolver should not try to resolve the target if IP address is given (thanks Emil Sturniolo for the report)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip/sip_resolve.c

    r2394 r3049  
    199199            /* No type or explicit port is specified, and the address is 
    200200             * not IP address. 
    201              * In this case, full resolution must be performed. 
     201             * In this case, full NAPTR resolution must be performed. 
    202202             * But we don't support it (yet). 
    203203             */ 
     
    226226     */ 
    227227    if (ip_addr_ver || resolver->res == NULL) { 
    228  
    229         char ip_addr[PJ_INET6_ADDRSTRLEN]; 
    230         int af; 
    231         pj_addrinfo ai; 
    232         unsigned count; 
     228        char addr_str[PJ_INET6_ADDRSTRLEN+10]; 
    233229        pj_uint16_t srv_port; 
    234230 
    235         if (!ip_addr_ver) { 
    236             PJ_LOG(5,(THIS_FILE,  
     231        if (ip_addr_ver != 0) { 
     232            /* Target is an IP address, no need to resolve */ 
     233            if (ip_addr_ver == 4) { 
     234                svr_addr.entry[0].addr.addr.sa_family = pj_AF_INET(); 
     235                pj_inet_aton(&target->addr.host, 
     236                             &svr_addr.entry[0].addr.ipv4.sin_addr); 
     237            } else { 
     238                svr_addr.entry[0].addr.addr.sa_family = pj_AF_INET6(); 
     239                pj_inet_pton(pj_AF_INET6(), &target->addr.host, 
     240                        &svr_addr.entry[0].addr.ipv4.sin_addr); 
     241            } 
     242        } else { 
     243            pj_addrinfo ai; 
     244            unsigned count; 
     245            int af; 
     246 
     247            PJ_LOG(5,(THIS_FILE, 
    237248                      "DNS resolver not available, target '%.*s:%d' type=%s " 
    238                       "will be resolved with gethostbyname()", 
     249                      "will be resolved with getaddrinfo()", 
    239250                      target->addr.host.slen, 
    240251                      target->addr.host.ptr, 
    241252                      target->addr.port, 
    242253                      pjsip_transport_get_type_name(target->type))); 
     254 
     255            if (type & PJSIP_TRANSPORT_IPV6) { 
     256                af = pj_AF_INET6(); 
     257            } else { 
     258                af = pj_AF_INET(); 
     259            } 
     260 
     261            /* Resolve */ 
     262            count = 1; 
     263            status = pj_getaddrinfo(af, &target->addr.host, &count, &ai); 
     264            if (status != PJ_SUCCESS) 
     265                goto on_error; 
     266 
     267            svr_addr.entry[0].addr.addr.sa_family = (pj_uint16_t)af; 
     268            pj_memcpy(&svr_addr.entry[0].addr, &ai.ai_addr, 
     269                      sizeof(pj_sockaddr)); 
    243270        } 
    244271 
    245         /* Set the port number if not specified. */ 
     272        /* Set the port number */ 
    246273        if (target->addr.port == 0) { 
    247274           srv_port = (pj_uint16_t) 
     
    250277           srv_port = (pj_uint16_t)target->addr.port; 
    251278        } 
    252  
    253         if (type & PJSIP_TRANSPORT_IPV6) { 
    254             af = pj_AF_INET6(); 
    255         } else { 
    256             af = pj_AF_INET(); 
    257         } 
    258  
    259         /* Resolve */ 
    260         count = 1; 
    261         status = pj_getaddrinfo(af, &target->addr.host, &count, &ai); 
    262         if (status != PJ_SUCCESS) 
    263             goto on_error; 
    264  
    265         svr_addr.entry[0].addr.addr.sa_family = (pj_uint16_t)af; 
    266         pj_memcpy(&svr_addr.entry[0].addr, &ai.ai_addr, sizeof(pj_sockaddr)); 
    267  
    268         if (af == pj_AF_INET6()) { 
    269             svr_addr.entry[0].addr.ipv6.sin6_port = pj_htons(srv_port); 
    270         } else { 
    271             svr_addr.entry[0].addr.ipv4.sin_port = pj_htons(srv_port); 
    272         } 
     279        pj_sockaddr_set_port(&svr_addr.entry[0].addr, srv_port); 
    273280 
    274281        /* Call the callback. */ 
    275282        PJ_LOG(5,(THIS_FILE,  
    276283                  "Target '%.*s:%d' type=%s resolved to " 
    277                   "'%s:%d' type=%s (%s)", 
     284                  "'%s' type=%s (%s)", 
    278285                  (int)target->addr.host.slen, 
    279286                  target->addr.host.ptr, 
    280287                  target->addr.port, 
    281288                  pjsip_transport_get_type_name(target->type), 
    282                   pj_inet_ntop2(af, pj_sockaddr_get_addr(&svr_addr.entry[0].addr), 
    283                                 ip_addr, sizeof(ip_addr)), 
    284                   srv_port, 
     289                  pj_sockaddr_print(&svr_addr.entry[0].addr, addr_str, 
     290                                    sizeof(addr_str), 3), 
    285291                  pjsip_transport_get_type_name(type), 
    286292                  pjsip_transport_get_type_desc(type))); 
Note: See TracChangeset for help on using the changeset viewer.