فهرست منبع

FQDN in relay-ip and listener-ip

mom040267 11 سال پیش
والد
کامیت
3465392cc8
1فایلهای تغییر یافته به همراه33 افزوده شده و 10 حذف شده
  1. 33 10
      src/client/ns_turn_ioaddr.c

+ 33 - 10
src/client/ns_turn_ioaddr.c

@@ -218,24 +218,47 @@ int make_ioa_addr(const u08bits* saddr, int port, ioa_addr *addr) {
     addr_hints.ai_next = NULL;
 
     err = getaddrinfo((const char*)saddr, NULL, &addr_hints, &addr_result);
-    if (err != 0) {
+    if ((err != 0)||(!addr_result)) {
       fprintf(stderr,"error resolving '%s' hostname: %s\n",saddr,gai_strerror(err));
       return -1;
     }
     
-    // getaddrinfo() returns a list of address structures. We just take the
-    // first one.
-    ns_bcopy(addr_result->ai_addr, addr, addr_result->ai_addrlen);
-    if (addr_result->ai_family == AF_INET) {
-      addr->s4.sin_port = nswap16(port);
-    } else if (addr_result->ai_family == AF_INET6) {
-      addr->s6.sin6_port = nswap16(port);
+    int family = AF_INET;
+    struct addrinfo *addr_result_orig = addr_result;
+    int found = 0;
+
+    beg_af:
+
+    while(!found && addr_result) {
+
+    	if(addr_result->ai_family == family) {
+    		ns_bcopy(addr_result->ai_addr, addr, addr_result->ai_addrlen);
+    		if (addr_result->ai_family == AF_INET) {
+    			addr->s4.sin_port = nswap16(port);
+#if defined(TURN_HAS_SIN_LEN) /* tested when configured */
+    			addr->s4.sin_len = sizeof(struct sockaddr_in);
+#endif
+    		} else if (addr_result->ai_family == AF_INET6) {
+    			addr->s6.sin6_port = nswap16(port);
 #if defined(SIN6_LEN) /* this define is required by IPv6 if used */
-      addr->s6.sin6_len = sizeof(struct sockaddr_in6);
+    			addr->s6.sin6_len = sizeof(struct sockaddr_in6);
 #endif
+    		} else {
+    			continue;
+    		}
+    		found = 1;
+    	}
+
+    	addr_result = addr_result->ai_next;
+    }
+
+    if(!found && family == AF_INET) {
+    	family = AF_INET6;
+    	addr_result = addr_result_orig;
+    	goto beg_af;
     }
     
-    freeaddrinfo(addr_result);
+    freeaddrinfo(addr_result_orig);
   }
 
   return 0;