summaryrefslogtreecommitdiff
path: root/source3/smbd/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/smbd/process.c')
-rw-r--r--source3/smbd/process.c35
1 files changed, 16 insertions, 19 deletions
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index a484dfd3f2..8d36dd3c89 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -949,7 +949,7 @@ void smbd_setup_sig_hup_handler(struct tevent_context *ev,
static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *conn)
{
fd_set r_fds, w_fds;
- int selrtn;
+ int selrtn = 0;
struct timeval to;
int maxfd = 0;
@@ -977,7 +977,7 @@ static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *
}
/* Process a signal and timed events now... */
- if (run_events(smbd_event_context(), 0, NULL, NULL)) {
+ if (run_events(smbd_event_context(), &selrtn, NULL, NULL)) {
return NT_STATUS_RETRY;
}
@@ -994,26 +994,23 @@ static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *
/* Check if error */
if (selrtn == -1) {
- /* something is wrong. Maybe the socket is dead? */
- return map_nt_error_from_unix(errno);
+ if (errno == EINTR)
+ return NT_STATUS_RETRY;
+ else
+ /* Maybe the socket is dead? */
+ return map_nt_error_from_unix(errno);
}
- if ((conn->smb1.echo_handler.trusted_fd != -1)
- && FD_ISSET(conn->sock, &r_fds)
- && FD_ISSET(conn->smb1.echo_handler.trusted_fd, &r_fds)) {
- /*
- * Prefer to read pending requests from the echo handler. To
- * quote Jeremy (da70f8ab1): This is a hack of monstrous
- * proportions...
- */
- FD_CLR(conn->sock, &r_fds);
- }
-
- if (run_events(smbd_event_context(), selrtn, &r_fds, &w_fds)) {
- return NT_STATUS_RETRY;
- }
+ /* Process events until all available fds have been handled.
+ * This allows for fair round-robin handling of all available fds
+ * on each select() wakeup, while still maintaining responsiveness
+ * by re-checking for signal and timed events between the handling
+ * of each ready fd. */
+ do {
+ run_events(smbd_event_context(), &selrtn, &r_fds, &w_fds);
+ } while (selrtn > 0);
- /* Did we timeout ? */
+ /* Processed all fds or timed out */
if (selrtn == 0) {
return NT_STATUS_RETRY;
}