Revamp of the local X11 connection code. We now parse X display
[u/mdw/putty] / windows / winsftp.c
index 2118897..94d04a7 100644 (file)
@@ -19,6 +19,12 @@ int get_userpass_input(prompts_t *p, unsigned char *in, int inlen)
     return ret;
 }
 
+void platform_get_x11_auth(struct X11Display *display, const Config *cfg)
+{
+    /* Do nothing, therefore no auth. */
+}
+const int platform_uses_x11_unix_by_default = TRUE;
+
 /* ----------------------------------------------------------------------
  * File access abstraction.
  */
@@ -431,7 +437,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,25 +469,13 @@ extern int select_result(WPARAM, LPARAM);
 
 int do_eventsel_loop(HANDLE other_event)
 {
-    int n, nhandles, nallhandles;
+    int n, nhandles, nallhandles, netindex, otherindex;
     long next, ticks;
     HANDLE *handles;
     SOCKET *sklist;
     int skcount;
     long now = GETTICKCOUNT();
 
-    if (!netevent) {
-       return -1;                     /* doom */
-    }
-
-    handles = handle_get_events(&nhandles);
-    handles = sresize(handles, nhandles+2, HANDLE);
-    nallhandles = nhandles;
-
-    handles[nallhandles++] = netevent;
-    if (other_event)
-       handles[nallhandles++] = other_event;
-
     if (run_timers(now, &next)) {
        ticks = next - GETTICKCOUNT();
        if (ticks < 0) ticks = 0;  /* just in case */
@@ -489,12 +483,24 @@ int do_eventsel_loop(HANDLE other_event)
        ticks = INFINITE;
     }
 
-    n = MsgWaitForMultipleObjects(nallhandles, 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 ((unsigned)(n - WAIT_OBJECT_0) < (unsigned)nhandles) {
        handle_got_event(handles[n - WAIT_OBJECT_0]);
-    } else if (n == WAIT_OBJECT_0 + nhandles) {
+    } else if (netindex >= 0 && n == WAIT_OBJECT_0 + netindex) {
        WSANETWORKEVENTS things;
        SOCKET socket;
        extern SOCKET first_socket(int *), next_socket(int *);
@@ -564,7 +570,7 @@ int do_eventsel_loop(HANDLE other_event)
        now = GETTICKCOUNT();
     }
 
-    if (other_event && n == WAIT_OBJECT_0 + nhandles + 1)
+    if (otherindex >= 0 && n == WAIT_OBJECT_0 + otherindex)
        return 1;
 
     return 0;
@@ -581,14 +587,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);
 
@@ -624,7 +630,7 @@ int ssh_sftp_loop_iteration(void)
 
        return 0;
     } else {
-       return do_eventsel_loop(NULL);
+       return do_eventsel_loop(INVALID_HANDLE_VALUE);
     }
 }