Changeset 5420


Ignore:
Timestamp:
Aug 17, 2016 4:29:17 AM (3 years ago)
Author:
nanang
Message:

Fixed #1953: Skip IPv6 socket in resolver on system without IPv6 support.

Location:
pjproject/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib-util/src/pjlib-util/resolver.c

    r5349 r5420  
    2020#include <pjlib-util/resolver.h> 
    2121#include <pjlib-util/errno.h> 
     22#include <pj/compat/socket.h> 
    2223#include <pj/assert.h> 
    2324#include <pj/ctype.h> 
     
    310311    status = pj_sock_socket(pj_AF_INET6(), pj_SOCK_DGRAM(), 0, 
    311312                            &resv->udp6_sock); 
    312     if (status != PJ_SUCCESS) 
     313    if (status != PJ_SUCCESS) { 
     314        /* Skip IPv6 socket on system without IPv6 (see ticket #1953) */ 
     315        if (status == PJ_STATUS_FROM_OS(OSERR_EAFNOSUPPORT)) { 
     316            PJ_LOG(3,(resv->name.ptr, 
     317                      "System does not support IPv6, resolver will " 
     318                      "ignore any IPv6 nameservers")); 
     319            return PJ_SUCCESS; 
     320        } 
    313321        return status; 
     322    } 
    314323 
    315324    /* Bind to any address/port */ 
     
    651660{ 
    652661    unsigned pkt_size; 
    653     unsigned i, server_cnt; 
     662    unsigned i, server_cnt, send_cnt; 
    654663    unsigned servers[PJ_DNS_RESOLVER_MAX_NS]; 
    655664    pj_time_val now; 
     
    686695    if (pj_ioqueue_is_pending(resolver->udp_key, &resolver->udp_op_tx_key) 
    687696#if PJ_HAS_IPV6 
    688         || pj_ioqueue_is_pending(resolver->udp6_key, 
    689                                  &resolver->udp6_op_tx_key) 
     697        || (resolver->udp6_key && 
     698            pj_ioqueue_is_pending(resolver->udp6_key, 
     699                                  &resolver->udp6_op_tx_key)) 
    690700#endif 
    691701        ) 
     
    715725 
    716726    /* Send the packet to name servers */ 
     727    send_cnt = 0; 
    717728    for (i=0; i<server_cnt; ++i) { 
    718729        char addr[PJ_INET6_ADDRSTRLEN]; 
     
    726737                                       &ns->addr, 
    727738                                       pj_sockaddr_get_len(&ns->addr)); 
     739            if (status == PJ_SUCCESS || status == PJ_EPENDING) 
     740                send_cnt++; 
    728741        } 
    729742#if PJ_HAS_IPV6 
    730         else { 
     743        else if (resolver->udp6_key) { 
    731744            status = pj_ioqueue_sendto(resolver->udp6_key, 
    732745                                       &resolver->udp6_op_tx_key, 
     
    734747                                       &ns->addr, 
    735748                                       pj_sockaddr_get_len(&ns->addr)); 
     749            if (status == PJ_SUCCESS || status == PJ_EPENDING) 
     750                send_cnt++; 
    736751        } 
    737752#endif 
     753        else { 
     754            continue; 
     755        } 
    738756 
    739757        PJ_PERROR(4,(resolver->name.ptr, status, 
     
    751769        } 
    752770    } 
     771 
     772    if (send_cnt == 0) 
     773        return PJLIB_UTIL_EDNSNOWORKINGNS; 
    753774 
    754775    ++q->transmit_cnt; 
  • pjproject/trunk/pjlib/include/pj/compat/socket.h

    r5312 r5420  
    159159#  define OSERR_ECONNRESET     WSAECONNRESET 
    160160#  define OSERR_ENOTCONN       WSAENOTCONN 
     161#  define OSERR_EAFNOSUPPORT   WSAEAFNOSUPPORT 
    161162#elif defined(PJ_SYMBIAN) && PJ_SYMBIAN!=0 
    162163#  define OSERR_EWOULDBLOCK    -1 
     
    164165#  define OSERR_ECONNRESET     -1 
    165166#  define OSERR_ENOTCONN       -1 
     167#  define OSERR_EAFNOSUPPORT   -1 
    166168#else 
    167169#  define OSERR_EWOULDBLOCK    EWOULDBLOCK 
     
    169171#  define OSERR_ECONNRESET     ECONNRESET 
    170172#  define OSERR_ENOTCONN       ENOTCONN 
     173#  define OSERR_EAFNOSUPPORT   EAFNOSUPPORT 
    171174#endif 
    172175 
Note: See TracChangeset for help on using the changeset viewer.