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