diff options
-rw-r--r-- | src/inspsocket.cpp | 53 | ||||
-rw-r--r-- | src/modules/m_cloaking.cpp | 5 | ||||
-rw-r--r-- | src/socket.cpp | 53 | ||||
-rw-r--r-- | src/users.cpp | 68 |
4 files changed, 35 insertions, 144 deletions
diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index a23518148..e42990a74 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -53,22 +53,8 @@ BufferedSocket::BufferedSocket(InspIRCd* SI, const std::string &ipaddr, int apor strlcpy(this->host,ipaddr.c_str(),MAXBUF); this->port = aport; - bool ipvalid = true; -#ifdef IPV6 - if (strchr(host,':')) - { - in6_addr n; - if (inet_pton(AF_INET6, host, &n) < 1) - ipvalid = false; - } - else -#endif - { - in_addr n; - if (inet_aton(host,&n) < 1) - ipvalid = false; - } - if (!ipvalid) + irc::sockets::sockaddrs testaddr; + if (!irc::sockets::aptosa(host, aport, &testaddr)) { this->ServerInstance->Logs->Log("SOCKET", DEBUG,"BUG: Hostname passed to BufferedSocket, rather than an IP address!"); this->OnError(I_ERR_CONNECT); @@ -106,40 +92,13 @@ void BufferedSocket::SetQueues() bool BufferedSocket::DoBindMagic(const std::string ¤t_ip, bool v6) { irc::sockets::sockaddrs s; - socklen_t size = sizeof(sockaddr_in); -#ifdef IPV6 - if (v6) + if (!irc::sockets::aptosa(current_ip.c_str(), 0, &s)) { - if (inet_pton(AF_INET6, current_ip.c_str(), &s.in6.sin6_addr) > 0) - { - s.in6.sin6_port = 0; - s.in6.sin6_family = AF_INET6; - size = sizeof(sockaddr_in6); - } - else - { - // Well, this is as good as it's gonna get. - errno = EADDRNOTAVAIL; - return false; - } - } - else -#endif - { - if (inet_aton(current_ip.c_str(), &s.in4.sin_addr) > 0) - { - s.in4.sin_port = 0; - s.in4.sin_family = AF_INET; - } - else - { - // Well, this is as good as it's gonna get. - errno = EADDRNOTAVAIL; - return false; - } + errno = EADDRNOTAVAIL; + return false; } - if (ServerInstance->SE->Bind(this->fd, &s.sa, size) < 0) + if (ServerInstance->SE->Bind(this->fd, &s.sa, sizeof(s)) < 0) { this->state = I_ERROR; this->OnError(I_ERR_BIND); diff --git a/src/modules/m_cloaking.cpp b/src/modules/m_cloaking.cpp index a17577702..ae409ae93 100644 --- a/src/modules/m_cloaking.cpp +++ b/src/modules/m_cloaking.cpp @@ -410,8 +410,9 @@ class ModuleCloaking : public Module * Their ISP shouldnt go to town on subdomains, or they shouldnt have a kiddie * vhost. */ - in6_addr testaddr; - if (inet_pton(dest->client_sa.sa.sa_family, dest->host.c_str(), &testaddr) < 1 && (hostcloak.length() <= 64)) + std::string testaddr; + int testport; + if (!irc::sockets::satoap(&dest->client_sa, testaddr, testport) && (hostcloak.length() <= 64)) /* not a valid address, must have been a host, so cloak as a host */ b = hostcloak; else if (dest->client_sa.sa.sa_family == AF_INET6) diff --git a/src/socket.cpp b/src/socket.cpp index 7d44b7e37..4d3509836 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -25,40 +25,18 @@ using irc::sockets::sockaddrs; bool InspIRCd::BindSocket(int sockfd, int port, const char* addr, bool dolisten) { sockaddrs servaddr; - memset(&servaddr, 0, sizeof(servaddr)); - - int ret, size; + int ret; if (*addr == '*') addr = ""; -#ifdef IPV6 if (*addr) { - /* There is an address here. Is it ipv6? */ - if (strchr(addr,':')) - { - if (inet_pton(AF_INET6, addr, &servaddr.in6.sin6_addr) < 1) - { - return false; - } - servaddr.in6.sin6_family = AF_INET6; - servaddr.in6.sin6_port = htons(port); - size = sizeof(sockaddr_in6); - } - else - { - if (inet_pton(AF_INET, addr, &servaddr.in4.sin_addr) < 1) - { - return false; - } - servaddr.in4.sin_family = AF_INET; - servaddr.in4.sin_port = htons(port); - size = sizeof(sockaddr_in); - } + irc::sockets::aptosa(addr, port, &servaddr); } else { +#ifdef IPV6 if (port == -1) { /* Port -1: Means UDP IPV4 port binding - Special case @@ -67,37 +45,22 @@ bool InspIRCd::BindSocket(int sockfd, int port, const char* addr, bool dolisten) servaddr.in4.sin_family = AF_INET; servaddr.in4.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.in4.sin_port = 0; - size = sizeof(sockaddr_in); } else { /* There's no address here, default to ipv6 bind to all */ servaddr.in6.sin6_family = AF_INET6; servaddr.in6.sin6_port = htons(port); - size = sizeof(sockaddr_in6); + memset(&servaddr.in6.sin6_addr, 0, sizeof(servaddr.in6.sin6_addr)); } - } #else - /* If we aren't built with ipv6, the choice becomes simple */ - servaddr.in4.sin_family = AF_INET; - if (*addr) - { - /* There is an address here. */ - if (inet_pton(AF_INET, addr, &servaddr.in4.sin_addr) < 1) - { - return false; - } - } - else - { /* Bind ipv4 to all */ + servaddr.in4.sin_family = AF_INET; servaddr.in4.sin_addr.s_addr = htonl(INADDR_ANY); - } - /* Bind ipv4 port number */ - servaddr.in4.sin_port = htons(port); - size = sizeof(sockaddr_in); + servaddr.in4.sin_port = htons(port); #endif - ret = SE->Bind(sockfd, &servaddr.sa, size); + } + ret = SE->Bind(sockfd, &servaddr.sa, sizeof(servaddr)); if (ret < 0) { diff --git a/src/users.cpp b/src/users.cpp index 7663a63b2..8e45d1772 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -1066,9 +1066,9 @@ int User::GetServerPort() switch (this->server_sa.sa.sa_family) { case AF_INET6: - return this->server_sa.in6.sin6_port; + return htons(this->server_sa.in6.sin6_port); case AF_INET: - return this->server_sa.in4.sin_port; + return htons(this->server_sa.in4.sin_port); } return 0; } @@ -1169,64 +1169,32 @@ const char* User::GetCIDRMask(int range) return ""; // unused, but oh well } -const char* User::GetIPString() +std::string User::GetServerIP() { - static char buf[40]; - - if (!this->cachedip.empty()) - return this->cachedip.c_str(); + int port; + std::string ip; + irc::sockets::satoap(&server_sa, ip, port); + return ip; +} - switch (this->client_sa.sa.sa_family) +const char* User::GetIPString() +{ + int port; + if (cachedip.empty()) { - case AF_INET6: - { - static char temp[41]; - - inet_ntop(client_sa.in6.sin6_family, &client_sa.in6.sin6_addr, buf, sizeof(buf)); - /* IP addresses starting with a : on irc are a Bad Thing (tm) */ - if (*buf == ':') - { - strlcpy(&temp[1], buf, sizeof(temp) - 1); - *temp = '0'; - this->cachedip = temp; - return temp; - } - - this->cachedip = buf; - return buf; - } - break; - case AF_INET: - { - inet_ntop(client_sa.in4.sin_family, &client_sa.in4.sin_addr, buf, sizeof(buf)); - this->cachedip = buf; - return buf; - } - break; - default: - break; + irc::sockets::satoap(&client_sa, cachedip, port); + /* IP addresses starting with a : on irc are a Bad Thing (tm) */ + if (cachedip.c_str()[0] == ':') + cachedip.insert(0,1,'0'); } - // Unreachable, probably - return ""; + return cachedip.c_str(); } bool User::SetClientIP(const char* sip) { this->cachedip = ""; - if (inet_pton(AF_INET, sip, &client_sa.in4.sin_addr)) - { - client_sa.in4.sin_family = AF_INET; - client_sa.in4.sin_port = 0; - return true; - } - else if (inet_pton(AF_INET6, sip, &client_sa.in6.sin6_addr)) - { - client_sa.in6.sin6_family = AF_INET6; - client_sa.in6.sin6_port = 0; - return true; - } - return false; + return irc::sockets::aptosa(sip, 0, &client_sa); } /** NOTE: We cannot pass a const reference to this method. |