]> jfr.im git - irc/UndernetIRC/gnuworld.git/commitdiff
Fix for IPCIDRMinIP function
authorSeven-7 <redacted>
Sun, 19 Aug 2018 20:46:18 +0000 (21:46 +0100)
committerSeven-7 <redacted>
Sun, 19 Aug 2018 20:46:18 +0000 (21:46 +0100)
include/Numeric.h
libgnuworld/misc.cc

index 36c2171a06b3c0730510cbfa8a7a7d9ffb502e1e..dbca0c33d2e66f5266cba95ba649b2e12deea038 100644 (file)
@@ -763,11 +763,27 @@ inline std::string print_irc_in_addr(const irc_in_addr& IP)
 }
 /////// Test functions end ////////
 
-inline irc_in_addr irc_IPCIDRMinIP(const std::string& IP, unsigned CClonesCIDR = 120)
+//inline irc_in_addr irc_IPCIDRMinIP(const std::string& IP, unsigned CClonesCIDR = 120)
+//{
+//     unsigned char maskbits;
+//     irc_in_addr ircip;
+//     ipmask_parse(IP.c_str(), &ircip, &maskbits);
+//     unsigned int quot = (128 - CClonesCIDR)/16;
+//     unsigned int rem = (128 - CClonesCIDR) % 16;
+//     unsigned int i;
+//     for (i = 0; i < quot; i++)
+//             ircip.in6_16[7-i] = 0;
+//     if (CClonesCIDR == 0)  /* We have i=8 here. Not something we want, do we?  */
+//             i--;
+//     unsigned short ip16 = ntohs(ircip.in6_16[7-i]);
+//     ip16 >>= rem;
+//     ip16 <<= rem;
+//     ircip.in6_16[7-i] = htons(ip16);
+//     return ircip;
+//}
+
+inline irc_in_addr irc_in6_CIDRMinIP(irc_in_addr ircip, unsigned CClonesCIDR = 120)
 {
-       unsigned char maskbits;
-       irc_in_addr ircip;
-       ipmask_parse(IP.c_str(), &ircip, &maskbits);
        unsigned int quot = (128 - CClonesCIDR)/16;
        unsigned int rem = (128 - CClonesCIDR) % 16;
        unsigned int i;
@@ -782,12 +798,22 @@ inline irc_in_addr irc_IPCIDRMinIP(const std::string& IP, unsigned CClonesCIDR =
        return ircip;
 }
 
-inline std::string IPCIDRMinIP(const std::string& IP, unsigned CClonesCIDR = 120)
+inline std::string IPCIDRMinIP(irc_in_addr ircip, unsigned CClonesCIDR = 120)
 {
-       irc_in_addr ip6 = irc_IPCIDRMinIP(IP, CClonesCIDR);
+       irc_in_addr ip6 = irc_in6_CIDRMinIP(ircip, CClonesCIDR);
        return (std::string)ircd_ntoa(&ip6);
 }
 
+inline std::string IPCIDRMinIP(const std::string& IP, unsigned CClonesCIDR = 120)
+{
+       irc_in_addr ircip;
+       unsigned char ipmask_len;
+       if (!ipmask_parse(IP.c_str(), &ircip, &ipmask_len))
+               return std::string();
+
+       return IPCIDRMinIP(ircip,CClonesCIDR);
+}
+
 } // namespace gnuworld
 
 #endif // __NUMERIC_H
index 711da0d8ac311b3e7046f70395656158a68e5088..0b7f4820615785b1afef78d59b8706804b92a677 100644 (file)
@@ -390,7 +390,7 @@ unsigned char fixToCIDR64(string& strIP)
 
        if (((ipmask_len >= 16) && (!IsIPv4)) || ((ipmask_len >= 96) && (IsIPv4)))
        {
-               strIP = IPCIDRMinIP(strIP.c_str(), unsigned(ipmask_len));
+               strIP = IPCIDRMinIP(ip, ipmask_len);
                if (IsIPv4)
                { //adjust to 32 bit, if we have a IPv4/32 we don't want to show /32
                        if (ipmask_len < 128)