X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocket.cpp;h=282d3c5a72fb4355bdfe74e347a28e6d0fb45080;hb=59b1a8955142935b02af6446005ab47fc7c3fc8c;hp=21e7eff3dff764e58207468de5936a68f1866325;hpb=3d82a9502730b2e473d6eecb598d5d0e544daeff;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socket.cpp b/src/socket.cpp index 21e7eff3d..282d3c5a7 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -29,6 +29,7 @@ using namespace std; #include #include #include +#include #include "socket.h" #include "inspircd.h" #include "inspircd_io.h" @@ -102,7 +103,7 @@ InspSocket::InspSocket(std::string host, int port, bool listening, unsigned long /* Its not an ip, spawn the resolver */ this->dns.SetNS(std::string(Config->DNSServer)); this->dns.ForwardLookupWithFD(host,fd); - timeout_end = time(NULL)+maxtime; + timeout_end = time(NULL) + maxtime; timeout = false; this->state = I_RESOLVING; socket_ref[this->fd] = this; @@ -111,6 +112,7 @@ InspSocket::InspSocket(std::string host, int port, bool listening, unsigned long { log(DEBUG,"No need to resolve %s",this->host.c_str()); this->IP = host; + timeout_end = time(NULL) + maxtime; this->DoConnect(); } } @@ -173,7 +175,7 @@ bool InspSocket::DoConnect() flags = fcntl(this->fd, F_GETFL, 0); fcntl(this->fd, F_SETFL, flags | O_NONBLOCK); - if(connect(this->fd, (sockaddr*)&this->addr,sizeof(this->addr)) == -1) + if (connect(this->fd, (sockaddr*)&this->addr,sizeof(this->addr)) == -1) { if (errno != EINPROGRESS) { @@ -188,6 +190,7 @@ bool InspSocket::DoConnect() ServerInstance->SE->AddFd(this->fd,false,X_ESTAB_MODULE); socket_ref[this->fd] = this; this->SetQueues(this->fd); + log(DEBUG,"Returning true from InspSocket::DoConnect"); return true; } @@ -239,7 +242,16 @@ char* InspSocket::Read() // and should be aborted. int InspSocket::Write(std::string data) { - this->Buffer.append(data); + try + { + if ((data != "") && (this->Buffer.length() + data.length() < this->Buffer.max_size())) + this->Buffer.append(data); + } + catch (std::length_error) + { + log(DEBUG,"std::length_error exception caught while appending to socket buffer!"); + return 0; + } return data.length(); } @@ -270,6 +282,7 @@ bool InspSocket::Timeout(time_t current) { if (((this->state == I_RESOLVING) || (this->state == I_CONNECTING)) && (current > timeout_end)) { + log(DEBUG,"Timed out, current=%lu timeout_end=%lu"); // for non-listening sockets, the timeout can occur // which causes termination of the connection after // the given number of seconds without a successful @@ -288,6 +301,8 @@ bool InspSocket::Poll() { int incoming = -1; bool n = true; + + log(DEBUG,"InspSocket::Poll()"); switch (this->state) { @@ -313,7 +328,9 @@ bool InspSocket::Poll() return true; break; case I_CONNECTED: + log(DEBUG,"State = I_CONNECTED"); n = this->OnDataReady(); + log(DEBUG,"State return: %d",(int)n); /* Flush any pending, but not till after theyre done with the event * so there are less write calls involved. */ this->FlushWriteBuffer();