]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Move IP<->sockaddr conversions into irc::sockets:: namespace
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 1 Sep 2009 15:07:52 +0000 (15:07 +0000)
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 1 Sep 2009 15:07:52 +0000 (15:07 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11580 e03df62e-2008-0410-955e-edbf42e46eb7

src/inspsocket.cpp
src/modules/m_cloaking.cpp
src/socket.cpp
src/users.cpp

index a235181480b8c5c812beacf513f65f872ce5597c..e42990a748615c4f02238d6e7480560f0fb7297c 100644 (file)
@@ -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 &current_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);
index a175777021075954c2ca28331aeeba4092d41e58..ae409ae9327c7e426db283d87bf290ee89942859 100644 (file)
@@ -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)
index 7d44b7e37d4bb46ece3dee4952199d5bbc8b0b94..4d350983687c51a726387ae69a47829364fbbe98 100644 (file)
@@ -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)
        {
index 7663a63b2bbc9641b6ec35e1ccfcbd4a0c1c9729..8e45d17727aa7a48345ac3016dcbf9776595b143 100644 (file)
@@ -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.