From 7f7341dc2a13042110f4a18745ab32e15ea035d9 Mon Sep 17 00:00:00 2001 From: psychon Date: Thu, 18 Jun 2009 19:32:12 +0000 Subject: [PATCH] CSocket: Close sockets which cause a EMFILE This now closes listening sockets if we hit some fd limit like we are already doing in CRealListener. git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@1544 726aef4b-f618-498e-8847-2d620e286838 --- Modules.cpp | 8 ++++++++ Modules.h | 1 + 2 files changed, 9 insertions(+) diff --git a/Modules.cpp b/Modules.cpp index dd6cec02..723aedd5 100644 --- a/Modules.cpp +++ b/Modules.cpp @@ -137,6 +137,14 @@ void CSocket::ReachedMaxBuffer() { Close(); } +void CSocket::SockError(int iErrno) { + DEBUG(GetSockName() << " == SockError(" << strerror(iErrno) << ")"); + if (iErrno == EMFILE) { + // We have too many open fds, this can cause a busy loop. + Close(); + } +} + bool CSocket::Connect(const CString& sHostname, unsigned short uPort, bool bSSL, unsigned int uTimeout) { CUser* pUser = m_pModule->GetUser(); CString sSockName = "MOD::C::" + m_pModule->GetModName(); diff --git a/Modules.h b/Modules.h index 4c98371a..da84ae6f 100644 --- a/Modules.h +++ b/Modules.h @@ -151,6 +151,7 @@ public: // This defaults to closing the socket, feel free to override virtual void ReachedMaxBuffer(); + virtual void SockError(int iErrno); bool Connect(const CString& sHostname, unsigned short uPort, bool bSSL = false, unsigned int uTimeout = 60); bool Listen(unsigned short uPort, bool bSSL = false, unsigned int uTimeout = 0);