Proper return value from 'swrite()' when connection has been closed
authorPavel Rochnyack <pavel2000@ngs.ru>
Mon, 31 Jul 2017 05:21:24 +0000 (12:21 +0700)
committerPavel Rochnyack <pavel2000@ngs.ru>
Tue, 26 Sep 2017 20:05:33 +0000 (03:05 +0700)
According to POSIX, errno is set only if 'recv()' returns -1.
When connection has been closed, 'recv()' returns 0 and errno left untouched.
For functions which check errno value after 'swrite()', errno now is set to ECONNRESET,
so they produce correct message 'Connection reset by peer'.

src/daemon/common.c

index 3ae61d8..6c856a6 100644 (file)
@@ -269,7 +269,8 @@ ssize_t swrite(int fd, const void *buf, size_t count) {
     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 errno ? errno : -1;
+      errno = ECONNRESET;
+      return -1;
     }
   }