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
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;
}
}
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;
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;
}
}