summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2016-10-06 14:36:41 -0400
committerAdam <Adam@anope.org>2016-10-06 14:36:41 -0400
commit7a5c4e55991a8b884c1a2f4b00fd2e6f5297c0d6 (patch)
treef5c4c6c61d22a0c04f82b9ad4813789526a48f82
parentd280234e14974c7db1c243b8c30caa63d82bd396 (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.cpp24
-rw-r--r--src/sockets.cpp5
4 files changed, 27 insertions, 7 deletions
diff --git a/include/modes.h b/include/modes.h
index e097f137e..706b0b716 100644
--- a/include/modes.h
+++ b/include/modes.h
@@ -352,6 +352,7 @@ class CoreExport Entry
Anope::string mask;
public:
unsigned short cidr_len;
+ int family = 0;
Anope::string nick, user, host, real;
/** Constructor
diff --git a/include/sockets.h b/include/sockets.h
index ac6dc8cbc..afc335c4f 100644
--- a/include/sockets.h
+++ b/include/sockets.h
@@ -45,6 +45,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 065558747..b41bece1d 100644
--- a/src/modes.cpp
+++ b/src/modes.cpp
@@ -836,14 +836,11 @@ 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
- */
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 &) { }
@@ -864,8 +861,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 + r + c;
}
bool Entry::Matches(User *u, bool full) const
diff --git a/src/sockets.cpp b/src/sockets.cpp
index d4a4f95dc..70c9fef0d 100644
--- a/src/sockets.cpp
+++ b/src/sockets.cpp
@@ -47,6 +47,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)