summaryrefslogtreecommitdiff
path: root/src/users.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/users.cpp')
-rw-r--r--src/users.cpp113
1 files changed, 28 insertions, 85 deletions
diff --git a/src/users.cpp b/src/users.cpp
index f210ed470..44dd9b0f2 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -107,9 +107,7 @@ void User::StartDNSLookup()
const char* sip = this->GetIPString();
UserResolver *res_reverse;
- QueryType resolvtype = strchr(sip, ':') ? DNS_QUERY_PTR6 : DNS_QUERY_PTR4;
- // when GetProtocolFamily() works correctly with 4in6, this can be replaced by
- // this->GetProtocolFamily() == AF_INET ? DNS_QUERY_PTR4 : DNS_QUERY_PTR6;
+ QueryType resolvtype = this->ip.sa.sa_family == AF_INET6 ? DNS_QUERY_PTR6 : DNS_QUERY_PTR4;
res_reverse = new UserResolver(this->ServerInstance, this, sip, resolvtype, cached);
this->ServerInstance->AddResolver(res_reverse, cached);
@@ -215,10 +213,10 @@ User::User(InspIRCd* Instance, const std::string &uid) : ServerInstance(Instance
bytes_in = bytes_out = cmds_in = cmds_out = 0;
quietquit = quitting = exempt = haspassed = dns_done = false;
fd = -1;
+ ip.sa.sa_family = AF_UNSPEC;
recvq.clear();
sendq.clear();
Visibility = NULL;
- ip = NULL;
MyClass = NULL;
AllowedPrivs = AllowedOperCommands = NULL;
chans.clear();
@@ -264,20 +262,9 @@ User::~User()
this->InvalidateCache();
this->DecrementModes();
- if (ip)
- {
+ if (ip.sa.sa_family != AF_UNSPEC)
ServerInstance->Users->RemoveCloneCounts(this);
- if (this->GetProtocolFamily() == AF_INET)
- {
- delete (sockaddr_in*)ip;
- }
- else
- {
- delete (sockaddr_in6*)ip;
- }
- }
-
ServerInstance->Users->uuidlist->erase(uuid);
}
@@ -1072,77 +1059,44 @@ bool User::ForceNickChange(const char* newnick)
return false;
}
-void User::SetSockAddr(int protocol_family, const char* sip, int port)
+void User::SetSockAddr(const char* sip, int port)
{
this->cachedip = "";
- switch (protocol_family)
+ if (inet_pton(AF_INET, sip, &ip.in4.sin_addr))
{
- case AF_INET6:
- {
- sockaddr_in6* sin = new sockaddr_in6;
- sin->sin6_family = AF_INET6;
- sin->sin6_port = port;
- inet_pton(AF_INET6, sip, &sin->sin6_addr);
- this->ip = (sockaddr*)sin;
- }
- break;
- case AF_INET:
- {
- sockaddr_in* sin = new sockaddr_in;
- sin->sin_family = AF_INET;
- sin->sin_port = port;
- inet_pton(AF_INET, sip, &sin->sin_addr);
- this->ip = (sockaddr*)sin;
- }
- break;
- default:
- ServerInstance->Logs->Log("USERS",DEBUG,"Uh oh, I dont know protocol %d to be set on '%s'!", protocol_family, this->nick.c_str());
- break;
+ ip.in4.sin_family = AF_INET;
+ ip.in4.sin_port = port;
+ return;
+ }
+ else if (inet_pton(AF_INET6, sip, &ip.in6.sin6_addr))
+ {
+ ip.in6.sin6_family = AF_INET6;
+ ip.in6.sin6_port = port;
+ }
+ else
+ {
+ ServerInstance->Logs->Log("USERS",DEBUG,"Uh oh, I dont know how to read IP '%s' on '%s'!",
+ sip, this->nick.c_str());
}
}
int User::GetPort()
{
- if (this->ip == NULL)
- return 0;
-
- switch (this->GetProtocolFamily())
+ switch (this->ip.sa.sa_family)
{
case AF_INET6:
- {
- sockaddr_in6* sin = (sockaddr_in6*)this->ip;
- return sin->sin6_port;
- }
- break;
+ return this->ip.in6.sin6_port;
case AF_INET:
- {
- sockaddr_in* sin = (sockaddr_in*)this->ip;
- return sin->sin_port;
- }
- break;
- default:
- break;
+ return this->ip.in4.sin_port;
}
return 0;
}
-int User::GetProtocolFamily()
-{
- if (this->ip == NULL)
- return 0;
-
- sockaddr_in* sin = (sockaddr_in*)this->ip;
- return sin->sin_family;
-}
-
const char* User::GetCIDRMask(int range)
{
static char buf[44];
- if (this->ip == NULL)
- return "";
-
if (range < 0)
throw "Negative range, sorry, no.";
@@ -1150,22 +1104,18 @@ const char* User::GetCIDRMask(int range)
* Original code written by Oliver Lupton (Om).
* Integrated by me. Thanks. :) -- w00t
*/
- switch (this->GetProtocolFamily())
+ switch (this->ip.sa.sa_family)
{
case AF_INET6:
{
/* unsigned char s6_addr[16]; */
struct in6_addr v6;
- sockaddr_in6* sin;
int i, bytestozero, extrabits;
char buffer[40];
if(range > 128)
throw "CIDR mask width greater than address width (IPv6, 128 bit)";
- /* Access the user's IP structure directly */
- sin = (sockaddr_in6*)this->ip;
-
/* To create the CIDR mask we want to set all the bits after 'range' bits of the address
* to zero. This means the last (128 - range) bits of the address must be set to zero.
* Hence this number divided by 8 is the number of whole bytes from the end of the address
@@ -1184,7 +1134,7 @@ const char* User::GetCIDRMask(int range)
*/
for(i = 0; i < (16 - bytestozero); i++)
{
- v6.s6_addr[i] = sin->sin6_addr.s6_addr[i];
+ v6.s6_addr[i] = ip.in6.sin6_addr.s6_addr[i];
}
/* And zero all the remaining bytes in the IP. */
@@ -1203,15 +1153,13 @@ const char* User::GetCIDRMask(int range)
case AF_INET:
{
struct in_addr v4;
- sockaddr_in* sin;
char buffer[16];
if (range > 32)
throw "CIDR mask width greater than address width (IPv4, 32 bit)";
/* Users already have a sockaddr* pointer (User::ip) which contains either a v4 or v6 structure */
- sin = (sockaddr_in*)this->ip;
- v4.s_addr = sin->sin_addr.s_addr;
+ v4.s_addr = ip.in4.sin_addr.s_addr;
/* To create the CIDR mask we want to set all the bits after 'range' bits of the address
* to zero. This means the last (32 - range) bits of the address must be set to zero.
@@ -1245,20 +1193,16 @@ const char* User::GetIPString()
{
static char buf[40];
- if (this->ip == NULL)
- return "";
-
if (!this->cachedip.empty())
return this->cachedip.c_str();
- switch (this->GetProtocolFamily())
+ switch (this->ip.sa.sa_family)
{
case AF_INET6:
{
- static char temp[1024];
+ static char temp[41];
- sockaddr_in6* sin = (sockaddr_in6*)this->ip;
- inet_ntop(sin->sin6_family, &sin->sin6_addr, buf, sizeof(buf));
+ inet_ntop(ip.in6.sin6_family, &ip.in6.sin6_addr, buf, sizeof(buf));
/* IP addresses starting with a : on irc are a Bad Thing (tm) */
if (*buf == ':')
{
@@ -1274,8 +1218,7 @@ const char* User::GetIPString()
break;
case AF_INET:
{
- sockaddr_in* sin = (sockaddr_in*)this->ip;
- inet_ntop(sin->sin_family, &sin->sin_addr, buf, sizeof(buf));
+ inet_ntop(ip.in4.sin_family, &ip.in4.sin_addr, buf, sizeof(buf));
this->cachedip = buf;
return buf;
}