mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-05-30 00:04: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:
parent
2b9707fcf8
commit
8805d0b50e
79
plink.c
79
plink.c
@ -165,6 +165,22 @@ int main(int argc, char **argv) {
|
|||||||
do_defaults(NULL);
|
do_defaults(NULL);
|
||||||
default_protocol = cfg.protocol;
|
default_protocol = cfg.protocol;
|
||||||
default_port = cfg.port;
|
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) {
|
while (--argc) {
|
||||||
char *p = *++argv;
|
char *p = *++argv;
|
||||||
if (*p == '-') {
|
if (*p == '-') {
|
||||||
@ -293,8 +309,6 @@ int main(int argc, char **argv) {
|
|||||||
if (!*cfg.host) {
|
if (!*cfg.host) {
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
if (portnumber != -1)
|
|
||||||
cfg.port = portnumber;
|
|
||||||
|
|
||||||
if (!*cfg.remote_cmd)
|
if (!*cfg.remote_cmd)
|
||||||
flags |= FLAG_INTERACTIVE;
|
flags |= FLAG_INTERACTIVE;
|
||||||
@ -317,6 +331,12 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Select port.
|
||||||
|
*/
|
||||||
|
if (portnumber != -1)
|
||||||
|
cfg.port = portnumber;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialise WinSock.
|
* Initialise WinSock.
|
||||||
*/
|
*/
|
||||||
@ -369,6 +389,33 @@ int main(int argc, char **argv) {
|
|||||||
sending = FALSE;
|
sending = FALSE;
|
||||||
while (1) {
|
while (1) {
|
||||||
int n;
|
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);
|
n = WaitForMultipleObjects(2, handles, FALSE, INFINITE);
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
WSANETWORKEVENTS things;
|
WSANETWORKEVENTS things;
|
||||||
@ -381,34 +428,6 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
term_out();
|
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) {
|
} else if (n == 1) {
|
||||||
if (idata.len > 0) {
|
if (idata.len > 0) {
|
||||||
back->send(idata.buffer, idata.len);
|
back->send(idata.buffer, idata.len);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user