From 9fad3ecb9215a0034bf407f192926b04cb5efaed Mon Sep 17 00:00:00 2001 From: danieldg Date: Sat, 24 Oct 2009 20:04:05 +0000 Subject: Create irc::sockets::cidr_mask git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11968 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/socket.h | 72 +++++++++++++++++++++++++-------------------------- include/usermanager.h | 2 +- include/users.h | 2 +- 3 files changed, 38 insertions(+), 38 deletions(-) (limited to 'include') diff --git a/include/socket.h b/include/socket.h index ef6edbbca..b012cf62a 100644 --- a/include/socket.h +++ b/include/socket.h @@ -45,38 +45,43 @@ namespace irc */ namespace sockets { - - typedef union { + union CoreExport sockaddrs { struct sockaddr sa; struct sockaddr_in in4; struct sockaddr_in6 in6; - } sockaddrs; - - /** Match raw binary data using CIDR rules. - * - * This function will use binary comparison to compare the - * two bit sequences, address and mask, up to mask_bits - * bits in size. If they match, it will return true. - * @param address The whole address, of 4 or 16 bytes in length - * @param mask The mask, from 1 to 16 bytes in length, anything - * from 1 to 128 bits of which is significant - * @param mask_Bits How many bits of the mask parameter are significant - * for this comparison. - * @returns True if the first mask_bits of address matches the first - * mask_bits of mask. - */ - CoreExport bool MatchCIDRBits(const unsigned char* address, const unsigned char* mask, unsigned int mask_bits); - - /** Match CIDR, without matching username/nickname parts. - * - * This function will compare a human-readable address against a human- - * readable CIDR mask, for example 1.2.3.4 against 1.2.0.0/16. This - * method supports both IPV4 and IPV6 addresses. - * @param address The human readable address, e.g. 1.2.3.4 - * @param cidr_mask The human readable mask, e.g. 1.2.0.0/16 - * @return True if the mask matches the address - */ - CoreExport bool MatchCIDR(const std::string &address, const std::string &cidr_mask); + /** Return the size of the structure for syscall passing */ + int sa_size() const; + /** Return port number or -1 if invalid */ + int port() const; + /** Return IP only */ + std::string addr() const; + /** Return human-readable IP/port pair */ + std::string str() const; + }; + + struct cidr_mask + { + /** Type, AF_INET or AF_INET6 */ + unsigned char type; + /** Length of the mask in bits (0-128) */ + unsigned char length; + /** Raw bits. Unused bits must be zero */ + unsigned char bits[16]; + + cidr_mask() {} + /** Construct a CIDR mask from the string. Will normalize (127.0.0.1/8 => 127.0.0.0/8). */ + cidr_mask(const std::string& mask); + /** Construct a CIDR mask of a given length from the given address */ + cidr_mask(const irc::sockets::sockaddrs& addr, int len); + /** Equality of bits, type, and length */ + bool operator==(const cidr_mask& other) const; + /** Ordering defined for maps */ + bool operator<(const cidr_mask& other) const; + /** Match within this CIDR? */ + bool match(const irc::sockets::sockaddrs& addr) const; + /** Human-readable string */ + std::string str() const; + }; /** Match CIDR, including an optional username/nickname part. * @@ -99,7 +104,7 @@ namespace irc CoreExport int OpenTCPSocket(const std::string& addr, int socktype = SOCK_STREAM); /** Return the size of the structure for syscall passing */ - CoreExport int sa_size(const irc::sockets::sockaddrs& sa); + inline int sa_size(const irc::sockets::sockaddrs& sa) { return sa.sa_size(); } /** Convert an address-port pair into a binary sockaddr * @param addr The IP address, IPv4 or IPv6 @@ -122,12 +127,7 @@ namespace irc * @param sa The structure to convert * @return The string; "" if not a valid address */ - CoreExport std::string satouser(const irc::sockets::sockaddrs& sa); - - /** Create a CIDR mask from the given address, of length - * Result will be of the form 192.0.5.0/24 or 2001:af35::/48 - */ - CoreExport std::string mask(irc::sockets::sockaddrs sa, unsigned int range); + inline std::string satouser(const irc::sockets::sockaddrs& sa) { return sa.str(); } } } diff --git a/include/usermanager.h b/include/usermanager.h index 97277f3fb..eb3317b63 100644 --- a/include/usermanager.h +++ b/include/usermanager.h @@ -17,7 +17,7 @@ #include /** A list of ip addresses cross referenced against clone counts */ -typedef std::map clonemap; +typedef std::map clonemap; class CoreExport UserManager { diff --git a/include/users.h b/include/users.h index de69f6383..0fc6e3723 100644 --- a/include/users.h +++ b/include/users.h @@ -364,7 +364,7 @@ class CoreExport User : public StreamSocket /** Get CIDR mask, using default range, for this user */ - irc::string GetCIDRMask(); + irc::sockets::cidr_mask GetCIDRMask(); /** Sets the client IP for this user * @return true if the conversion was successful -- cgit v1.2.3