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.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index 12ea28a399..04ea747564 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -963,7 +963,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 = 0;
+ int selrtn;
struct timeval to;
int maxfd = 0;
@@ -986,7 +986,7 @@ static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *
&r_fds, &w_fds, &to, &maxfd);
/* Process a signal and timed events now... */
- if (run_events(smbd_event_context(), &selrtn, NULL, NULL)) {
+ if (run_events(smbd_event_context(), 0, NULL, NULL)) {
return NT_STATUS_RETRY;
}
@@ -1003,23 +1003,26 @@ static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *
/* Check if error */
if (selrtn == -1) {
- if (errno == EINTR)
- return NT_STATUS_RETRY;
- else
- /* Maybe the socket is dead? */
- return map_nt_error_from_unix(errno);
- }
-
- /* 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);
+ /* something is wrong. 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;
+ }
- /* Processed all fds or timed out */
+ /* Did we timeout ? */
if (selrtn == 0) {
return NT_STATUS_RETRY;
}