X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspsocket.cpp;h=6407b213f848bcfd5553019769034593ddbbf4b0;hb=cbb95cffac2fe5533bae8bf5dc2ce62fb0f17c2f;hp=7ce98ef8a9e612aa2952d5228abff169aa14d74e;hpb=9183ebd28c79b12ddf29b3847f59679e480af70a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index 7ce98ef8a..6407b213f 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -42,7 +42,7 @@ BufferedSocket::BufferedSocket(InspIRCd* SI, int newfd, const char* ip) this->Instance->SE->AddFd(this); } -BufferedSocket::BufferedSocket(InspIRCd* SI, const std::string &ipaddr, int aport, unsigned int maxtime, const std::string &connectbindip) +BufferedSocket::BufferedSocket(InspIRCd* SI, const std::string &ipaddr, int aport, unsigned long maxtime, const std::string &connectbindip) { this->cbindip = connectbindip; this->fd = -1; @@ -91,17 +91,12 @@ BufferedSocket::BufferedSocket(InspIRCd* SI, const std::string &ipaddr, int apor } } -void BufferedSocket::WantWrite() -{ - this->Instance->SE->WantWrite(this); -} - -void BufferedSocket::SetQueues(int nfd) +void BufferedSocket::SetQueues() { // attempt to increase socket sendq and recvq as high as its possible int sendbuf = 32768; int recvbuf = 32768; - if(setsockopt(nfd,SOL_SOCKET,SO_SNDBUF,(const char *)&sendbuf,sizeof(sendbuf)) || setsockopt(nfd,SOL_SOCKET,SO_RCVBUF,(const char *)&recvbuf,sizeof(sendbuf))) + if(setsockopt(this->fd,SOL_SOCKET,SO_SNDBUF,(const char *)&sendbuf,sizeof(sendbuf)) || setsockopt(this->fd,SOL_SOCKET,SO_RCVBUF,(const char *)&recvbuf,sizeof(sendbuf))) { //this->Instance->Log(DEFAULT, "Could not increase SO_SNDBUF/SO_RCVBUF for socket %u", GetFd()); ; // do nothing. I'm a little sick of people trying to interpret this message as a result of why their incorrect setups don't work. @@ -285,7 +280,7 @@ bool BufferedSocket::DoConnect(unsigned long maxtime) this->state = I_ERROR; return false; } - this->SetQueues(this->fd); + this->SetQueues(); } Instance->Logs->Log("SOCKET", DEBUG,"BufferedSocket::DoConnect success"); @@ -517,54 +512,27 @@ void SocketTimeout::Tick(time_t) this->sock->Timeout = NULL; } -bool BufferedSocket::Poll() +bool BufferedSocket::InternalMarkConnected() { -#ifndef WINDOWS - if (!Instance->SE->BoundsCheckFd(this)) - return false; -#endif - - if (Instance->SE->GetRef(this->fd) != this) - return false; + /* Our socket was in write-state, so delete it and re-add it + * in read-state. + */ + this->SetState(I_CONNECTED); - switch (this->state) + if (this->GetIOHook()) { - case I_CONNECTING: - /* Our socket was in write-state, so delete it and re-add it - * in read-state. - */ -#ifndef WINDOWS - if (this->fd > -1) - { - this->Instance->SE->DelFd(this); - if (!this->Instance->SE->AddFd(this)) - return false; - } -#endif - this->SetState(I_CONNECTED); - - if (this->GetIOHook()) - { - Instance->Logs->Log("SOCKET",DEBUG,"Hook for raw connect"); - try - { - this->GetIOHook()->OnRawSocketConnect(this->fd); - } - catch (CoreException& modexcept) - { - Instance->Logs->Log("SOCKET",DEBUG,"%s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason()); - } - } - return this->OnConnected(); - break; - case I_CONNECTED: - /* Process the read event */ - return this->OnDataReady(); - break; - default: - break; + Instance->Logs->Log("SOCKET",DEBUG,"Hook for raw connect"); + try + { + this->GetIOHook()->OnRawSocketConnect(this->fd); + } + catch (CoreException& modexcept) + { + Instance->Logs->Log("SOCKET",DEBUG,"%s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason()); + return false; + } } - return true; + return this->OnConnected(); } void BufferedSocket::SetState(BufferedSocketState s) @@ -604,45 +572,50 @@ void BufferedSocket::HandleEvent(EventType et, int errornum) switch (et) { case EVENT_ERROR: + { switch (errornum) { case ETIMEDOUT: this->OnError(I_ERR_TIMEOUT); - break; + break; case ECONNREFUSED: case 0: this->OnError(this->state == I_CONNECTING ? I_ERR_CONNECT : I_ERR_WRITE); - break; + break; case EADDRINUSE: this->OnError(I_ERR_BIND); - break; + break; case EPIPE: case EIO: this->OnError(I_ERR_WRITE); - break; + break; } + if (this->Instance->SocketCull.find(this) == this->Instance->SocketCull.end()) this->Instance->SocketCull[this] = this; return; - break; + break; + } case EVENT_READ: - if (!this->Poll()) + { + if (!this->OnDataReady()) { if (this->Instance->SocketCull.find(this) == this->Instance->SocketCull.end()) this->Instance->SocketCull[this] = this; return; } - break; + break; + } case EVENT_WRITE: + { if (this->state == I_CONNECTING) { - /* This might look wrong as if we should be actually calling - * with EVENT_WRITE, but trust me it is correct. There are some - * writeability-state things in the read code, because of how - * BufferedSocket used to work regarding write buffering in previous - * versions of InspIRCd. - Brain - */ - this->HandleEvent(EVENT_READ); + if (!this->InternalMarkConnected()) + { + if (this->Instance->SocketCull.find(this) == this->Instance->SocketCull.end()) + this->Instance->SocketCull[this] = this; + return; + } return; } else @@ -654,7 +627,8 @@ void BufferedSocket::HandleEvent(EventType et, int errornum) return; } } - break; + break; + } } }