Rethink the whole line discipline architecture. Instead of having
[u/mdw/putty] / plink.c
diff --git a/plink.c b/plink.c
index f5f6c8a..6cbc2f6 100644 (file)
--- a/plink.c
+++ b/plink.c
@@ -7,6 +7,7 @@
 #endif
 #include <windows.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <stdarg.h>
 
 #define PUTTY_DO_GLOBALS                      /* actually _define_ globals */
@@ -16,7 +17,7 @@
 
 void fatalbox (char *p, ...) {
     va_list ap;
-    fprintf(stderr, "FATAL ERROR: ", p);
+    fprintf(stderr, "FATAL ERROR: ");
     va_start(ap, p);
     vfprintf(stderr, p, ap);
     va_end(ap);
@@ -26,7 +27,7 @@ void fatalbox (char *p, ...) {
 }
 void connection_fatal (char *p, ...) {
     va_list ap;
-    fprintf(stderr, "FATAL ERROR: ", p);
+    fprintf(stderr, "FATAL ERROR: ");
     va_start(ap, p);
     vfprintf(stderr, p, ap);
     va_end(ap);
@@ -118,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;
@@ -143,6 +137,23 @@ 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];
@@ -370,13 +381,15 @@ int main(int argc, char **argv) {
                         /*
                          * One string.
                          */
-                        do_defaults (p, &cfg);
-                        if (cfg.host[0] == '\0') {
+                        Config cfg2;
+                        do_defaults (p, &cfg2);
+                        if (cfg2.host[0] == '\0') {
                             /* 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;
-                        }
+                        } else
+                            cfg = cfg2;
                     } else {
                         *r++ = '\0';
                         strncpy(cfg.username, p, sizeof(cfg.username)-1);
@@ -400,7 +413,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 */
             }
        }
@@ -472,10 +484,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
@@ -554,7 +567,9 @@ 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)
                        connopen &= select_result(wp, (LPARAM)FD_READ);
                    if (things.lNetworkEvents & FD_CLOSE)
@@ -566,6 +581,7 @@ int main(int argc, char **argv) {
                }
            }
         } else if (n == 1) {
+            noise_ultralight(idata.len);
             if (idata.len > 0) {
                 back->send(idata.buffer, idata.len);
             } else {