Checking for closed peer connection before send
authorTamás Földesi <tamas.foldesi@more.no>
Tue, 30 Jun 2015 17:06:28 +0000 (19:06 +0200)
committerFlorian Forster <octo@collectd.org>
Fri, 13 Nov 2015 09:56:57 +0000 (10:56 +0100)
src/common.c

index c284942..7adbe2e 100644 (file)
@@ -44,6 +44,8 @@
 #include <sys/socket.h>
 #include <netdb.h>
 
+#include <poll.h>
+
 #if HAVE_NETINET_IN_H
 # include <netinet/in.h>
 #endif
@@ -265,9 +267,23 @@ ssize_t swrite (int fd, const void *buf, size_t count)
        const char *ptr;
        size_t      nleft;
        ssize_t     status;
+       struct      pollfd pfd;
 
        ptr   = (const char *) buf;
        nleft = count;
+       
+       /* checking for closed peer connection */
+       pfd.fd = fd;
+       pfd.events = POLLIN | POLLHUP | POLLRDNORM;
+       pfd.revents = 0;
+       if (poll(&pfd, 1, 0) > 0) {
+               char buffer[32];
+               if (recv(fd, buffer, sizeof(buffer), MSG_PEEK | MSG_DONTWAIT) == 0) {
+                       // if recv returns zero (even though poll() said there is data to be read),
+                       // that means the connection has been closed
+                       return -1;
+               }
+       }
 
        while (nleft > 0)
        {