summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2016-07-03 13:29:27 -0400
committerAdam <Adam@anope.org>2016-07-03 13:29:27 -0400
commit8dc687b657205abefeb1a779ea42070721252e14 (patch)
tree3be15fa06f97359c4523000ec496cab9c93af678
parent18fc11398435a84a77219dc7332bed6e38c850d7 (diff)
#1682: store aftype with masks and include cidrs in GetNUHMask
-rw-r--r--include/modes.h1
-rw-r--r--include/sockets.h4
-rw-r--r--src/modes.cpp28
-rw-r--r--src/sockets.cpp5
4 files changed, 30 insertions, 8 deletions
diff --git a/include/modes.h b/include/modes.h
index b4290e97f..03f6f8a58 100644
--- a/include/modes.h
+++ b/include/modes.h
@@ -395,6 +395,7 @@ class CoreExport Entry
Anope::string mask;
public:
unsigned short cidr_len;
+ int family;
Anope::string nick, user, host, real;
/** Constructor
diff --git a/include/sockets.h b/include/sockets.h
index f49d6c3ff..89ca79dde 100644
--- a/include/sockets.h
+++ b/include/sockets.h
@@ -38,6 +38,10 @@ union CoreExport sockaddrs
*/
void clear();
+ /** Get address family.
+ */
+ int family() const;
+
/** Get the size of the sockaddr we represent
* @return The size
*/
diff --git a/src/modes.cpp b/src/modes.cpp
index 6760a610e..229945b7d 100644
--- a/src/modes.cpp
+++ b/src/modes.cpp
@@ -742,7 +742,7 @@ void ModeManager::StackerDel(Mode *m)
}
}
-Entry::Entry(const Anope::string &m, const Anope::string &fh) : name(m), mask(fh), cidr_len(0)
+Entry::Entry(const Anope::string &m, const Anope::string &fh) : name(m), mask(fh), cidr_len(0), family(0)
{
Anope::string n, u, h;
@@ -802,14 +802,13 @@ Entry::Entry(const Anope::string &m, const Anope::string &fh) : name(m), mask(fh
if (addr.valid() && cidr_range.is_pos_number_only())
{
this->cidr_len = convertTo<unsigned short>(cidr_range);
- /* If we got here, cidr_len is a valid number.
- * If cidr_len is >32 (or 128) it is handled later in
- * cidr::match
- */
+
+ /* If we got here, cidr_len is a valid number. */
this->host = cidr_ip;
+ this->family = addr.family();
- Log(LOG_DEBUG) << "Ban " << m << " has cidr " << this->cidr_len;
+ Log(LOG_DEBUG) << "Ban " << mask << " has cidr " << this->cidr_len;
}
}
catch (const ConvertException &) { }
@@ -830,8 +829,21 @@ const Anope::string Entry::GetNUHMask() const
Anope::string n = nick.empty() ? "*" : nick,
u = user.empty() ? "*" : user,
h = host.empty() ? "*" : host,
- r = real.empty() ? "" : "#" + real;
- return n + "!" + u + "@" + h + r;
+ r = real.empty() ? "" : "#" + real,
+ c;
+ switch (family)
+ {
+ case AF_INET:
+ if (cidr_len <= 32)
+ c = "/" + stringify(cidr_len);
+ break;
+ case AF_INET6:
+ if (cidr_len <= 128)
+ c = "/" + stringify(cidr_len);
+ break;
+ }
+
+ return n + "!" + u + "@" + h + c + r;
}
bool Entry::Matches(User *u, bool full) const
diff --git a/src/sockets.cpp b/src/sockets.cpp
index 272760f45..f15f0ccbd 100644
--- a/src/sockets.cpp
+++ b/src/sockets.cpp
@@ -39,6 +39,11 @@ void sockaddrs::clear()
memset(this, 0, sizeof(*this));
}
+int sockaddrs::family() const
+{
+ return sa.sa_family;
+}
+
size_t sockaddrs::size() const
{
switch (sa.sa_family)