From e1969fe524a8335b8664914748d6b4208385fdf7 Mon Sep 17 00:00:00 2001
From: Maxime Graulich <maxime.graulich@gmail.com>
Date: Mon, 15 Dec 2014 17:01:44 +0000
Subject: [PATCH] ONELAB2: Avoid SIGPIPE when client does not wait to close

---
 contrib/onelab2/OnelabServer.cpp | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/contrib/onelab2/OnelabServer.cpp b/contrib/onelab2/OnelabServer.cpp
index 669de1d870..b057dee1c3 100644
--- a/contrib/onelab2/OnelabServer.cpp
+++ b/contrib/onelab2/OnelabServer.cpp
@@ -337,7 +337,14 @@ void *listenOnClients(void *param)
           std::cout << "\033[0;31m" << "Client \"" << cli->getName() << "\" is going to stop" << "\033[0m" << std::endl; // DEBUG
           rep.msgType(OnelabProtocol::OnelabStop);
           recvlen = rep.encodeMsg(buff, 1024);
-          cli->sendto(buff, recvlen);
+          fd_set writefds;
+          struct timeval timeout;
+          timeout.tv_sec = 0;
+          timeout.tv_usec = 5000;
+          FD_ZERO(&writefds);
+          FD_SET(cli->getSSocket(), &writefds);
+          if(select(cli->getSSocket()+1, NULL, writefds, NULL, timeout) > 0)
+            cli->sendto(buff, recvlen);
           //UDT::epoll_remove_usock(eid, *it);
           UDT::epoll_remove_ssock(eid, *it);
           OnelabServer::instance()->removeClient(cli);
@@ -413,16 +420,6 @@ void *listenOnClients(void *param)
                 OnelabServer::instance()->getPtr((onelab::function **)&parameter, attr->getName(), cli->getName());
                 break;
               }
-              // TODO
-              //rep.msgType(OnelabProtocol::OnelabUpdate);
-              //rep.attrs.push_back(parameter);
-              //recvlen = rep.encodeMsg(buff, 1024);
-              //std::map<std::string, bool> clients = attr->getClients();
-              //for(std::map<std::string, bool>::const_iterator it = clients.begin(); it != clients.end(); it++) {
-              //	OnelabLocalNetworkClient *tmp = OnelabServer::instance()->getClient(it->first);
-              //	if(tmp == NULL || cli == tmp) continue;
-              //	tmp->sendto(buff, recvlen);
-              //}
             }
             else
               switch((*it)->getAttributeType()) {
-- 
GitLab