- } 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;
+ bool operator==(const sockaddrs& other) const;
+ inline bool operator!=(const sockaddrs& other) const { return !(*this == other); }
+ };
+
+ struct CoreExport 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;
+ };