# define POLLWRITEFLAGS POLLWRNORM
#endif
-/* Figure out what bits indicate errors */
-#ifdef POLLHUP
-# define POLLERRORS (POLLHUP|POLLERR)
-#else
-# define POLLERRORS POLLERR
-#endif
-
static struct Socket** sockList;
static struct pollfd* pollfdList;
static unsigned int poll_count;
int nfds;
int i;
int errcode;
- size_t codesize;
+ socklen_t codesize;
struct Socket *sock;
while (running) {
/* Log the poll error */
log_write(LS_SOCKET, L_ERROR, 0, "poll() error: %m");
if (!errors++)
- timer_add(&clear_error, error_clear, 0, TT_PERIODIC,
+ timer_add(timer_init(&clear_error), error_clear, 0, TT_PERIODIC,
ERROR_EXPIRE_TIME);
else if (errors > POLL_ERROR_THRESHOLD) /* too many errors... */
server_restart("too many poll errors");
}
}
+#ifdef POLLHUP
+ if (pollfdList[i].revents & POLLHUP) { /* hang-up on socket */
+ Debug((DEBUG_ENGINE, "poll: EOF from client (POLLHUP)"));
+ event_generate(ET_EOF, sock, 0);
+ nfds--;
+ continue;
+ }
+#endif /* POLLHUP */
+
switch (s_state(sock)) {
case SS_CONNECTING:
if (pollfdList[i].revents & POLLWRITEFLAGS) { /* connect completed */
break;
}
- assert(s_fd(sock) == pollfdList[i].fd);
-
gen_ref_dec(sock); /* we're done with it */
}