commit 23ffbf3a02eb3d4c1835d4158bbf6a3c527ecb01
parent 9af3b2d01aa25ee92f0e0aa9606e0ee65c2164b8
Author: mrbesen <y.g.2@gmx.de>
Date:   Thu, 22 Sep 2022 17:33:27 +0200
add possible hint to resolve (ipv4 for windows ICMPping only)
Diffstat:
4 files changed, 31 insertions(+), 19 deletions(-)
diff --git a/httping.c b/httping.c
@@ -80,7 +80,7 @@ void DoHTTPing( const char * addy, double minperiod, int * seqnoptr, volatile do
 	/* gethostbyname: get the server's DNS entry */
 	serveraddr_len = sizeof(serveraddr);
 	*getting_host_by_name = 1;
-	serverresolve = resolveName((struct sockaddr*) &serveraddr, &serveraddr_len, hostname);
+	serverresolve = resolveName((struct sockaddr*) &serveraddr, &serveraddr_len, hostname, AF_UNSPEC);
 	*getting_host_by_name = 0;
 
 	if (serverresolve != 1) {
diff --git a/ping.c b/ping.c
@@ -54,7 +54,7 @@ void ping_setup(const char * strhost, const char * device)
 {
 	// resolve host
 	psaddr_len = sizeof(psaddr);
-	resolveName((struct sockaddr*) &psaddr, &psaddr_len, strhost);
+	resolveName((struct sockaddr*) &psaddr, &psaddr_len, strhost, AF_INET); // only resolve ipv4 on windows
 
 	s_disp = OGCreateSema();
 	s_ping = OGCreateSema();
@@ -133,7 +133,7 @@ void ping(struct sockaddr *addr, socklen_t addr_len )
 	{
 		// ipv6 ICMP Ping is not supported on windows
 		ERRM( "ERROR: ipv6 ICMP Ping is not supported on windows\n" );
-		return;
+		exit( -1 );
 	}
 
 	//Launch pinger threads
@@ -463,7 +463,7 @@ void ping_setup(const char * strhost, const char * device)
 #else
 	// resolve host
 	psaddr_len = sizeof(psaddr);
-	resolveName((struct sockaddr*) &psaddr, &psaddr_len, strhost);
+	resolveName((struct sockaddr*) &psaddr, &psaddr_len, strhost, AF_UNSPEC);
 
 	sd = createSocket();
 
diff --git a/resolve.c b/resolve.c
@@ -15,7 +15,7 @@
 	#include <netdb.h>
 #endif
 
-int resolveName(struct sockaddr* addr, socklen_t* addr_len, const char* hostname)
+int resolveName(struct sockaddr* addr, socklen_t* addr_len, const char* hostname, int family)
 {
 	int result;
 	struct addrinfo* res = NULL;
@@ -24,25 +24,36 @@ int resolveName(struct sockaddr* addr, socklen_t* addr_len, const char* hostname
 	memset(addr, 0, *addr_len);
 
 	// try to parse ipv4
-	result = inet_pton(AF_INET, hostname, &((struct sockaddr_in*) addr)->sin_addr);
-	if(result == 1)
-	{
-		addr->sa_family = AF_INET;
-		*addr_len = sizeof(struct sockaddr_in);
-		return 1;
+	if(family == AF_UNSPEC || family == AF_INET) {
+		result = inet_pton(AF_INET, hostname, &((struct sockaddr_in*) addr)->sin_addr);
+		if(result == 1)
+		{
+			addr->sa_family = AF_INET;
+			*addr_len = sizeof(struct sockaddr_in);
+			return 1;
+		}
 	}
 
 	// try to parse ipv6
-	result = inet_pton(AF_INET6, hostname, &((struct sockaddr_in6*) addr)->sin6_addr);
-	if(result == 1)
-	{
-		addr->sa_family = AF_INET6;
-		*addr_len = sizeof(struct sockaddr_in6);
-		return 1;
+	if(family == AF_UNSPEC || family == AF_INET6) {
+		result = inet_pton(AF_INET6, hostname, &((struct sockaddr_in6*) addr)->sin6_addr);
+		if(result == 1)
+		{
+			addr->sa_family = AF_INET6;
+			*addr_len = sizeof(struct sockaddr_in6);
+			return 1;
+		}
 	}
 
 	// try to resolve DNS
-	result = getaddrinfo(hostname, NULL, NULL, &res);
+	struct addrinfo hints;
+	memset(&hints, 0, sizeof(struct addrinfo));
+	hints.ai_family = family; // AF_UNSPEC, AF_INET, AF_INET6
+	hints.ai_socktype = 0; // 0 = any, SOCK_STREAM, SOCK_DGRAM
+	hints.ai_protocol = 0; // 0 = any
+	hints.ai_flags = 0; // no flags
+
+	result = getaddrinfo(hostname, NULL, &hints, &res);
 	if( result != 0)
 	{
 		ERRM( "Error: cannot resolve hostname %s: %s\n", hostname, gai_strerror(result) );
diff --git a/resolve.h b/resolve.h
@@ -13,6 +13,7 @@
 //  * as ipv6 notation (abcd:ef00::1)
 //  * as hostname (resolve DNS)
 // returns 1 on success
-int resolveName(struct sockaddr* addr, socklen_t* addr_len, const char* hostname);
+// family can be used to force ipv4 or ipv6. Use AF_UNSPEC (allow both), AF_INET or AF_INET6 to force ipv4 or ipv6
+int resolveName(struct sockaddr* addr, socklen_t* addr_len, const char* hostname, int family);
 
 #endif