X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=plink.c;h=6ac5e0ac82bc5374efd2f07b435585ffb2bc3c8c;hb=38a6322cec74432917f1d3a1133903f1596d3083;hp=19b94b29a860e514fed18c7ee80af8fe6bd026dd;hpb=2b9707fcf86a9ce0dff558ea16efe9d3691ade29;p=PuTTY.git 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; @@ -317,6 +331,12 @@ int main(int argc, char **argv) { } } + /* + * Select port. + */ + if (portnumber != -1) + cfg.port = portnumber; + /* * Initialise WinSock. */ @@ -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);