diff --git a/configure.ac b/configure.ac index ce5b52c9..a69e1c42 100644 --- a/configure.ac +++ b/configure.ac @@ -369,8 +369,6 @@ AC_CHECK_FUNCS([__argz_count \ gethostbyname \ getifaddrs \ getpagesize \ - inet_ntoa \ - inet_ntop \ memchr \ memmove \ mempcpy \ diff --git a/src/AsyncNameResolver.cc b/src/AsyncNameResolver.cc index 08055cc5..4cba7a25 100644 --- a/src/AsyncNameResolver.cc +++ b/src/AsyncNameResolver.cc @@ -38,6 +38,7 @@ #include "A2STR.h" #include "LogFactory.h" +#include "SocketCore.h" namespace aria2 { @@ -50,21 +51,10 @@ void callback(void* arg, int status, int timeouts, struct hostent* host) return; } for(char** ap = host->h_addr_list; *ap; ++ap) { -#ifdef HAVE_INET_NTOP - char addrstring[INET6_ADDRSTRLEN]; - const char* dst = - inet_ntop(host->h_addrtype, *ap, addrstring, sizeof(addrstring)); - if(dst) { - resolverPtr->resolvedAddresses_.push_back(dst); + char addrstring[NI_MAXHOST]; + if(inetNtop(host->h_addrtype, *ap, addrstring, sizeof(addrstring)) == 0) { + resolverPtr->resolvedAddresses_.push_back(addrstring); } -#else // !HAVE_INET_NTOP - if(host->h_addrtype != AF_INET) { - continue; - } - struct in_addr addr; - memcpy(&addr, *ap, sizeof(in_addr)); - resolverPtr->resolvedAddresses_.push_back(inet_ntoa(addr)); -#endif // !HAVE_INET_NTOP } if(resolverPtr->resolvedAddresses_.empty()) { resolverPtr->error_ = "address conversion failed"; diff --git a/src/BtSetup.cc b/src/BtSetup.cc index 7c696670..40faa12f 100644 --- a/src/BtSetup.cc +++ b/src/BtSetup.cc @@ -235,7 +235,9 @@ void BtSetup::setup(std::vector& commands, i = ifAddrs.begin(), eoi = ifAddrs.end(); i != eoi; ++i) { sockaddr_in addr; memcpy(&addr, &(*i).first, (*i).second); - if(receiver->init(inet_ntoa(addr.sin_addr))) { + char host[NI_MAXHOST]; + if(inetNtop(AF_INET, &addr.sin_addr, host, sizeof(host)) == 0 && + receiver->init(host)) { initialized = true; break; } diff --git a/src/SocketCore.cc b/src/SocketCore.cc index bd724240..f6ba3f35 100644 --- a/src/SocketCore.cc +++ b/src/SocketCore.cc @@ -1237,4 +1237,27 @@ int callGetaddrinfo return getaddrinfo(host, service, &hints, resPtr); } +int inetNtop(int af, const void* src, char* dst, socklen_t size) +{ + int s; + if(af == AF_INET) { + sockaddr_in sa; + memset(&sa, 0, sizeof(sa)); + sa.sin_family = AF_INET; + memcpy(&sa.sin_addr, src, sizeof(in_addr)); + s = getnameinfo(reinterpret_cast(&sa), sizeof(sa), + dst, size, 0, 0, NI_NUMERICHOST); + } else if(af == AF_INET6) { + sockaddr_in6 sa; + memset(&sa, 0, sizeof(sa)); + sa.sin6_family = AF_INET6; + memcpy(&sa.sin6_addr, src, sizeof(in6_addr)); + s = getnameinfo(reinterpret_cast(&sa), sizeof(sa), + dst, size, 0, 0, NI_NUMERICHOST); + } else { + s = EAI_FAMILY; + } + return s; +} + } // namespace aria2 diff --git a/src/SocketCore.h b/src/SocketCore.h index 2df3efe6..f18653f4 100644 --- a/src/SocketCore.h +++ b/src/SocketCore.h @@ -369,6 +369,11 @@ void getInterfaceAddress (std::vector >& ifAddrs, const std::string& iface, int family = AF_UNSPEC, int aiFlags = 0); +// Provides functionality of inet_ntop using getnameinfo. The return +// value is the exact value of getnameinfo returns. You can get error +// message using gai_strerror(3). +int inetNtop(int af, const void* src, char* dst, socklen_t size); + } // namespace aria2 #endif // D_SOCKET_CORE_H diff --git a/src/bittorrent_helper.cc b/src/bittorrent_helper.cc index 8519995d..85210cff 100644 --- a/src/bittorrent_helper.cc +++ b/src/bittorrent_helper.cc @@ -831,27 +831,14 @@ std::pair unpackcompact (const unsigned char* compact, int family) { std::pair r; -#ifdef HAVE_INET_NTOP int portOffset = family == AF_INET?4:16; - char buf[INET6_ADDRSTRLEN]; - if(!inet_ntop(family, compact, buf, sizeof(buf))) { - return r; + char buf[NI_MAXHOST]; + if(inetNtop(family, compact, buf, sizeof(buf)) == 0) { + r.first = buf; + uint16_t portN; + memcpy(&portN, compact+portOffset, sizeof(portN)); + r.second = ntohs(portN); } - r.first = buf; - uint16_t portN; - memcpy(&portN, compact+portOffset, sizeof(portN)); - r.second = ntohs(portN); -#else // !HAVE_INET_NTOP - if(family != AF_INET) { - return r; - } - struct in_addr addr; - memcpy(&addr, compact, sizeof(in_addr)); - r.first = inet_ntoa(addr); - uint16_t portN; - memcpy(&portN, compact+4, sizeof(portN)); - r.second = ntohs(portN); -#endif // !HAVE_INET_NTOP return r; } diff --git a/test/BittorrentHelperTest.cc b/test/BittorrentHelperTest.cc index c83ab309..651d338b 100644 --- a/test/BittorrentHelperTest.cc +++ b/test/BittorrentHelperTest.cc @@ -818,7 +818,6 @@ void BittorrentHelperTest::testExtractPeerFromString() SharedHandle str = bencode2::decode(peersstr); std::deque > peers; extractPeer(str, AF_INET6, std::back_inserter(peers)); -#ifdef HAVE_INET_NTOP CPPUNIT_ASSERT_EQUAL((size_t)2, peers.size()); CPPUNIT_ASSERT_EQUAL(std::string("1002:1035:4527:3546:7854:1237:3247:3217"), peers[0]->getIPAddress()); @@ -826,9 +825,6 @@ void BittorrentHelperTest::testExtractPeerFromString() CPPUNIT_ASSERT_EQUAL(std::string("2001:db8:bd05:1d2:288a:1fc0:1:10ee"), peers[1]->getIPAddress()); CPPUNIT_ASSERT_EQUAL((uint16_t)6882, peers[1]->getPort()); -#else // !HAVE_INET_NTOP - CPPUNIT_ASSERT_EQUAL((size_t)0, peers.size()); -#endif // !HAVE_INET_NTOP hextext = "c0a800011ae1"; hextext += "c0a800021ae2"; @@ -904,13 +900,9 @@ void BittorrentHelperTest::testUnpackcompact() 0x1A, 0xE1 }; std::pair p = unpackcompact(compact6, AF_INET6); -#ifdef HAVE_INET_NTOP CPPUNIT_ASSERT_EQUAL(std::string("1002:1035:4527:3546:7854:1237:3247:3217"), p.first); CPPUNIT_ASSERT_EQUAL((uint16_t)6881, p.second); -#else // !HAVE_INET_NTOP - CPPUNIT_ASSERT_EQUAL(std::string(), p.first); -#endif // !HAVE_INET_NTOP unsigned char compact[] = { 0xC0, 0xa8, 0x00, 0x01, 0x1A, 0xE1 }; p = unpackcompact(compact, AF_INET); diff --git a/test/DHTMessageFactoryImplTest.cc b/test/DHTMessageFactoryImplTest.cc index 0ef540f2..b330bf9c 100644 --- a/test/DHTMessageFactoryImplTest.cc +++ b/test/DHTMessageFactoryImplTest.cc @@ -31,14 +31,10 @@ class DHTMessageFactoryImplTest:public CppUnit::TestFixture { CPPUNIT_TEST(testCreatePingReplyMessage); CPPUNIT_TEST(testCreateFindNodeMessage); CPPUNIT_TEST(testCreateFindNodeReplyMessage); -#ifdef HAVE_INET_NTOP CPPUNIT_TEST(testCreateFindNodeReplyMessage6); -#endif // HAVE_INET_NTOP CPPUNIT_TEST(testCreateGetPeersMessage); CPPUNIT_TEST(testCreateGetPeersReplyMessage); -#ifdef HAVE_INET_NTOP CPPUNIT_TEST(testCreateGetPeersReplyMessage6); -#endif // HAVE_INET_NTOP CPPUNIT_TEST(testCreateAnnouncePeerMessage); CPPUNIT_TEST(testCreateAnnouncePeerReplyMessage); CPPUNIT_TEST(testReceivedErrorMessage); @@ -208,7 +204,6 @@ void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage() } } -#ifdef HAVE_INET_NTOP void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage6() { factory.reset(new DHTMessageFactoryImpl(AF_INET6)); @@ -260,7 +255,6 @@ void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage6() CPPUNIT_FAIL(e.stackTrace()); } } -#endif // HAVE_INET_NTOP void DHTMessageFactoryImplTest::testCreateGetPeersMessage() { @@ -359,7 +353,6 @@ void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage() } } -#ifdef HAVE_INET_NTOP void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage6() { factory.reset(new DHTMessageFactoryImpl(AF_INET6)); @@ -431,7 +424,6 @@ void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage6() CPPUNIT_FAIL(e.stackTrace()); } } -#endif // HAVE_INET_NTOP void DHTMessageFactoryImplTest::testCreateAnnouncePeerMessage() { diff --git a/test/DHTRoutingTableDeserializerTest.cc b/test/DHTRoutingTableDeserializerTest.cc index 4776b2f5..97290c9c 100644 --- a/test/DHTRoutingTableDeserializerTest.cc +++ b/test/DHTRoutingTableDeserializerTest.cc @@ -20,9 +20,7 @@ class DHTRoutingTableDeserializerTest:public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(DHTRoutingTableDeserializerTest); CPPUNIT_TEST(testDeserialize); -#ifdef HAVE_INET_NTOP CPPUNIT_TEST(testDeserialize6); -#endif // HAVE_INET_NTOP CPPUNIT_TEST_SUITE_END(); public: void setUp() {} @@ -75,7 +73,6 @@ void DHTRoutingTableDeserializerTest::testDeserialize() CPPUNIT_ASSERT(memcmp(nodes[2]->getID(), dsnodes[1]->getID(), DHT_ID_LENGTH) == 0); } -#ifdef HAVE_INET_NTOP void DHTRoutingTableDeserializerTest::testDeserialize6() { SharedHandle localNode(new DHTNode()); @@ -115,6 +112,5 @@ void DHTRoutingTableDeserializerTest::testDeserialize6() CPPUNIT_ASSERT(memcmp(nodes[2]->getID(), dsnodes[1]->getID(), DHT_ID_LENGTH) == 0); } -#endif // HAVE_INET_NTOP } // namespace aria2 diff --git a/test/DHTRoutingTableSerializerTest.cc b/test/DHTRoutingTableSerializerTest.cc index 635fe768..f7fb343f 100644 --- a/test/DHTRoutingTableSerializerTest.cc +++ b/test/DHTRoutingTableSerializerTest.cc @@ -20,9 +20,7 @@ class DHTRoutingTableSerializerTest:public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(DHTRoutingTableSerializerTest); CPPUNIT_TEST(testSerialize); -#ifdef HAVE_INET_NTOP CPPUNIT_TEST(testSerialize6); -#endif // HAVE_INET_NTOP CPPUNIT_TEST_SUITE_END(); private: char zero[256]; @@ -226,7 +224,6 @@ void DHTRoutingTableSerializerTest::testSerialize() CPPUNIT_ASSERT(ss.eof()); } -#ifdef HAVE_INET_NTOP void DHTRoutingTableSerializerTest::testSerialize6() { SharedHandle localNode(new DHTNode()); @@ -316,6 +313,5 @@ void DHTRoutingTableSerializerTest::testSerialize6() CPPUNIT_ASSERT_EQUAL((std::streamsize)0, ss.gcount()); CPPUNIT_ASSERT(ss.eof()); } -#endif // HAVE_INET_NTOP } // namespace aria2 diff --git a/test/DefaultBtAnnounceTest.cc b/test/DefaultBtAnnounceTest.cc index a371fca2..1a1580c4 100644 --- a/test/DefaultBtAnnounceTest.cc +++ b/test/DefaultBtAnnounceTest.cc @@ -405,18 +405,12 @@ void DefaultBtAnnounceTest::testProcessAnnounceResponse() CPPUNIT_ASSERT_EQUAL((time_t)1800, an.getMinInterval()); CPPUNIT_ASSERT_EQUAL((unsigned int)100, an.getComplete()); CPPUNIT_ASSERT_EQUAL((unsigned int)200, an.getIncomplete()); -#ifdef HAVE_INET_NTOP CPPUNIT_ASSERT_EQUAL((size_t)2, peerStorage_->getPeers().size()); SharedHandle peer = peerStorage_->getPeers()[0]; CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), peer->getIPAddress()); peer = peerStorage_->getPeers()[1]; CPPUNIT_ASSERT_EQUAL(std::string("1002:1035:4527:3546:7854:1237:3247:3217"), peer->getIPAddress()); -#else // !HAVE_INET_NTOP - CPPUNIT_ASSERT_EQUAL((size_t)1, peerStorage_->getPeers().size()); - SharedHandle peer = peerStorage_->getPeers()[0]; - CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), peer->getIPAddress()); -#endif // !HAVE_INET_NTOP } } // namespace aria2 diff --git a/test/UTPexExtensionMessageTest.cc b/test/UTPexExtensionMessageTest.cc index 09a8b157..eb0c3178 100644 --- a/test/UTPexExtensionMessageTest.cc +++ b/test/UTPexExtensionMessageTest.cc @@ -205,7 +205,6 @@ void UTPexExtensionMessageTest::testCreate() UTPexExtensionMessage::create (reinterpret_cast(data.c_str()), data.size()); CPPUNIT_ASSERT_EQUAL((uint8_t)1, msg->getExtensionMessageID()); -#ifdef HAVE_INET_NTOP CPPUNIT_ASSERT_EQUAL((size_t)3, msg->getFreshPeers().size()); CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), msg->getFreshPeers()[0]->getIPAddress()); @@ -229,24 +228,6 @@ void UTPexExtensionMessageTest::testCreate() msg->getDroppedPeers()[2]->getIPAddress()); CPPUNIT_ASSERT_EQUAL((uint16_t)6998, msg->getDroppedPeers()[2]->getPort()); -#else // !HAVE_INET_NTOP - CPPUNIT_ASSERT_EQUAL((size_t)2, msg->getFreshPeers().size()); - CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), - msg->getFreshPeers()[0]->getIPAddress()); - CPPUNIT_ASSERT_EQUAL((uint16_t)6881, msg->getFreshPeers()[0]->getPort()); - CPPUNIT_ASSERT_EQUAL(std::string("10.1.1.2"), - msg->getFreshPeers()[1]->getIPAddress()); - CPPUNIT_ASSERT_EQUAL((uint16_t)9999, msg->getFreshPeers()[1]->getPort()); - - CPPUNIT_ASSERT_EQUAL((size_t)2, msg->getDroppedPeers().size()); - CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.2"), - msg->getDroppedPeers()[0]->getIPAddress()); - CPPUNIT_ASSERT_EQUAL((uint16_t)6882, msg->getDroppedPeers()[0]->getPort()); - CPPUNIT_ASSERT_EQUAL(std::string("10.1.1.3"), - msg->getDroppedPeers()[1]->getIPAddress()); - CPPUNIT_ASSERT_EQUAL((uint16_t)10000, - msg->getDroppedPeers()[1]->getPort()); -#endif // !HAVE_INET_NTOP try { // 0 length data std::string in = "";