X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fdaemon%2Fcommon.c;h=dd4f9b15ae39a5036cbb0b40f0b8c21624ee473a;hb=42a7c90f4478e98dc970927cfda7ec2e1081f364;hp=068b9999c6fa7649986268a2707bbb993339970f;hpb=4cafc1402997b570a66ed17400e8be4da6de4224;p=collectd.git diff --git a/src/daemon/common.c b/src/daemon/common.c index 068b9999..dd4f9b15 100644 --- a/src/daemon/common.c +++ b/src/daemon/common.c @@ -46,9 +46,10 @@ /* for getaddrinfo */ #include -#include #include +#include + #if HAVE_NETINET_IN_H # include #endif @@ -270,9 +271,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; + 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) { @@ -356,7 +371,7 @@ int strjoin (char *buffer, size_t buffer_size, } assert (buffer[buffer_size - 1] == 0); - return (strlen (buffer)); + return ((int) strlen (buffer)); } int strsubstitute (char *str, char c_from, char c_to) @@ -1154,6 +1169,9 @@ int parse_values (char *buffer, value_list_t *vl, const data_set_t *ds) char *ptr; char *saveptr; + if ((buffer == NULL) || (vl == NULL) || (ds == NULL)) + return EINVAL; + i = 0; dummy = buffer; saveptr = NULL;