X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/0ac1920cf35f15c8fd8dbfedb332bd79e5ecdd33..2733b5cbea482cab35d9318a4f8a7fbeb845668e:/windows/winsftp.c diff --git a/windows/winsftp.c b/windows/winsftp.c index d14e817e..f3c0a6fb 100644 --- a/windows/winsftp.c +++ b/windows/winsftp.c @@ -431,7 +431,7 @@ char *dir_file_cat(char *dir, char *file) * Be told what socket we're supposed to be using. */ static SOCKET sftp_ssh_socket = INVALID_SOCKET; -static HANDLE netevent = NULL; +static HANDLE netevent = INVALID_HANDLE_VALUE; char *do_select(SOCKET skt, int startup) { int events; @@ -463,20 +463,13 @@ extern int select_result(WPARAM, LPARAM); int do_eventsel_loop(HANDLE other_event) { - int n; + int n, nhandles, nallhandles, netindex, otherindex; long next, ticks; - HANDLE handles[2]; + HANDLE *handles; SOCKET *sklist; int skcount; long now = GETTICKCOUNT(); - if (!netevent) { - return -1; /* doom */ - } - - handles[0] = netevent; - handles[1] = other_event; - if (run_timers(now, &next)) { ticks = next - GETTICKCOUNT(); if (ticks < 0) ticks = 0; /* just in case */ @@ -484,10 +477,24 @@ int do_eventsel_loop(HANDLE other_event) ticks = INFINITE; } - n = MsgWaitForMultipleObjects(other_event ? 2 : 1, handles, FALSE, ticks, - QS_POSTMESSAGE); + handles = handle_get_events(&nhandles); + handles = sresize(handles, nhandles+2, HANDLE); + nallhandles = nhandles; + + if (netevent != INVALID_HANDLE_VALUE) + handles[netindex = nallhandles++] = netevent; + else + netindex = -1; + if (other_event != INVALID_HANDLE_VALUE) + handles[otherindex = nallhandles++] = other_event; + else + otherindex = -1; + + n = WaitForMultipleObjects(nallhandles, handles, FALSE, ticks); - if (n == WAIT_OBJECT_0 + 0) { + if ((unsigned)(n - WAIT_OBJECT_0) < (unsigned)nhandles) { + handle_got_event(handles[n - WAIT_OBJECT_0]); + } else if (netindex >= 0 && n == WAIT_OBJECT_0 + netindex) { WSANETWORKEVENTS things; SOCKET socket; extern SOCKET first_socket(int *), next_socket(int *); @@ -549,13 +556,15 @@ int do_eventsel_loop(HANDLE other_event) sfree(sklist); } + sfree(handles); + if (n == WAIT_TIMEOUT) { now = next; } else { now = GETTICKCOUNT(); } - if (other_event && n == WAIT_OBJECT_0 + 1) + if (otherindex >= 0 && n == WAIT_OBJECT_0 + otherindex) return 1; return 0; @@ -572,14 +581,14 @@ int do_eventsel_loop(HANDLE other_event) */ int ssh_sftp_loop_iteration(void) { - if (sftp_ssh_socket == INVALID_SOCKET) - return -1; /* doom */ - if (p_WSAEventSelect == NULL) { fd_set readfds; int ret; long now = GETTICKCOUNT(); + if (sftp_ssh_socket == INVALID_SOCKET) + return -1; /* doom */ + if (socket_writable(sftp_ssh_socket)) select_result((WPARAM) sftp_ssh_socket, (LPARAM) FD_WRITE); @@ -615,7 +624,7 @@ int ssh_sftp_loop_iteration(void) return 0; } else { - return do_eventsel_loop(NULL); + return do_eventsel_loop(INVALID_HANDLE_VALUE); } }