]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspsocket.cpp
Remove unneeded ProtocolInterface::Introduce
[user/henk/code/inspircd.git] / src / inspsocket.cpp
index aa3c96da5fee1e678cacc6eb4bd35e70b91100e7..1ec32742e8fa8bdab8e7017eac3a66df4059d042 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);
@@ -103,58 +89,22 @@ void BufferedSocket::SetQueues()
        }
 }
 
-bool BufferedSocket::DoBindMagic(const std::string &current_ip, bool v6)
+bool BufferedSocket::DoBindMagic(const std::string &current_ip)
 {
-       /* The [2] is required because we may write a sockaddr_in6 here, and sockaddr_in6 is larger than sockaddr, where sockaddr_in4 is not. */
-       socklen_t size = sizeof(sockaddr_in);
-       sockaddr* s = new sockaddr[2];
-#ifdef IPV6
-       if (v6)
+       irc::sockets::sockaddrs s;
+       if (!irc::sockets::aptosa(current_ip.c_str(), 0, &s))
        {
-               in6_addr n;
-               if (inet_pton(AF_INET6, current_ip.c_str(), &n) > 0)
-               {
-                       memcpy(&((sockaddr_in6*)s)->sin6_addr, &n, sizeof(sockaddr_in6));
-                       ((sockaddr_in6*)s)->sin6_port = 0;
-                       ((sockaddr_in6*)s)->sin6_family = AF_INET6;
-                       size = sizeof(sockaddr_in6);
-               }
-               else
-               {
-                       // Well, this is as good as it's gonna get.
-                       errno = EADDRNOTAVAIL;
-                       delete[] s;
-                       return false;
-               }
-       }
-       else
-#endif
-       {
-               in_addr n;
-               if (inet_aton(current_ip.c_str(), &n) > 0)
-               {
-                       ((sockaddr_in*)s)->sin_addr = n;
-                       ((sockaddr_in*)s)->sin_port = 0;
-                       ((sockaddr_in*)s)->sin_family = AF_INET;
-               }
-               else
-               {
-                       // Well, this is as good as it's gonna get.
-                       errno = EADDRNOTAVAIL;
-                       delete[] s;
-                       return false;
-               }
+               errno = EADDRNOTAVAIL;
+               return false;
        }
 
-       if (ServerInstance->SE->Bind(this->fd, s, size) < 0)
+       if (ServerInstance->SE->Bind(this->fd, &s.sa, sa_size(s)) < 0)
        {
                this->state = I_ERROR;
                this->OnError(I_ERR_BIND);
-               delete[] s;
                return false;
        }
 
-       delete[] s;
        return true;
 }
 
@@ -169,18 +119,12 @@ bool BufferedSocket::DoBindMagic(const std::string &current_ip, bool v6)
 bool BufferedSocket::BindAddr(const std::string &ip_to_bind)
 {
        ConfigReader Conf(this->ServerInstance);
-       bool v6 = false;
-#ifdef IPV6
-       /* Are we looking for a binding to fit an ipv6 host? */
-       if ((ip_to_bind.empty()) || (ip_to_bind.find(':') != std::string::npos))
-               v6 = true;
-#endif
 
        // Case one: If they provided an IP, try bind it
        if (!ip_to_bind.empty())
        {
                // And if it fails, don't do anything.
-               return this->DoBindMagic(ip_to_bind, v6);
+               return this->DoBindMagic(ip_to_bind);
        }
 
        for (int j = 0; j < Conf.Enumerate("bind"); j++)
@@ -197,7 +141,7 @@ bool BufferedSocket::BindAddr(const std::string &ip_to_bind)
                        continue;
 
                // Try bind, don't fail if it doesn't bind though.
-               if (this->DoBindMagic(current_ip, v6))
+               if (this->DoBindMagic(current_ip))
                        return true;
        }
 
@@ -209,86 +153,34 @@ bool BufferedSocket::BindAddr(const std::string &ip_to_bind)
 
 bool BufferedSocket::DoConnect(unsigned long maxtime)
 {
-       /* The [2] is required because we may write a sockaddr_in6 here, and sockaddr_in6 is larger than sockaddr, where sockaddr_in4 is not. */
-       sockaddr* addr = new sockaddr[2];
-       socklen_t size = sizeof(sockaddr_in);
-#ifdef IPV6
-       bool v6 = false;
-       if ((!*this->host) || strchr(this->host, ':'))
-               v6 = true;
-
-       if (v6)
-       {
-               this->fd = socket(AF_INET6, SOCK_STREAM, 0);
-               if ((this->fd > -1) && ((strstr(this->IP,"::ffff:") != (char*)&this->IP) && (strstr(this->IP,"::FFFF:") != (char*)&this->IP)))
-               {
-                       if (!this->BindAddr(this->cbindip))
-                       {
-                               this->Close();
-                               this->fd = -1;
-                               delete[] addr;
-                               return false;
-                       }
-               }
-       }
-       else
-#endif
-       {
-               this->fd = socket(AF_INET, SOCK_STREAM, 0);
-               if (this->fd > -1)
-               {
-                       if (!this->BindAddr(this->cbindip))
-                       {
-                               this->Close();
-                               this->fd = -1;
-                               delete[] addr;
-                               return false;
-                       }
-               }
-       }
+       irc::sockets::sockaddrs addr;
+       irc::sockets::aptosa(this->host, this->port, &addr);
+
+       this->fd = socket(addr.sa.sa_family, SOCK_STREAM, 0);
 
        if (this->fd == -1)
        {
                this->state = I_ERROR;
                this->OnError(I_ERR_SOCKET);
-               delete[] addr;
                return false;
        }
 
-#ifdef IPV6
-       if (v6)
-       {
-               in6_addr addy;
-               if (inet_pton(AF_INET6, this->host, &addy) > 0)
-               {
-                       ((sockaddr_in6*)addr)->sin6_family = AF_INET6;
-                       memcpy(&((sockaddr_in6*)addr)->sin6_addr, &addy, sizeof(addy));
-                       ((sockaddr_in6*)addr)->sin6_port = htons(this->port);
-                       size = sizeof(sockaddr_in6);
-               }
-       }
-       else
-#endif
+       if (!this->BindAddr(this->cbindip))
        {
-               in_addr addy;
-               if (inet_aton(this->host, &addy) > 0)
-               {
-                       ((sockaddr_in*)addr)->sin_family = AF_INET;
-                       ((sockaddr_in*)addr)->sin_addr = addy;
-                       ((sockaddr_in*)addr)->sin_port = htons(this->port);
-               }
+               this->Close();
+               this->fd = -1;
+               return false;
        }
 
        ServerInstance->SE->NonBlocking(this->fd);
 
-       if (ServerInstance->SE->Connect(this, (sockaddr*)addr, size) == -1)
+       if (ServerInstance->SE->Connect(this, &addr.sa, sa_size(addr)) == -1)
        {
                if (errno != EINPROGRESS)
                {
                        this->OnError(I_ERR_CONNECT);
                        this->Close();
                        this->state = I_ERROR;
-                       delete[] addr;
                        return false;
                }
 
@@ -297,7 +189,6 @@ bool BufferedSocket::DoConnect(unsigned long maxtime)
        }
 
        this->state = I_CONNECTING;
-       delete[] addr;
        if (this->fd > -1)
        {
                if (!this->ServerInstance->SE->AddFd(this))