Quellcode durchsuchen

Eliminated inet_ntoa and inet_ntop. Use getnameinfo() instead.

Tatsuhiro Tsujikawa vor 14 Jahren
Ursprung
Commit
3c73b6e767

+ 0 - 2
configure.ac

@@ -369,8 +369,6 @@ AC_CHECK_FUNCS([__argz_count \
                 gethostbyname \
 		getifaddrs \
                 getpagesize \
-                inet_ntoa \
-                inet_ntop \
                 memchr \
                 memmove \
                 mempcpy \

+ 4 - 14
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";

+ 3 - 1
src/BtSetup.cc

@@ -235,7 +235,9 @@ void BtSetup::setup(std::vector<Command*>& 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;
           }

+ 23 - 0
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<const sockaddr*>(&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<const sockaddr*>(&sa), sizeof(sa),
+                    dst, size, 0, 0, NI_NUMERICHOST);
+  } else {
+    s = EAI_FAMILY;
+  }
+  return s;
+}
+
 } // namespace aria2

+ 5 - 0
src/SocketCore.h

@@ -369,6 +369,11 @@ void getInterfaceAddress
 (std::vector<std::pair<struct sockaddr_storage, socklen_t> >& 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

+ 6 - 19
src/bittorrent_helper.cc

@@ -831,27 +831,14 @@ std::pair<std::string, uint16_t> unpackcompact
 (const unsigned char* compact, int family)
 {
   std::pair<std::string, uint16_t> 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;
 }
 

+ 0 - 8
test/BittorrentHelperTest.cc

@@ -818,7 +818,6 @@ void BittorrentHelperTest::testExtractPeerFromString()
   SharedHandle<ValueBase> str = bencode2::decode(peersstr);
   std::deque<SharedHandle<Peer> > 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<std::string, uint16_t> 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);

+ 0 - 8
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()
 {

+ 0 - 4
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<DHTNode> 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

+ 0 - 4
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<DHTNode> 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

+ 0 - 6
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> 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> peer = peerStorage_->getPeers()[0];
-  CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), peer->getIPAddress());
-#endif // !HAVE_INET_NTOP
 }
 
 } // namespace aria2

+ 0 - 19
test/UTPexExtensionMessageTest.cc

@@ -205,7 +205,6 @@ void UTPexExtensionMessageTest::testCreate()
     UTPexExtensionMessage::create
     (reinterpret_cast<const unsigned char*>(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 = "";