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");
}
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);
}
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);
return;
}
- auto &desc = createDescriptor(fd);
+ auto &desc = createDescriptor(fd, false);
desc.setListen(false);
desc.setProtocol(protocol);
addReadSocket(fd);
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()))
}
auto &desc = m_fds[fd];
desc.setUsed(true);
+ desc.setClient(client);
return desc;
}
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
m_logic.reset();
}
+ void disconnectAllClients(void);
+
private:
LogicPtr m_logic;
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);