]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/cidr.cpp
Introduce "X" snomask for remote *:line messages [patch by jackmcbarn]
[user/henk/code/inspircd.git] / src / cidr.cpp
index 90654ee820e70da4a5d95c27bd4c8dc00868cb49..d38056b0298195e46679637c9b51b2f05b0a8fb1 100644 (file)
@@ -2,8 +2,8 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * See: http://wiki.inspircd.org/Credits
  *
  * This program is free but copyrighted software; see
  *            the file COPYING for details.
  * ---------------------------------------------------
  */
 
-/* $Core: libIRCDcidr */
+/* $Core */
 
 #include "inspircd.h"
-#include "wildcard.h"
 
 /* Used when comparing CIDR masks for the modulus bits left over.
  * A lot of ircd's seem to do this:
@@ -91,7 +90,7 @@ bool irc::sockets::MatchCIDR(const std::string &address, const std::string &cidr
                         * symbols, and recursively call MatchCIDR without
                         * username matching enabled to match the host part.
                         */
-                       return (match(address.substr(0, username_addr_pos), cidr_mask.substr(0, username_mask_pos)) &&
+                       return (InspIRCd::Match(address.substr(0, username_addr_pos), cidr_mask.substr(0, username_mask_pos), ascii_case_insensitive_map) &&
                                        MatchCIDR(address.substr(username_addr_pos + 1), cidr_mask.substr(username_mask_pos + 1), false));
                }
                else
@@ -100,6 +99,11 @@ bool irc::sockets::MatchCIDR(const std::string &address, const std::string &cidr
                        cidr_copy = cidr_mask.substr(username_mask_pos + 1);
                }
        }
+       else
+       {
+               address_copy.assign(address);
+               cidr_copy.assign(cidr_mask);
+       }
 
        in_addr  address_in4;
        in_addr  mask_in4;
@@ -109,6 +113,7 @@ bool irc::sockets::MatchCIDR(const std::string &address, const std::string &cidr
        if (bits_chars != std::string::npos)
        {
                bits = atoi(cidr_copy.substr(bits_chars + 1).c_str());
+               cidr_copy.erase(bits_chars, cidr_copy.length() - bits_chars);
        }
        else
        {
@@ -116,7 +121,6 @@ bool irc::sockets::MatchCIDR(const std::string &address, const std::string &cidr
                return false;
        }
 
-#ifdef SUPPORT_IP6LINKS
        in6_addr address_in6;
        in6_addr mask_in6;
 
@@ -138,9 +142,7 @@ bool irc::sockets::MatchCIDR(const std::string &address, const std::string &cidr
                        return false;
                }
        }
-       else
-#endif
-       if (inet_pton(AF_INET, address_copy.c_str(), &address_in4) > 0)
+       else if (inet_pton(AF_INET, address_copy.c_str(), &address_in4) > 0)
        {
                if (inet_pton(AF_INET, cidr_copy.c_str(), &mask_in4) > 0)
                {