diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/inspsocket.cpp | 21 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treesocket1.cpp | 45 |
2 files changed, 47 insertions, 19 deletions
diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index cdc0dc26f..3face10f6 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -119,10 +119,10 @@ InspSocket::InspSocket(InspIRCd* SI, const std::string &ipaddr, int aport, bool if (!ipvalid) { this->Instance->Log(DEBUG,"BUG: Hostname passed to InspSocket, rather than an IP address!"); + this->OnError(I_ERR_CONNECT); this->Close(); this->fd = -1; this->state = I_ERROR; - this->OnError(I_ERR_RESOLVE); return; } else @@ -131,10 +131,10 @@ InspSocket::InspSocket(InspIRCd* SI, const std::string &ipaddr, int aport, bool timeout_val = maxtime; if (!this->DoConnect()) { + this->OnError(I_ERR_CONNECT); this->Close(); this->fd = -1; this->state = I_ERROR; - this->OnError(I_ERR_CONNECT); return; } } @@ -715,6 +715,23 @@ void InspSocket::HandleEvent(EventType et, int errornum) switch (et) { case EVENT_ERROR: + switch (errornum) + { + case ETIMEDOUT: + this->OnError(I_ERR_TIMEOUT); + break; + case ECONNREFUSED: + case 0: + this->OnError(this->state == I_CONNECTING ? I_ERR_CONNECT : I_ERR_WRITE); + break; + case EADDRINUSE: + this->OnError(I_ERR_BIND); + break; + case EPIPE: + case EIO: + this->OnError(I_ERR_WRITE); + break; + } if (this->Instance->SocketCull.find(this) == this->Instance->SocketCull.end()) this->Instance->SocketCull[this] = this; return; diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index 21c6de118..6176d0201 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -205,24 +205,35 @@ bool TreeSocket::OnConnected() void TreeSocket::OnError(InspSocketError e) { - /* We don't handle this method, because all our - * dirty work is done in OnClose() (see below) - * which is still called on error conditions too. - */ - if (e == I_ERR_CONNECT) - { - this->Instance->SNO->WriteToSnoMask('l',"Connection failed: Connection to \002"+myhost+"\002 refused"); - Link* MyLink = Utils->FindLink(myhost); - if (MyLink) - Utils->DoFailOver(MyLink); - } - else + Link* MyLink; + + switch (e) { - if ((errno) && (errno != EINPROGRESS) && (errno != EAGAIN)) - { - std::string errstr = strerror(errno); - this->Instance->SNO->WriteToSnoMask('l',"Connection to \002"+myhost+"\002 failed with error: " + errstr); - } + case I_ERR_CONNECT: + this->Instance->SNO->WriteToSnoMask('l',"Connection failed: Connection to \002"+myhost+"\002 refused"); + MyLink = Utils->FindLink(myhost); + if (MyLink) + Utils->DoFailOver(MyLink); + break; + case I_ERR_SOCKET: + this->Instance->SNO->WriteToSnoMask('l',"Connection failed: Could not create socket"); + break; + case I_ERR_BIND: + this->Instance->SNO->WriteToSnoMask('l',"Connection failed: Error binding socket to address or port"); + break; + case I_ERR_WRITE: + this->Instance->SNO->WriteToSnoMask('l',"Connection failed: I/O error on connection"); + break; + case I_ERR_NOMOREFDS: + this->Instance->SNO->WriteToSnoMask('l',"Connection failed: Operating system is out of file descriptors!"); + break; + default: + if ((errno) && (errno != EINPROGRESS) && (errno != EAGAIN)) + { + std::string errstr = strerror(errno); + this->Instance->SNO->WriteToSnoMask('l',"Connection to \002"+myhost+"\002 failed with OS error: " + errstr); + } + break; } } |