Browse Source

2010-10-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Use inet_ntoa if inet_ntop is not available. Since inet_ntoa does
	not handle IPv6 address, IPv6 support is limited in this
	case. Fixed unit test error under mingw32.
	* configure.ac
	* src/AsyncNameResolver.cc
	* src/SocketCore.cc
	* src/bittorrent_helper.cc
	* test/BittorrentHelperTest.cc
	* test/DHTMessageFactoryImplTest.cc
	* test/DHTRoutingTableDeserializerTest.cc
	* test/DHTRoutingTableSerializerTest.cc
	* test/DefaultBtAnnounceTest.cc
	* test/Metalink2RequestGroupTest.cc
	* test/UTPexExtensionMessageTest.cc
Tatsuhiro Tsujikawa 15 years ago
parent
commit
5db7b123b5

+ 17 - 0
ChangeLog

@@ -1,3 +1,20 @@
+2010-10-04  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Use inet_ntoa if inet_ntop is not available. Since inet_ntoa does
+	not handle IPv6 address, IPv6 support is limited in this
+	case. Fixed unit test error under mingw32.
+	* configure.ac
+	* src/AsyncNameResolver.cc
+	* src/SocketCore.cc
+	* src/bittorrent_helper.cc
+	* test/BittorrentHelperTest.cc
+	* test/DHTMessageFactoryImplTest.cc
+	* test/DHTRoutingTableDeserializerTest.cc
+	* test/DHTRoutingTableSerializerTest.cc
+	* test/DefaultBtAnnounceTest.cc
+	* test/Metalink2RequestGroupTest.cc
+	* test/UTPexExtensionMessageTest.cc
+
 2010-10-03  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Reverted the previous change in src/MultiUrlRequestInfo.cc.

+ 3 - 0
config.h.in

@@ -195,6 +195,9 @@
 /* Define to 1 if you have the `inet_ntoa' function. */
 #undef HAVE_INET_NTOA
 
