Move CListener and CRealListener into their own files

git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@1924 726aef4b-f618-498e-8847-2d620e286838
This commit is contained in:
psychon
2010-04-15 16:52:30 +00:00
parent 92cce35f90
commit eb44919005
7 changed files with 132 additions and 98 deletions

View File

@@ -14,6 +14,7 @@
#include "Server.h"
#include "User.h"
#include "znc.h"
#include "Listener.h"
void CClient::UserCommand(CString& sLine) {
if (!m_pUser) {

58
Listener.cpp Normal file
View File

@@ -0,0 +1,58 @@
/*
* Copyright (C) 2004-2010 See the AUTHORS file for details.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
*/
#include "Listener.h"
bool CListener::Listen() {
if (!m_uPort || m_pListener) {
return false;
}
m_pListener = new CRealListener(this);
bool bSSL = false;
#ifdef HAVE_LIBSSL
if (IsSSL()) {
bSSL = true;
m_pListener->SetPemLocation(CZNC::Get().GetPemLocation());
}
#endif
return CZNC::Get().GetManager().ListenHost(m_uPort, "_LISTENER", m_sBindHost, bSSL, SOMAXCONN,
m_pListener, 0, m_eAddr);
}
CRealListener::~CRealListener() {
m_pParent->SetRealListener(NULL);
}
bool CRealListener::ConnectionFrom(const CString& sHost, unsigned short uPort) {
bool bHostAllowed = CZNC::Get().IsHostAllowed(sHost);
DEBUG(GetSockName() << " == ConnectionFrom(" << sHost << ", " << uPort << ") [" << (bHostAllowed ? "Allowed" : "Not allowed") << "]");
return bHostAllowed;
}
Csock* CRealListener::GetSockObj(const CString& sHost, unsigned short uPort) {
CClient *pClient = new CClient(sHost, uPort);
if (CZNC::Get().AllowConnectionFrom(sHost)) {
CZNC::Get().GetModules().OnClientConnect(pClient, sHost, uPort);
} else {
pClient->RefuseLogin("Too many anonymous connections from your IP");
CZNC::Get().GetModules().OnFailedLogin("", sHost);
}
return pClient;
}
void CRealListener::SockError(int iErrno) {
DEBUG(GetSockName() << " == SockError(" << strerror(iErrno) << ")");
if (iErrno == EMFILE) {
// We have too many open fds, let's close this listening port to be able to continue
// to work, next rehash will (try to) reopen it.
Close();
}
}

69
Listener.h Normal file
View File

@@ -0,0 +1,69 @@
/*
* Copyright (C) 2004-2010 See the AUTHORS file for details.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
*/
#ifndef _LISTENER_H
#define _LISTENER_H
#include "znc.h"
class CRealListener : public CZNCSock {
public:
CRealListener(CListener *pParent) : CZNCSock(), m_pParent(pParent) {}
virtual ~CRealListener();
virtual bool ConnectionFrom(const CString& sHost, unsigned short uPort);
virtual Csock* GetSockObj(const CString& sHost, unsigned short uPort);
virtual void SockError(int iErrno);
private:
CListener* m_pParent;
};
class CListener {
public:
CListener(unsigned short uPort, const CString& sBindHost, bool bSSL, EAddrType eAddr) {
m_uPort = uPort;
m_sBindHost = sBindHost;
m_bSSL = bSSL;
m_eAddr = eAddr;
m_pListener = NULL;
}
~CListener() {
if (m_pListener)
CZNC::Get().GetManager().DelSockByAddr(m_pListener);
}
// Setters
void SetSSL(bool b) { m_bSSL = b; }
void SetAddrType(EAddrType eAddr) { m_eAddr = eAddr; }
void SetPort(unsigned short u) { m_uPort = u; }
void SetBindHost(const CString& s) { m_sBindHost = s; }
void SetRealListener(CRealListener* p) { m_pListener = p; }
// !Setters
// Getters
bool IsSSL() const { return m_bSSL; }
EAddrType GetAddrType() const { return m_eAddr; }
unsigned short GetPort() const { return m_uPort; }
const CString& GetBindHost() const { return m_sBindHost; }
CRealListener* GetRealListener() const { return m_pListener; }
// !Getters
bool Listen();
private:
protected:
bool m_bSSL;
EAddrType m_eAddr;
unsigned short m_uPort;
CString m_sBindHost;
CRealListener* m_pListener;
};
#endif // !_LISTENER_H

View File

@@ -23,7 +23,8 @@ PKGCONFIGDIR := $(libdir)/pkgconfig
LIB_SRCS := ZNCString.cpp Csocket.cpp znc.cpp User.cpp IRCSock.cpp Client.cpp DCCBounce.cpp \
DCCSock.cpp Chan.cpp Nick.cpp Server.cpp Modules.cpp MD5.cpp Buffer.cpp Utils.cpp \
FileUtils.cpp HTTPSock.cpp Template.cpp ClientCommand.cpp Socket.cpp SHA256.cpp WebModules.cpp
FileUtils.cpp HTTPSock.cpp Template.cpp ClientCommand.cpp Socket.cpp SHA256.cpp \
WebModules.cpp Listener.cpp
BIN_SRCS := main.cpp
LIB_OBJS := $(patsubst %cpp,%o,$(LIB_SRCS))
BIN_OBJS := $(patsubst %cpp,%o,$(BIN_SRCS))

View File

@@ -14,6 +14,7 @@
#include "znc.h"
#include "WebModules.h"
#include "ZNCString.h"
#include "Listener.h"
#include <sstream>
#include <utility>

View File

@@ -11,6 +11,7 @@
#include "IRCSock.h"
#include "Server.h"
#include "User.h"
#include "Listener.h"
#include <pwd.h>
#include <list>
@@ -2035,7 +2036,3 @@ void CZNC::LeakConnectUser(CConnectUserTimer *pTimer) {
if (m_pConnectUserTimer == pTimer)
m_pConnectUserTimer = NULL;
}
CRealListener::~CRealListener() {
m_pParent->SetRealListener(NULL);
}

93
znc.h
View File

@@ -178,97 +178,4 @@ protected:
TCacheMap<CString> m_sConnectThrottle;
};
class CRealListener : public CZNCSock {
public:
CRealListener(CListener *pParent) : CZNCSock(), m_pParent(pParent) {}
virtual ~CRealListener();
virtual bool ConnectionFrom(const CString& sHost, unsigned short uPort) {
bool bHostAllowed = CZNC::Get().IsHostAllowed(sHost);
DEBUG(GetSockName() << " == ConnectionFrom(" << sHost << ", " << uPort << ") [" << (bHostAllowed ? "Allowed" : "Not allowed") << "]");
return bHostAllowed;
}
virtual Csock* GetSockObj(const CString& sHost, unsigned short uPort) {
CClient *pClient = new CClient(sHost, uPort);
if (CZNC::Get().AllowConnectionFrom(sHost)) {
CZNC::Get().GetModules().OnClientConnect(pClient, sHost, uPort);
} else {
pClient->RefuseLogin("Too many anonymous connections from your IP");
CZNC::Get().GetModules().OnFailedLogin("", sHost);
}
return pClient;
}
virtual void SockError(int iErrno) {
DEBUG(GetSockName() << " == SockError(" << strerror(iErrno) << ")");
if (iErrno == EMFILE) {
// We have too many open fds, let's close this listening port to be able to continue
// to work, next rehash will (try to) reopen it.
Close();
}
}
private:
CListener* m_pParent;
};
class CListener {
public:
CListener(unsigned short uPort, const CString& sBindHost, bool bSSL, EAddrType eAddr) {
m_uPort = uPort;
m_sBindHost = sBindHost;
m_bSSL = bSSL;
m_eAddr = eAddr;
m_pListener = NULL;
}
~CListener() {
if (m_pListener)
CZNC::Get().GetManager().DelSockByAddr(m_pListener);
}
// Setters
void SetSSL(bool b) { m_bSSL = b; }
void SetAddrType(EAddrType eAddr) { m_eAddr = eAddr; }
void SetPort(unsigned short u) { m_uPort = u; }
void SetBindHost(const CString& s) { m_sBindHost = s; }
void SetRealListener(CRealListener* p) { m_pListener = p; }
// !Setters
// Getters
bool IsSSL() const { return m_bSSL; }
EAddrType GetAddrType() const { return m_eAddr; }
unsigned short GetPort() const { return m_uPort; }
const CString& GetBindHost() const { return m_sBindHost; }
CRealListener* GetRealListener() const { return m_pListener; }
// !Getters
bool Listen() {
if (!m_uPort || m_pListener) {
return false;
}
m_pListener = new CRealListener(this);
bool bSSL = false;
#ifdef HAVE_LIBSSL
if (IsSSL()) {
bSSL = true;
m_pListener->SetPemLocation(CZNC::Get().GetPemLocation());
}
#endif
return CZNC::Get().GetManager().ListenHost(m_uPort, "_LISTENER", m_sBindHost, bSSL, SOMAXCONN,
m_pListener, 0, m_eAddr);
}
private:
protected:
bool m_bSSL;
EAddrType m_eAddr;
unsigned short m_uPort;
CString m_sBindHost;
CRealListener* m_pListener;
};
#endif // !_ZNC_H