Changeset: dfd0f558ac27 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dfd0f558ac27
Modified Files:
        common/stream/socket_stream.c
Branch: Aug2024
Log Message:

If poll returns the POLLHUP bit, return EOF.


diffs (79 lines):

diff --git a/common/stream/socket_stream.c b/common/stream/socket_stream.c
--- a/common/stream/socket_stream.c
+++ b/common/stream/socket_stream.c
@@ -289,40 +289,47 @@ socket_read(stream *restrict s, void *re
 #endif
 
                        ret = poll(&pfd, 1, (int) s->timeout);
-                       if (ret == -1 && errno == EINTR)
-                               continue;
-                       if (ret == -1 || (pfd.revents & POLLERR)) {
+                       if (ret == -1) {
+                               if (errno == EINTR)
+                                       continue;
                                mnstr_set_error_errno(s, MNSTR_READ_ERROR, 
"poll error");
                                return -1;
                        }
-                       if (ret == 1 && pfd.revents & POLLPRI) {
-                               /* discard regular data until OOB mark */
-                               for (;;) {
-                                       int atmark = 0;
-                                       char flush[100];
-                                       if (ioctlsocket(s->stream_data.s, 
SIOCATMARK, &atmark) < 0) {
-                                               perror("ioctl");
-                                               break;
+                       if (ret == 1) {
+                               if (pfd.revents & POLLHUP) {
+                                       /* hung up, return EOF */
+                                       s->eof = true;
+                                       return 0;
+                               }
+                               if (pfd.revents & POLLPRI) {
+                                       /* discard regular data until OOB mark 
*/
+                                       for (;;) {
+                                               int atmark = 0;
+                                               char flush[100];
+                                               if 
(ioctlsocket(s->stream_data.s, SIOCATMARK, &atmark) < 0) {
+                                                       perror("ioctl");
+                                                       break;
+                                               }
+                                               if (atmark)
+                                                       break;
+                                               if (recv(s->stream_data.s, 
flush, sizeof(flush), 0) < 0) {
+                                                       perror("recv");
+                                                       break;
+                                               }
                                        }
-                                       if (atmark)
-                                               break;
-                                       if (recv(s->stream_data.s, flush, 
sizeof(flush), 0) < 0) {
-                                               perror("recv");
-                                               break;
+                                       char b = 0;
+                                       switch (recv(s->stream_data.s, &b, 1, 
MSG_OOB)) {
+                                       case 0:
+                                               /* unexpectedly didn't receive 
a byte */
+                                               continue;
+                                       case 1:
+                                               mnstr_set_error(s, 
MNSTR_INTERRUPT, "query abort from client");
+                                               return -1;
+                                       case -1:
+                                               mnstr_set_error_errno(s, 
MNSTR_READ_ERROR, "recv error");
+                                               return -1;
                                        }
                                }
-                               char b = 0;
-                               switch (recv(s->stream_data.s, &b, 1, MSG_OOB)) 
{
-                               case 0:
-                                       /* unexpectedly didn't receive a byte */
-                                       continue;
-                               case 1:
-                                       mnstr_set_error(s, MNSTR_INTERRUPT, 
"query abort from client");
-                                       return -1;
-                               case -1:
-                                       mnstr_set_error_errno(s, 
MNSTR_READ_ERROR, "recv error");
-                                       return -1;
-                               }
                        }
 #else
                        struct timeval tv;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to