+/* Define to 1 if you have the `inet_ntop' function. */
+#undef HAVE_INET_NTOP
+
 /* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
 #undef HAVE_INTMAX_T
 

+ 1 - 0
configure

@@ -14701,6 +14701,7 @@ for ac_func in __argz_count \
 		getifaddrs \
                 getpagesize \
                 inet_ntoa \
+                inet_ntop \
                 memchr \
                 memmove \
                 mempcpy \

+ 1 - 0
configure.ac

@@ -316,6 +316,7 @@ AC_CHECK_FUNCS([__argz_count \
 		getifaddrs \
                 getpagesize \
                 inet_ntoa \
+                inet_ntop \
                 memchr \
                 memmove \
                 mempcpy \

+ 10 - 1
src/AsyncNameResolver.cc

@@ -53,15 +53,24 @@ 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);
     }
+#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_ = "inet_ntop failed";
+    resolverPtr->error_ = "address conversion failed";
     resolverPtr->status_ = AsyncNameResolver::STATUS_ERROR;
   } else {
     resolverPtr->status_ = AsyncNameResolver::STATUS_SUCCESS;

+ 2 - 0
src/SocketCore.cc

@@ -200,6 +200,7 @@ static sock_t bindInternal(int family, int socktype, int protocol,
     CLOSE(fd);
     return -1;
   }
+#ifdef IPV6_V6ONLY
   if(family == AF_INET6) {
     int sockopt = 1;
     if(setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (a2_sockopt_t) &sockopt,
@@ -208,6 +209,7 @@ static sock_t bindInternal(int family, int socktype, int protocol,
       return -1;
     }
   }
+#endif // IPV6_V6ONLY
   if(::bind(fd, addr, addrlen) == -1) {
     error = errorMsg();
     CLOSE(fd);

+ 13 - 1
src/bittorrent_helper.cc

@@ -838,8 +838,9 @@ int packcompact
 std::pair<std::string, uint16_t> unpackcompact
 (const unsigned char* compact, int family)
 {
-  int portOffset = family == AF_INET?4:16;
   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;
@@ -848,6 +849,17 @@ std::pair<std::string, uint16_t> unpackcompact
   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;
 }
 

+ 8 - 0
test/BittorrentHelperTest.cc

@@ -816,6 +816,7 @@ 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());
@@ -823,6 +824,9 @@ 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";
@@ -898,9 +902,13 @@ 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);

+ 8 - 0
test/DHTMessageFactoryImplTest.cc

@@ -31,10 +31,14 @@ 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);
@@ -204,6 +208,7 @@ void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage()
   }
 }
 
+#ifdef HAVE_INET_NTOP
 void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage6()
 {
   factory.reset(new DHTMessageFactoryImpl(AF_INET6));
@@ -255,6 +260,7 @@ void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage6()
     CPPUNIT_FAIL(e.stackTrace());
   }
 }
+#endif // HAVE_INET_NTOP
 
 void DHTMessageFactoryImplTest::testCreateGetPeersMessage()
 {
@@ -353,6 +359,7 @@ void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage()
   }
 }
 
+#ifdef HAVE_INET_NTOP
 void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage6()
 {
   factory.reset(new DHTMessageFactoryImpl(AF_INET6));
@@ -424,6 +431,7 @@ void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage6()
     CPPUNIT_FAIL(e.stackTrace());
   }
 }
+#endif // HAVE_INET_NTOP
 
 void DHTMessageFactoryImplTest::testCreateAnnouncePeerMessage()
 {

+ 4 - 0
test/DHTRoutingTableDeserializerTest.cc

@@ -20,7 +20,9 @@ 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() {}
@@ -73,6 +75,7 @@ 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());
@@ -112,5 +115,6 @@ void DHTRoutingTableDeserializerTest::testDeserialize6()
   CPPUNIT_ASSERT(memcmp(nodes[2]->getID(), dsnodes[1]->getID(),
                         DHT_ID_LENGTH) == 0);
 }
+#endif // HAVE_INET_NTOP
 
 } // namespace aria2

+ 4 - 0
test/DHTRoutingTableSerializerTest.cc

@@ -20,7 +20,9 @@ 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];
@@ -222,6 +224,7 @@ void DHTRoutingTableSerializerTest::testSerialize()
   CPPUNIT_ASSERT(ss.eof());
 }
 
+#ifdef HAVE_INET_NTOP
 void DHTRoutingTableSerializerTest::testSerialize6()
 {
   SharedHandle<DHTNode> localNode(new DHTNode());
@@ -309,5 +312,6 @@ void DHTRoutingTableSerializerTest::testSerialize6()
   CPPUNIT_ASSERT_EQUAL((std::streamsize)0, ss.gcount());
   CPPUNIT_ASSERT(ss.eof());
 }
+#endif // HAVE_INET_NTOP
 
 } // namespace aria2

+ 6 - 0
test/DefaultBtAnnounceTest.cc

@@ -393,12 +393,18 @@ 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

+ 3 - 3
test/Metalink2RequestGroupTest.cc

@@ -215,15 +215,15 @@ void Metalink2RequestGroupTest::testGenerate_dosDirTraversal()
   CPPUNIT_ASSERT_EQUAL((size_t)3, groups.size());
   SharedHandle<RequestGroup> rg = groups[0];
   SharedHandle<FileEntry> file = rg->getDownloadContext()->getFirstFileEntry();
-  CPPUNIT_ASSERT_EQUAL(std::string("/tmp/.._.._example.ext"),
+  CPPUNIT_ASSERT_EQUAL(std::string("/tmp/..%5C..%5Cexample.ext"),
                        file->getPath());
   
   rg = groups[2];
   file = rg->getDownloadContext()->getFileEntries()[0];
-  CPPUNIT_ASSERT_EQUAL(std::string("/tmp/.._.._file1.ext"),
+  CPPUNIT_ASSERT_EQUAL(std::string("/tmp/..%5C..%5Cfile1.ext"),
                        file->getPath());
   file = rg->getDownloadContext()->getFileEntries()[1];
-  CPPUNIT_ASSERT_EQUAL(std::string("/tmp/.._.._file2.ext"),
+  CPPUNIT_ASSERT_EQUAL(std::string("/tmp/..%5C..%5Cfile2.ext"),
                        file->getPath());
 #endif // ENABLE_BITTORRENT
 #endif // __MINGW32__

+ 18 - 1
test/UTPexExtensionMessageTest.cc

@@ -204,8 +204,8 @@ void UTPexExtensionMessageTest::testCreate()
   SharedHandle<UTPexExtensionMessage> msg =
     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,7 +229,24 @@ 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 = "";