From 8cb9c947887dc7c26e7d02ccdb59e092c88e46a2 Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 5 Oct 2000 12:15:22 +0000 Subject: [PATCH] We now honour the PLINK_PROTOCOL environment variable if it's set. Also we are able to notice when a backend is instantly sendok(), rather than waiting until after the first successful socket read. (This was zogging raw connections. They're still slightly zogged but not as badly as they were.) git-svn-id: svn://svn.tartarus.org/sgt/putty@671 cda61777-01e9-0310-a592-d414129be87e --- plink.c | 79 ++++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 30 deletions(-) diff --git a/plink.c b/plink.c index 19b94b29..6ac5e0ac 100644 --- a/plink.c +++ b/plink.c @@ -165,6 +165,22 @@ int main(int argc, char **argv) { do_defaults(NULL); default_protocol = cfg.protocol; default_port = cfg.port; + { + /* + * Override the default protocol if PLINK_PROTOCOL is set. + */ + char *p = getenv("PLINK_PROTOCOL"); + int i; + if (p) { + for (i = 0; backends[i].backend != NULL; i++) { + if (!strcmp(backends[i].name, p)) { + default_protocol = cfg.protocol = backends[i].protocol; + default_port = cfg.port = backends[i].backend->default_port; + break; + } + } + } + } while (--argc) { char *p = *++argv; if (*p == '-') { @@ -293,8 +309,6 @@ int main(int argc, char **argv) { if (!*cfg.host) { usage(); } - if (portnumber != -1) - cfg.port = portnumber; if (!*cfg.remote_cmd) flags |= FLAG_INTERACTIVE; @@ -318,6 +332,12 @@ int main(int argc, char **argv) { } /* + * Select port. + */ + if (portnumber != -1) + cfg.port = portnumber; + + /* * Initialise WinSock. */ winsock_ver = MAKEWORD(2, 0); @@ -369,6 +389,33 @@ int main(int argc, char **argv) { sending = FALSE; while (1) { int n; + + if (!sending && back->sendok()) { + /* + * Create a separate thread to read from stdin. This is + * a total pain, but I can't find another way to do it: + * + * - an overlapped ReadFile or ReadFileEx just doesn't + * happen; we get failure from ReadFileEx, and + * ReadFile blocks despite being given an OVERLAPPED + * structure. Perhaps we can't do overlapped reads + * on consoles. WHY THE HELL NOT? + * + * - WaitForMultipleObjects(netevent, console) doesn't + * work, because it signals the console when + * _anything_ happens, including mouse motions and + * other things that don't cause data to be readable + * - so we're back to ReadFile blocking. + */ + idata.event = stdinevent; + if (!CreateThread(NULL, 0, stdin_read_thread, + &idata, 0, &threadid)) { + fprintf(stderr, "Unable to create second thread\n"); + exit(1); + } + sending = TRUE; + } + n = WaitForMultipleObjects(2, handles, FALSE, INFINITE); if (n == 0) { WSANETWORKEVENTS things; @@ -381,34 +428,6 @@ int main(int argc, char **argv) { } } term_out(); - if (!sending && back->sendok()) { - /* - * Create a separate thread to read from stdin. - * This is a total pain, but I can't find another - * way to do it: - * - * - an overlapped ReadFile or ReadFileEx just - * doesn't happen; we get failure from - * ReadFileEx, and ReadFile blocks despite being - * given an OVERLAPPED structure. Perhaps we - * can't do overlapped reads on consoles. WHY - * THE HELL NOT? - * - * - WaitForMultipleObjects(netevent, console) - * doesn't work, because it signals the console - * when _anything_ happens, including mouse - * motions and other things that don't cause - * data to be readable - so we're back to - * ReadFile blocking. - */ - idata.event = stdinevent; - if (!CreateThread(NULL, 0, stdin_read_thread, - &idata, 0, &threadid)) { - fprintf(stderr, "Unable to create second thread\n"); - exit(1); - } - sending = TRUE; - } } else if (n == 1) { if (idata.len > 0) { back->send(idata.buffer, idata.len); -- 2.11.0