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 -- [email protected]
To unsubscribe send an email to [email protected]
