]> 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 41bce84a73292bf0839c030a93b953052b2bdc46..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;
 
        // Case one: If they provided an IP, try bind it
        if (!ip_to_bind.empty())
        {
-#ifdef IPV6
-               // Check whether or not they are binding to an IPv6 IP..
-               if (ip_to_bind.find(':') != std::string::npos)
-                       v6 = true;
-#endif
                // 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++)
@@ -192,20 +136,12 @@ bool BufferedSocket::BindAddr(const std::string &ip_to_bind)
                // set current IP to the <bind> tag
                std::string current_ip = Conf.ReadValue("bind","address",j);
 
-#ifdef IPV6
-               // Check whether this <bind> is for an ipv6 address
-               if (current_ip.find(':') != std::string::npos)
-                       v6 = true;
-               else
-                       v6 = false;
-#endif
-
                // Make sure IP is nothing local
                if (current_ip == "*" || current_ip == "127.0.0.1" || current_ip.empty() || current_ip == "::1")
                        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;
        }
 
@@ -238,7 +174,7 @@ bool BufferedSocket::DoConnect(unsigned long maxtime)
 
        ServerInstance->SE->NonBlocking(this->fd);
 
-       if (ServerInstance->SE->Connect(this, &addr.sa, sizeof(addr)) == -1)
+       if (ServerInstance->SE->Connect(this, &addr.sa, sa_size(addr)) == -1)
        {
                if (errno != EINPROGRESS)
                {