X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspsocket.cpp;h=093b133f0de9e28b21582bb8999f3bda4bbb7f04;hb=b844d1cbbe79585facc69b9247baa8427cff0b62;hp=06e4d1ec1ed74a0f8c0de45909c6ceb355c498cc;hpb=bf4720abab7a7929b92238a36cb3b91393f1038c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index 06e4d1ec1..093b133f0 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -18,8 +18,6 @@ #include "inspircd.h" using irc::sockets::OpenTCPSocket; -using irc::sockets::insp_inaddr; -using irc::sockets::insp_sockaddr; bool InspSocket::Readable() { @@ -28,6 +26,7 @@ bool InspSocket::Readable() InspSocket::InspSocket(InspIRCd* SI) { + this->Timeout = NULL; this->state = I_DISCONNECTED; this->fd = -1; this->WaitingForWriteEvent = false; @@ -37,6 +36,7 @@ InspSocket::InspSocket(InspIRCd* SI) InspSocket::InspSocket(InspIRCd* SI, int newfd, const char* ip) { + this->Timeout = NULL; this->fd = newfd; this->state = I_CONNECTED; strlcpy(this->IP,ip,MAXBUF); @@ -47,8 +47,9 @@ InspSocket::InspSocket(InspIRCd* SI, int newfd, const char* ip) this->Instance->SE->AddFd(this); } -InspSocket::InspSocket(InspIRCd* SI, const std::string &ipaddr, int aport, bool listening, unsigned long maxtime) +InspSocket::InspSocket(InspIRCd* SI, const std::string &ipaddr, int aport, bool listening, unsigned long maxtime, const std::string &connectbindip) { + this->cbindip = connectbindip; this->fd = -1; this->Instance = SI; strlcpy(host,ipaddr.c_str(),MAXBUF); @@ -156,7 +157,7 @@ void InspSocket::SetQueues(int nfd) * This is easier to configure when you have a lot of links and a lot * of servers to configure. */ -bool InspSocket::BindAddr() +bool InspSocket::BindAddr(const std::string &ip) { ConfigReader Conf(this->Instance); bool bindfail = false; @@ -167,13 +168,13 @@ bool InspSocket::BindAddr() if ((!*this->host) || strchr(this->host, ':')) v6 = true; #endif - for (int j =0; j < Conf.Enumerate("bind"); j++) + int j = 0; + while ((j < Conf.Enumerate("bind")) && (!ip.empty())) { - std::string Type = Conf.ReadValue("bind","type",j); - std::string IP = Conf.ReadValue("bind","address",j); - if (Type == "servers") + std::string IP = ip.empty() ? Conf.ReadValue("bind","address",j) : ip; + if (!ip.empty() || Conf.ReadValue("bind","type",j) == "servers") { - if ((IP != "*") && (IP != "127.0.0.1") && (IP != "") && (IP != "::1")) + if (!ip.empty() || ((IP != "*") && (IP != "127.0.0.1") && (IP != "") && (IP != "::1"))) { sockaddr* s = new sockaddr[2]; #ifdef IPV6 @@ -229,6 +230,7 @@ bool InspSocket::BindAddr() return true; } } + j++; } return true; } @@ -247,7 +249,7 @@ bool InspSocket::DoConnect() 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()) + if (!this->BindAddr(this->cbindip)) { delete[] addr; return false; @@ -549,6 +551,10 @@ void SocketTimeout::Tick(time_t now) delete this->sock; return; } + else + { + this->sock->Timeout = NULL; + } } bool InspSocket::Poll() @@ -597,7 +603,6 @@ bool InspSocket::Poll() length = sizeof(sockaddr_in6); #endif incoming = accept (this->fd, client, &length); - #ifdef IPV6 if ((!*this->host) || strchr(this->host, ':')) {