1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-05-28 15:24:49 -05:00

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.)

[originally from svn r671]
This commit is contained in:
Simon Tatham 2000-10-05 12:15:22 +00:00
parent 2b9707fcf8
commit 8805d0b50e

79
plink.c
View File

@ -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);