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