allow one more read from socket after input is closed (fix #555)

This commit is contained in:
John
2022-03-12 13:03:22 +01:00
parent 2236f165e8
commit 320782c298
+21 -9
View File
@@ -143,7 +143,7 @@ string fetchData(ebusd::TCPSocket* socket, bool &listening, uint16_t timeout, bo
// set timeout // set timeout
tdiff.tv_sec = 0; tdiff.tv_sec = 0;
tdiff.tv_nsec = 1E8; tdiff.tv_nsec = 200000000; // 200 ms
time_t now; time_t now;
time(&now); time(&now);
time_t endTime = now + timeout; time_t endTime = now + timeout;
@@ -153,11 +153,14 @@ string fetchData(ebusd::TCPSocket* socket, bool &listening, uint16_t timeout, bo
memset(fds, 0, sizeof(fds)); memset(fds, 0, sizeof(fds));
fds[0].fd = STDIN_FILENO; #define IDX_STDIN 1
fds[0].events = POLLIN | POLLERR | POLLHUP | POLLRDHUP; #define IDX_SOCK 0
fds[1].fd = socket->getFD(); fds[IDX_STDIN].fd = STDIN_FILENO;
fds[1].events = POLLIN | POLLERR | POLLHUP | POLLRDHUP; fds[IDX_STDIN].events = POLLIN | POLLERR | POLLHUP | POLLRDHUP;
fds[IDX_SOCK].fd = socket->getFD();
fds[IDX_SOCK].events = POLLIN | POLLERR | POLLHUP | POLLRDHUP;
#else #else
#ifdef HAVE_PSELECT #ifdef HAVE_PSELECT
int maxfd; int maxfd;
@@ -173,6 +176,7 @@ string fetchData(ebusd::TCPSocket* socket, bool &listening, uint16_t timeout, bo
#endif #endif
#endif #endif
bool inputClosed = false;
while (!errored && time(&now) && now < endTime) { while (!errored && time(&now) && now < endTime) {
#ifdef HAVE_PPOLL #ifdef HAVE_PPOLL
// wait for new fd event // wait for new fd event
@@ -182,9 +186,17 @@ string fetchData(ebusd::TCPSocket* socket, bool &listening, uint16_t timeout, bo
errored = true; errored = true;
break; break;
} }
if (ret > 0 && ((fds[0].revents & POLLERR) || (fds[1].revents & POLLERR))) { if (ret > 0 && ((fds[IDX_STDIN].revents & POLLERR) || (fds[IDX_SOCK].revents & POLLERR))) {
errored = true; errored = true;
} else if (ret > 0 && ((fds[0].revents & (POLLHUP | POLLRDHUP)) || (fds[1].revents & (POLLHUP | POLLRDHUP)))) { break;
}
if (ret > 0 && (fds[IDX_STDIN].revents & (POLLHUP | POLLRDHUP))) {
inputClosed = true; // wait once more for data to arrive
nfds = 1; // stop polling stdin
} else if (inputClosed && !errored) {
errored = true;
}
if (ret > 0 && (fds[IDX_SOCK].revents & (POLLHUP | POLLRDHUP))) {
errored = true; errored = true;
} }
#else #else
@@ -201,10 +213,10 @@ string fetchData(ebusd::TCPSocket* socket, bool &listening, uint16_t timeout, bo
if (ret != 0) { if (ret != 0) {
#ifdef HAVE_PPOLL #ifdef HAVE_PPOLL
// new data from notify // new data from notify
newInput = fds[0].revents & POLLIN; newInput = fds[IDX_STDIN].revents & POLLIN;
// new data from socket // new data from socket
newData = fds[1].revents & POLLIN; newData = fds[IDX_SOCK].revents & POLLIN;
#else #else
#ifdef HAVE_PSELECT #ifdef HAVE_PSELECT
// new data from notify // new data from notify