]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Add IPv4 and IPv6 address reversal to ComboAddress
authorFred Morcos <fred.morcos@open-xchange.com>
Fri, 20 May 2022 10:41:36 +0000 (12:41 +0200)
committerFred Morcos <fred.morcos@open-xchange.com>
Mon, 13 Jun 2022 12:24:23 +0000 (14:24 +0200)
pdns/iputils.hh
pdns/test-iputils_hh.cc

index 7a949f6f2a3829c3246e537978e1ac30bfb8923c..311d9f17e58d831bd19c11c77b7f5c552dccf488 100644 (file)
@@ -283,6 +283,32 @@ union ComboAddress {
       return "invalid "+stringerror();
   }
 
+  [[nodiscard]] string toStringReversed() const
+  {
+    if (isIPv4()) {
+      const auto ip = ntohl(sin4.sin_addr.s_addr);
+      auto a = (ip >> 0) & 0xFF;
+      auto b = (ip >> 8) & 0xFF;
+      auto c = (ip >> 16) & 0xFF;
+      auto d = (ip >> 24) & 0xFF;
+      return std::to_string(a) + "." + std::to_string(b) + "." + std::to_string(c) + "." + std::to_string(d);
+    }
+    else {
+      const auto* addr = &sin6.sin6_addr;
+      std::stringstream res{};
+      res << std::hex;
+      for (int i = 15; i >= 0; i--) {
+        auto byte = addr->s6_addr[i];
+        res << ((byte >> 0) & 0xF) << ".";
+        res << ((byte >> 4) & 0xF);
+        if (i != 0) {
+          res << ".";
+        }
+      }
+      return res.str();
+    }
+  }
+
   string toStringWithPort() const
   {
     if(sin4.sin_family==AF_INET)
index 0d358023df118747d6efab19b1a61e2a354b7ccd..a299fed6e8a46502bfdb21d33b5f12fc62602453 100644 (file)
@@ -162,6 +162,27 @@ BOOST_AUTO_TEST_CASE(test_ComboAddressTruncate) {
   }
 }
 
+BOOST_AUTO_TEST_CASE(test_ComboAddressReverse)
+{
+  ComboAddress a{"1.2.3.4"};
+  BOOST_CHECK_EQUAL(a.toStringReversed(), "4.3.2.1");
+
+  ComboAddress b{"192.168.0.1"};
+  BOOST_CHECK_EQUAL(b.toStringReversed(), "1.0.168.192");
+
+  ComboAddress c{"2001:db8::567:89ab"};
+  BOOST_CHECK_EQUAL(c.toStringReversed(), "b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2");
+
+  ComboAddress d{"::1"};
+  BOOST_CHECK_EQUAL(d.toStringReversed(), "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0");
+
+  ComboAddress e{"ab:cd::10"};
+  BOOST_CHECK_EQUAL(e.toStringReversed(), "0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.c.0.0.b.a.0.0");
+
+  ComboAddress f{"4321:0:1:2:3:4:567:89ab"};
+  BOOST_CHECK_EQUAL(f.toStringReversed(), "b.a.9.8.7.6.5.0.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.1.2.3.4");
+}
+
 BOOST_AUTO_TEST_CASE(test_Mapping)
 {
   ComboAddress lh("::1");