From 4824525a4f51b6217cb682b4bd65b64010ab44b0 Mon Sep 17 00:00:00 2001 From: Lukasz Wojciechowski Date: Thu, 31 Jul 2014 16:33:17 +0200 Subject: [PATCH] Add disconnectAllClients() function in SocketManager Function disconnects all clients connected to client interface socket. Boolean field m_client and accessor methods are added to Descriptor class to distinguish client connections from other. Change-Id: Ic3cc382fa3056153e25df05ed8c0eba2872adf7f --- src/service/sockets/Descriptor.cpp | 3 ++- src/service/sockets/Descriptor.h | 9 +++++++++ src/service/sockets/SocketManager.cpp | 33 ++++++++++++++++++++++----------- src/service/sockets/SocketManager.h | 7 +++++-- 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/service/sockets/Descriptor.cpp b/src/service/sockets/Descriptor.cpp index f58d28e..df7ddb4 100644 --- a/src/service/sockets/Descriptor.cpp +++ b/src/service/sockets/Descriptor.cpp @@ -24,7 +24,7 @@ namespace Cynara { -Descriptor::Descriptor() : m_listen(false), m_used(false), m_protocol(nullptr) { +Descriptor::Descriptor() : m_listen(false), m_used(false), m_client(false), m_protocol(nullptr) { } bool Descriptor::hasDataToWrite(void) const { @@ -56,6 +56,7 @@ RawBuffer &Descriptor::prepareWriteBuffer(void) { void Descriptor::clear(void) { m_listen = false; m_used = false; + m_client = false; m_readQueue.clear(); m_writeQueue.clear(); m_writeBuffer.clear(); diff --git a/src/service/sockets/Descriptor.h b/src/service/sockets/Descriptor.h index b49ef03..be9e62a 100644 --- a/src/service/sockets/Descriptor.h +++ b/src/service/sockets/Descriptor.h @@ -37,6 +37,7 @@ class Descriptor { private: bool m_listen; bool m_used; + bool m_client; BinaryQueue m_readQueue; BinaryQueue m_writeQueue; @@ -55,6 +56,10 @@ public: return m_used; } + bool isClient(void) const { + return m_client; + } + bool hasDataToWrite(void) const; const ProtocolPtr protocol(void) const { @@ -79,6 +84,10 @@ public: m_used = used; } + void setClient(bool client) { + m_client = client; + } + void pushReadBuffer(const RawBuffer &readbuffer); RequestPtr extractRequest(void); diff --git a/src/service/sockets/SocketManager.cpp b/src/service/sockets/SocketManager.cpp index 55edc02..0c269af 100644 --- a/src/service/sockets/SocketManager.cpp +++ b/src/service/sockets/SocketManager.cpp @@ -74,8 +74,9 @@ void SocketManager::init(void) { const mode_t clientSocketUMask(0); const mode_t adminSocketUMask(0077); - createDomainSocket(std::make_shared(), clientSocketPath, clientSocketUMask); - createDomainSocket(std::make_shared(), adminSocketPath, adminSocketUMask); + createDomainSocket(std::make_shared(), clientSocketPath, clientSocketUMask, + true); + createDomainSocket(std::make_shared(), adminSocketPath, adminSocketUMask, false); createSignalSocket(std::make_shared()); LOGI("SocketManger init done"); } @@ -192,18 +193,18 @@ void SocketManager::readyForAccept(int fd) { LOGD("SocketManger readyForAccept on fd [%d] start", fd); struct sockaddr_un clientAddr; unsigned int clientLen = sizeof(clientAddr); - int client = accept4(fd, (struct sockaddr*) &clientAddr, &clientLen, SOCK_NONBLOCK); - if (client == -1) { + int clientFd = accept4(fd, (struct sockaddr*) &clientAddr, &clientLen, SOCK_NONBLOCK); + if (clientFd == -1) { int err = errno; LOGW("Error in accept on socket [%d]: <%s>", fd, strerror(err)); return; } - LOGD("Accept on sock [%d]. New client socket opened [%d]", fd, client); + LOGD("Accept on sock [%d]. New client socket opened [%d]", fd, clientFd); - auto &desc = createDescriptor(client); + auto &desc = createDescriptor(clientFd, m_fds[fd].isClient()); desc.setListen(false); desc.setProtocol(m_fds[fd].protocol()->clone()); - addReadSocket(client); + addReadSocket(clientFd); LOGD("SocketManger readyForAccept on fd [%d] done", fd); } @@ -243,12 +244,13 @@ bool SocketManager::handleRead(int fd, const RawBuffer &readbuffer) { return true; } -void SocketManager::createDomainSocket(ProtocolPtr protocol, const std::string &path, mode_t mask) { +void SocketManager::createDomainSocket(ProtocolPtr protocol, const std::string &path, mode_t mask, + bool client) { int fd = getSocketFromSystemD(path); if (fd == -1) fd = createDomainSocketHelp(path, mask); - auto &desc = createDescriptor(fd); + auto &desc = createDescriptor(fd, client); desc.setListen(true); desc.setProtocol(protocol); addReadSocket(fd); @@ -349,7 +351,7 @@ void SocketManager::createSignalSocket(ProtocolPtr protocol) { return; } - auto &desc = createDescriptor(fd); + auto &desc = createDescriptor(fd, false); desc.setListen(false); desc.setProtocol(protocol); addReadSocket(fd); @@ -357,7 +359,7 @@ void SocketManager::createSignalSocket(ProtocolPtr protocol) { LOGD("Signal socket: [%d] added.", fd); } -Descriptor &SocketManager::createDescriptor(int fd) { +Descriptor &SocketManager::createDescriptor(int fd, bool client) { if (fd > m_maxDesc) { m_maxDesc = fd; if (fd >= static_cast(m_fds.size())) @@ -365,6 +367,7 @@ Descriptor &SocketManager::createDescriptor(int fd) { } auto &desc = m_fds[fd]; desc.setUsed(true); + desc.setClient(client); return desc; } @@ -388,4 +391,12 @@ RequestTakerPtr SocketManager::requestTaker(void) { return std::static_pointer_cast(m_logic); } +void SocketManager::disconnectAllClients(void) { + for(int i = 0; i <= m_maxDesc; ++i) { + auto &desc = m_fds[i]; + if(desc.isUsed() && desc.isClient() && !desc.isListen()) + closeSocket(i); + } +} + } // namespace Cynara diff --git a/src/service/sockets/SocketManager.h b/src/service/sockets/SocketManager.h index ae0906b..6154322 100644 --- a/src/service/sockets/SocketManager.h +++ b/src/service/sockets/SocketManager.h @@ -54,6 +54,8 @@ public: m_logic.reset(); } + void disconnectAllClients(void); + private: LogicPtr m_logic; @@ -75,12 +77,13 @@ private: void closeSocket(int fd); bool handleRead(int fd, const RawBuffer &readbuffer); - void createDomainSocket(ProtocolPtr protocol, const std::string &path, mode_t mask); + void createDomainSocket(ProtocolPtr protocol, const std::string &path, mode_t mask, + bool client); static int createDomainSocketHelp(const std::string &path, mode_t mask); static int getSocketFromSystemD(const std::string &path); void createSignalSocket(ProtocolPtr protocol); - Descriptor &createDescriptor(int fd); + Descriptor &createDescriptor(int fd, bool client); void addReadSocket(int fd); void removeReadSocket(int fd); -- 2.7.4