David Brinegar's workaround for an error reporting problem in some
[sgt/putty] / plink.c
diff --git a/plink.c b/plink.c
index 16a44b3..121c65f 100644 (file)
--- a/plink.c
+++ b/plink.c
@@ -119,18 +119,11 @@ void verify_ssh_host_key(char *host, int port, char *keytype,
     }
 }
 
-HANDLE outhandle, errhandle;
+HANDLE inhandle, outhandle, errhandle;
 DWORD orig_console_mode;
 
 WSAEVENT netevent;
 
-void begin_session(void) {
-    if (!cfg.ldisc_term)
-        SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), ENABLE_PROCESSED_INPUT);
-    else
-        SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), orig_console_mode);
-}
-
 void from_backend(int is_stderr, char *data, int len) {
     int pos;
     DWORD ret;
@@ -144,18 +137,35 @@ void from_backend(int is_stderr, char *data, int len) {
     }
 }
 
+int term_ldisc(int mode) { return FALSE; }
+void ldisc_update(int echo, int edit) {
+    /* Update stdin read mode to reflect changes in line discipline. */
+    DWORD mode;
+
+    mode = ENABLE_PROCESSED_INPUT;
+    if (echo)
+        mode = mode | ENABLE_ECHO_INPUT;
+    else
+        mode = mode &~ ENABLE_ECHO_INPUT;
+    if (edit)
+        mode = mode | ENABLE_LINE_INPUT;
+    else
+        mode = mode &~ ENABLE_LINE_INPUT;
+    SetConsoleMode(inhandle, mode);
+}
+
 struct input_data {
     DWORD len;
     char buffer[4096];
     HANDLE event, eventback;
 };
 
-static int get_password(const char *prompt, char *str, int maxlen)
+static int get_line(const char *prompt, char *str, int maxlen, int is_pw)
 {
     HANDLE hin, hout;
-    DWORD savemode, i;
+    DWORD savemode, newmode, i;
 
-    if (password) {
+    if (is_pw && password) {
         static int tried_once = 0;
 
         if (tried_once) {
@@ -176,8 +186,12 @@ static int get_password(const char *prompt, char *str, int maxlen)
     }
 
     GetConsoleMode(hin, &savemode);
-    SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) |
-                   ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT);
+    newmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT;
+    if (is_pw)
+        newmode &= ~ENABLE_ECHO_INPUT;
+    else
+        newmode |= ENABLE_ECHO_INPUT;
+    SetConsoleMode(hin, newmode);
 
     WriteFile(hout, prompt, strlen(prompt), &i, NULL);
     ReadFile(hin, str, maxlen-1, &i, NULL);
@@ -187,7 +201,8 @@ static int get_password(const char *prompt, char *str, int maxlen)
     if ((int)i > maxlen) i = maxlen-1; else i = i - 2;
     str[i] = '\0';
 
-    WriteFile(hout, "\r\n", 2, &i, NULL);
+    if (is_pw)
+        WriteFile(hout, "\r\n", 2, &i, NULL);
 
     return 1;
 }
@@ -255,7 +270,7 @@ int main(int argc, char **argv) {
     int skcount, sksize;
     int connopen;
 
-    ssh_get_password = get_password;
+    ssh_get_line = get_line;
 
     sklist = NULL; skcount = sksize = 0;
 
@@ -377,7 +392,7 @@ int main(int argc, char **argv) {
                             /* No settings for this host; use defaults */
                             strncpy(cfg.host, p, sizeof(cfg.host)-1);
                             cfg.host[sizeof(cfg.host)-1] = '\0';
-                            cfg.port = 22;
+                            cfg.port = default_port;
                         } else
                             cfg = cfg2;
                     } else {
@@ -386,7 +401,7 @@ int main(int argc, char **argv) {
                         cfg.username[sizeof(cfg.username)-1] = '\0';
                         strncpy(cfg.host, r, sizeof(cfg.host)-1);
                         cfg.host[sizeof(cfg.host)-1] = '\0';
-                        cfg.port = 22;
+                        cfg.port = default_port;
                     }
                 }
             } else {
@@ -403,7 +418,6 @@ int main(int argc, char **argv) {
                     len2 = strlen(cp); len -= len2; cp += len2;
                 }
                 cfg.nopty = TRUE;      /* command => no terminal */
-                cfg.ldisc_term = TRUE; /* use stdin like a line buffer */
                 break;                 /* done with cmdline */
             }
        }
@@ -475,10 +489,11 @@ int main(int argc, char **argv) {
 
     stdinevent = CreateEvent(NULL, FALSE, FALSE, NULL);
 
-    GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &orig_console_mode);
-    SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), ENABLE_PROCESSED_INPUT);
+    inhandle = GetStdHandle(STD_INPUT_HANDLE);
     outhandle = GetStdHandle(STD_OUTPUT_HANDLE);
     errhandle = GetStdHandle(STD_ERROR_HANDLE);
+    GetConsoleMode(inhandle, &orig_console_mode);
+    SetConsoleMode(inhandle, ENABLE_PROCESSED_INPUT);
 
     /*
      * Turn off ECHO and LINE input modes. We don't care if this
@@ -557,7 +572,7 @@ int main(int argc, char **argv) {
                 WPARAM wp;
                 socket = sklist[i];
                 wp = (WPARAM)socket;
-               if (!WSAEnumNetworkEvents(socket, netevent, &things)) {
+               if (!WSAEnumNetworkEvents(socket, NULL, &things)) {
                     noise_ultralight(socket);
                     noise_ultralight(things.lNetworkEvents);
                    if (things.lNetworkEvents & FD_READ)