Hi,

I didn't come up with a patch, the code is quite overwhelming... however, 
please find in attachment a simple C++ program that shows the problem.

Thanks, Joost Damad
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

#include <string>
#include <iostream>
#include <cassert>
#include <cstring>
#include <sstream>

static std::string toString(const struct in6_addr &addr) {
	char buf[INET6_ADDRSTRLEN + 1];
	if (inet_ntop(AF_INET6, &addr, buf, INET6_ADDRSTRLEN) == 0) {
		throw "fail";
	}
	std::string s(buf);
	return s;
}


static bool test_resolve(const std::string &addr, int flags, struct in6_addr &addr2) {

	struct addrinfo hints;
	struct addrinfo *result;

	memset(&hints, 0, sizeof(struct addrinfo));
	hints.ai_family = AF_INET6;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = 0; /* Any protocol */
	hints.ai_canonname = NULL;
	hints.ai_addr = NULL;
	hints.ai_next = NULL;
	hints.ai_flags = flags;

	int s = getaddrinfo(addr.c_str(), 0, &hints, &result);
	if (s != 0) {
		std::stringstream ss;
		ss << addr << " : " << gai_strerror(s);
		std::string str = ss.str();
		return false;
	}
	if (result == 0) {
		return false;
	}
	assert(result->ai_family == AF_INET6);
	assert(result->ai_addrlen == sizeof(struct sockaddr_in6));
	addr2 =
			((struct sockaddr_in6 *) result->ai_addr)->sin6_addr;
	freeaddrinfo(result);
	return true;
}

int main(int argc, char **argv) {
	struct in6_addr addr;
	if (test_resolve("localhost", AI_V4MAPPED, addr)) {
		std::cout << "resolved: " << toString(addr) << std::endl;
	} else {
		std::cout << "failed!" << std::endl;
	}
	if (test_resolve("localhost", AI_V4MAPPED | AI_ALL, addr)) {
		std::cout << "resolved: " << toString(addr) << std::endl;
	} else {
		std::cout << "failed!" << std::endl;
	}
	if (test_resolve("www.damad.be", AI_V4MAPPED, addr)) {
		std::cout << "resolved: " << toString(addr) << std::endl;
	} else {
		std::cout << "failed!" << std::endl;
	}
	if (test_resolve("www.damad.be", AI_V4MAPPED | AI_ALL, addr)) {
		std::cout << "resolved: " << toString(addr) << std::endl;
	} else {
		std::cout << "failed!" << std::endl;
	}

}

Reply via email to