X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FIPAddressV6.cpp;h=6f1eb5958996c5f12bb16204a6c2a3398ddf26de;hp=203d14a88489746e77195a6d7ebdedcab266aee1;hb=14d85244f8b72912c44ff43ccdd5e55c0b84c9e2;hpb=b41eb6f0aa3c97a31df39cfcacd6a1a46ed976b6 diff --git a/folly/IPAddressV6.cpp b/folly/IPAddressV6.cpp index 203d14a8..6f1eb595 100644 --- a/folly/IPAddressV6.cpp +++ b/folly/IPAddressV6.cpp @@ -173,6 +173,34 @@ void IPAddressV6::setFromBinary(ByteRange bytes) { scope_ = 0; } +// static +IPAddressV6 IPAddressV6::fromInverseArpaName(const std::string& arpaname) { + auto piece = StringPiece(arpaname); + if (!piece.removeSuffix(".ip6.arpa")) { + throw IPAddressFormatException(sformat( + "Invalid input. Should end with 'ip6.arpa'. Got '{}'", arpaname)); + } + std::vector pieces; + split(".", piece, pieces); + if (pieces.size() != 32) { + throw IPAddressFormatException(sformat("Invalid input. Got '{}'", piece)); + } + std::array ip; + size_t pos = 0; + int count = 0; + for (size_t i = 1; i <= pieces.size(); i++) { + ip[pos] = pieces[pieces.size() - i][0]; + pos++; + count++; + // add ':' every 4 chars + if (count == 4 && pos < ip.size()) { + ip[pos++] = ':'; + count = 0; + } + } + return IPAddressV6(folly::range(ip)); +} + // public IPAddressV4 IPAddressV6::createIPv4() const { if (!isIPv4Mapped()) {