X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocket.cpp;h=282d3c5a72fb4355bdfe74e347a28e6d0fb45080;hb=59b1a8955142935b02af6446005ab47fc7c3fc8c;hp=4528090d4e6809fc18e6d6e49976b0a5a18c457f;hpb=642b21c7546728f3a2e1505ee44f2e67fea7b05a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socket.cpp b/src/socket.cpp index 4528090d4..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" @@ -46,6 +47,7 @@ InspSocket* socket_ref[MAX_DESCRIPTORS]; InspSocket::InspSocket() { this->state = I_DISCONNECTED; + this->fd = -1; } InspSocket::InspSocket(int newfd, char* ip) @@ -59,6 +61,7 @@ InspSocket::InspSocket(int newfd, char* ip) InspSocket::InspSocket(std::string host, int port, bool listening, unsigned long maxtime) { + this->fd = -1; if (listening) { if ((this->fd = OpenTCPSocket()) == ERROR) { @@ -100,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; @@ -109,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(); } } @@ -171,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) { @@ -186,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; } @@ -209,10 +214,10 @@ std::string InspSocket::GetIP() char* InspSocket::Read() { - if ((n < 0) || (n > MAX_DESCRIPTOR)) + if ((fd < 0) || (fd > MAX_DESCRIPTORS)) return NULL; int n = recv(this->fd,this->ibuf,sizeof(this->ibuf),0); - if ((n > 0) && (n <= sizeof(this->ibuf))) + if ((n > 0) && (n <= (int)sizeof(this->ibuf))) { ibuf[n] = 0; return ibuf; @@ -237,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(); } @@ -268,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 @@ -286,6 +301,8 @@ bool InspSocket::Poll() { int incoming = -1; bool n = true; + + log(DEBUG,"InspSocket::Poll()"); switch (this->state) { @@ -311,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();