| 
					
				 | 
			
			
				@@ -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; 
			 |