Add disconnectAllClients() function in SocketManager 40/25240/2
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Thu, 31 Jul 2014 14:33:17 +0000 (16:33 +0200)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Thu, 31 Jul 2014 15:48:29 +0000 (17:48 +0200)
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
src/service/sockets/Descriptor.h
src/service/sockets/SocketManager.cpp
src/service/sockets/SocketManager.h

index f58d28e..df7ddb4 100644 (file)
@@ -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();
index b49ef03..be9e62a 100644 (file)
@@ -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);
 
index 55edc02..0c269af 100644 (file)
@@ -74,8 +74,9 @@ void SocketManager::init(void) {
     const mode_t clientSocketUMask(0);
     const mode_t adminSocketUMask(0077);
 
-    createDomainSocket(std::make_shared<ProtocolClient>(), clientSocketPath, clientSocketUMask);
-    createDomainSocket(std::make_shared<ProtocolAdmin>(), adminSocketPath, adminSocketUMask);
+    createDomainSocket(std::make_shared<ProtocolClient>(), clientSocketPath, clientSocketUMask,
+                       true);
+    createDomainSocket(std::make_shared<ProtocolAdmin>(), adminSocketPath, adminSocketUMask, false);
     createSignalSocket(std::make_shared<ProtocolSignal>());
     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<int>(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<RequestTaker>(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
index ae0906b..6154322 100644 (file)
@@ -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);