diff options
-rw-r--r-- | src/configreader.cpp | 1 | ||||
-rw-r--r-- | src/inspsocket.cpp | 38 | ||||
-rw-r--r-- | src/modules/extra/m_ssl_gnutls.cpp | 5 | ||||
-rw-r--r-- | src/modules/extra/m_ssl_openssl.cpp | 8 | ||||
-rw-r--r-- | src/modules/m_spanningtree.cpp | 33 |
5 files changed, 65 insertions, 20 deletions
diff --git a/src/configreader.cpp b/src/configreader.cpp index 7729cee69..b0106eb5e 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -81,6 +81,7 @@ bool ServerConfig::AddIOHook(Module* iomod, InspSocket* is) { if (!GetIOHook(is)) { + ServerInstance->Log(DEBUG,"Hooked inspsocket %08x", is); SocketIOHookModule[is] = iomod; is->IsIOHooked = true; return true; diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index 23d89a71f..1096162db 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -259,7 +259,7 @@ void InspSocket::Close() { if (this->fd > -1) { - if (this->IsIOHooked) + if (this->IsIOHooked && Instance->Config->GetIOHook(this)) { try { @@ -367,7 +367,30 @@ bool InspSocket::FlushWriteBuffer() { try { - Instance->Config->GetIOHook(this)->OnRawSocketWrite(this->fd, outbuffer[0].c_str(), outbuffer[0].length()); + Instance->Log(DEBUG,"To write: %s", outbuffer[0].c_str()); + int result = Instance->Config->GetIOHook(this)->OnRawSocketWrite(this->fd, outbuffer[0].c_str(), outbuffer[0].length()); + if (result > 0) + { + if ((unsigned int)result == outbuffer[0].length()) + { + outbuffer.pop_front(); + } + else + { + std::string temp = outbuffer[0].substr(result); + outbuffer[0] = temp; + errno = EAGAIN; + } + } + else if ((result == -1) && (errno != EAGAIN)) + { + this->Instance->Log(DEBUG,"Write error on socket: %s",strerror(errno)); + this->OnError(I_ERR_WRITE); + this->state = I_ERROR; + this->Instance->SE->DelFd(this); + this->Close(); + return true; + } } catch (ModuleException& modexcept) { @@ -500,6 +523,12 @@ bool InspSocket::Poll() length = sizeof (client); incoming = accept (this->fd, (sockaddr*)&client,&length); +#ifdef IPV6 + this->OnIncomingConnection(incoming, (char*)insp_ntoa(client.sin6_addr)); +#else + this->OnIncomingConnection(incoming, (char*)insp_ntoa(client.sin_addr)); +#endif + if (this->IsIOHooked) { try @@ -517,11 +546,6 @@ bool InspSocket::Poll() } this->SetQueues(incoming); -#ifdef IPV6 - this->OnIncomingConnection(incoming, (char*)insp_ntoa(client.sin6_addr)); -#else - this->OnIncomingConnection(incoming, (char*)insp_ntoa(client.sin_addr)); -#endif return true; break; case I_CONNECTED: diff --git a/src/modules/extra/m_ssl_gnutls.cpp b/src/modules/extra/m_ssl_gnutls.cpp index 4f22a5e70..0006c9de9 100644 --- a/src/modules/extra/m_ssl_gnutls.cpp +++ b/src/modules/extra/m_ssl_gnutls.cpp @@ -445,7 +445,10 @@ class ModuleSSLGnuTLS : public Module } virtual int OnRawSocketWrite(int fd, const char* buffer, int count) - { + { + if (!count) + return 0; + issl_session* session = &sessions[fd]; const char* sendbuffer = buffer; diff --git a/src/modules/extra/m_ssl_openssl.cpp b/src/modules/extra/m_ssl_openssl.cpp index 0da67d677..06708ff54 100644 --- a/src/modules/extra/m_ssl_openssl.cpp +++ b/src/modules/extra/m_ssl_openssl.cpp @@ -296,16 +296,19 @@ class ModuleSSLOpenSSL : public Module virtual char* OnRequest(Request* request) { ISHRequest* ISR = (ISHRequest*)request; + ServerInstance->Log(DEBUG, "hook OnRequest"); if (strcmp("IS_NAME", request->GetId()) == 0) { return "openssl"; } else if (strcmp("IS_HOOK", request->GetId()) == 0) { + ServerInstance->Log(DEBUG, "Hooking socket %08x", ISR->Sock); return ServerInstance->Config->AddIOHook((Module*)this, (InspSocket*)ISR->Sock) ? (char*)"OK" : NULL; } else if (strcmp("IS_UNHOOK", request->GetId()) == 0) { + ServerInstance->Log(DEBUG, "Unhooking socket %08x", ISR->Sock); return ServerInstance->Config->DelIOHook((InspSocket*)ISR->Sock) ? (char*)"OK" : NULL; } return NULL; @@ -314,6 +317,7 @@ class ModuleSSLOpenSSL : public Module virtual void OnRawSocketAccept(int fd, const std::string &ip, int localport) { + ServerInstance->Log(DEBUG, "Hook accept %d", fd); issl_session* session = &sessions[fd]; session->fd = fd; @@ -515,6 +519,10 @@ class ModuleSSLOpenSSL : public Module int DoWrite(issl_session* session) { + if (!session->outbuf.size()) + return -1; + + ServerInstance->Log(DEBUG, "m_ssl_openssl.so: To write: %d", session->outbuf.size()); int ret = SSL_write(session->sess, session->outbuf.data(), session->outbuf.size()); if (ret == 0) diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp index a0563c255..e96656910 100644 --- a/src/modules/m_spanningtree.cpp +++ b/src/modules/m_spanningtree.cpp @@ -680,8 +680,10 @@ class TreeSocket : public InspSocket this->ctx_in = NULL; this->ctx_out = NULL; - if (Hook) - InspSocketHookRequest(this, Hook, (Module*)Utils->Creator).Send(); + Instance->Log(DEBUG, "HOOK = %08x", Hook); + + if (listening && Hook) + InspSocketHookRequest(this, (Module*)Utils->Creator, Hook).Send(); } TreeSocket(SpanningTreeUtilities* Util, InspIRCd* SI, std::string host, int port, bool listening, unsigned long maxtime, std::string ServerName, Module* HookMod = NULL) @@ -691,9 +693,6 @@ class TreeSocket : public InspSocket this->LinkState = CONNECTING; this->ctx_in = NULL; this->ctx_out = NULL; - - if (Hook) - InspSocketHookRequest(this, Hook, (Module*)Utils->Creator).Send(); } /** When a listening socket gives us a new file descriptor, @@ -701,16 +700,18 @@ class TreeSocket : public InspSocket * connection. This constructor is used for this purpose. */ TreeSocket(SpanningTreeUtilities* Util, InspIRCd* SI, int newfd, char* ip, Module* HookMod = NULL) - : InspSocket(SI, newfd, ip), Utils(Util) + : InspSocket(SI, newfd, ip), Utils(Util), Hook(HookMod) { this->LinkState = WAIT_AUTH_1; this->ctx_in = NULL; this->ctx_out = NULL; + Instance->Log(DEBUG, "HOOK = %08x", Hook); + if (Hook) - InspSocketHookRequest(this, Hook, (Module*)Utils->Creator).Send(); + InspSocketHookRequest(this, (Module*)Utils->Creator, Hook).Send(); - this->SendCapabilities(); + //this->SendCapabilities(); } ~TreeSocket() @@ -721,7 +722,7 @@ class TreeSocket : public InspSocket DELETE(ctx_out); if (Hook) - InspSocketUnhookRequest(this, Hook, (Module*)Utils->Creator).Send(); + InspSocketUnhookRequest(this, (Module*)Utils->Creator, Hook).Send(); } void InitAES(std::string key,std::string SName) @@ -768,7 +769,11 @@ class TreeSocket : public InspSocket if (x->Name == this->myhost) { this->Instance->SNO->WriteToSnoMask('l',"Connection to \2"+myhost+"\2["+(x->HiddenFromStats ? "<hidden>" : this->GetIP())+"] started."); - this->SendCapabilities(); + + if (Hook) + InspSocketHookRequest(this, (Module*)Utils->Creator, Hook).Send(); + + //this->SendCapabilities(); if (x->EncryptionKey != "") { if (!(x->EncryptionKey.length() == 16 || x->EncryptionKey.length() == 24 || x->EncryptionKey.length() == 32)) @@ -4100,8 +4105,12 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind) if (IP == "*") IP = ""; - if ((!transport.empty()) && (hooks.find(transport.c_str()) == hooks.end())) - return; + if ((!transport.empty()) && (hooks.find(transport.c_str()) == hooks.end())) + { + ServerInstance->Log(DEFAULT,"m_spanningtree: WARNING: Can't find transport type '%s' - maybe you forgot to load it BEFORE m_spanningtree in your config file?", + transport.c_str()); + continue; + } TreeSocket* listener = new TreeSocket(this, ServerInstance, IP.c_str(), portno, true, 10, transport.empty() ? NULL : hooks[transport.c_str()]); if (listener->GetState() == I_LISTENING) |