~mdw
/
sgt
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
I believe MAC/CRC errors can be caused by network corruption, in principle.
[sgt/putty]
/
windows
/
winplink.c
diff --git
a/windows/winplink.c
b/windows/winplink.c
index
b99646a
..
9fca63c
100644
(file)
--- a/
windows/winplink.c
+++ b/
windows/winplink.c
@@
-217,7
+217,6
@@
static void usage(void)
printf(" force use of a particular protocol\n");
printf(" -P port connect to specified port\n");
printf(" -l user connect with specified username\n");
printf(" force use of a particular protocol\n");
printf(" -P port connect to specified port\n");
printf(" -l user connect with specified username\n");
- printf(" -m file read remote command(s) from file\n");
printf(" -batch disable all interactive prompts\n");
printf("The following options only apply to SSH connections:\n");
printf(" -pw passw login with specified password\n");
printf(" -batch disable all interactive prompts\n");
printf("The following options only apply to SSH connections:\n");
printf(" -pw passw login with specified password\n");
@@
-231,8
+230,10
@@
static void usage(void)
printf(" -A -a enable / disable agent forwarding\n");
printf(" -t -T enable / disable pty allocation\n");
printf(" -1 -2 force use of particular protocol version\n");
printf(" -A -a enable / disable agent forwarding\n");
printf(" -t -T enable / disable pty allocation\n");
printf(" -1 -2 force use of particular protocol version\n");
+ printf(" -4 -6 force use of IPv4 or IPv6\n");
printf(" -C enable compression\n");
printf(" -i key private key file for authentication\n");
printf(" -C enable compression\n");
printf(" -i key private key file for authentication\n");
+ printf(" -m file read remote command(s) from file\n");
printf(" -s remote command is an SSH subsystem (SSH-2 only)\n");
printf(" -N don't start a shell/command (SSH-2 only)\n");
exit(1);
printf(" -s remote command is an SSH subsystem (SSH-2 only)\n");
printf(" -N don't start a shell/command (SSH-2 only)\n");
exit(1);
@@
-270,7
+271,7
@@
int main(int argc, char **argv)
HANDLE handles[4];
DWORD in_threadid, out_threadid, err_threadid;
struct input_data idata;
HANDLE handles[4];
DWORD in_threadid, out_threadid, err_threadid;
struct input_data idata;
- int reading;
+ int reading
= FALSE
;
int sending;
int portnumber = -1;
SOCKET *sklist;
int sending;
int portnumber = -1;
SOCKET *sklist;
@@
-279,6
+280,7
@@
int main(int argc, char **argv)
int exitcode;
int errors;
int use_subsystem = 0;
int exitcode;
int errors;
int use_subsystem = 0;
+ long now, next;
ssh_get_line = console_get_line;
ssh_get_line = console_get_line;
@@
-423,8
+425,6
@@
int main(int argc, char **argv)
cfg.port = default_port;
} else {
cfg = cfg2;
cfg.port = default_port;
} else {
cfg = cfg2;
- /* Ick: patch up internal pointer after copy */
- cfg.remote_cmd_ptr = cfg.remote_cmd;
}
}
}
}
@@
-527,7
+527,7
@@
int main(int argc, char **argv)
cfg.host[p1] = '\0';
}
cfg.host[p1] = '\0';
}
- if (!
*cfg.remote_cmd_ptr
)
+ if (!
cfg.remote_cmd_ptr && !*cfg.remote_cmd
)
flags |= FLAG_INTERACTIVE;
/*
flags |= FLAG_INTERACTIVE;
/*
@@
-631,8
+631,11
@@
int main(int argc, char **argv)
cleanup_exit(1);
}
cleanup_exit(1);
}
+ now = GETTICKCOUNT();
+
while (1) {
int n;
while (1) {
int n;
+ DWORD ticks;
if (!sending && back->sendok(backhandle)) {
/*
if (!sending && back->sendok(backhandle)) {
/*
@@
-659,11
+662,19
@@
int main(int argc, char **argv)
cleanup_exit(1);
}
sending = TRUE;
cleanup_exit(1);
}
sending = TRUE;
+ reading = TRUE;
+ }
+
+ if (run_timers(now, &next)) {
+ ticks = next - GETTICKCOUNT();
+ if (ticks < 0) ticks = 0; /* just in case */
+ } else {
+ ticks = INFINITE;
}
}
- n = MsgWaitForMultipleObjects(4, handles, FALSE,
INFINITE
,
+ n = MsgWaitForMultipleObjects(4, handles, FALSE,
ticks
,
QS_POSTMESSAGE);
QS_POSTMESSAGE);
- if (n == 0) {
+ if (n ==
WAIT_OBJECT_0 +
0) {
WSANETWORKEVENTS things;
SOCKET socket;
extern SOCKET first_socket(int *), next_socket(int *);
WSANETWORKEVENTS things;
SOCKET socket;
extern SOCKET first_socket(int *), next_socket(int *);
@@
-724,7
+735,7
@@
int main(int argc, char **argv)
}
}
}
}
}
}
- } else if (n == 1) {
+ } else if (n ==
WAIT_OBJECT_0 +
1) {
reading = 0;
noise_ultralight(idata.len);
if (connopen && back->socket(backhandle) != NULL) {
reading = 0;
noise_ultralight(idata.len);
if (connopen && back->socket(backhandle) != NULL) {
@@
-734,7
+745,7
@@
int main(int argc, char **argv)
back->special(backhandle, TS_EOF);
}
}
back->special(backhandle, TS_EOF);
}
}
- } else if (n == 2) {
+ } else if (n ==
WAIT_OBJECT_0 +
2) {
odata.busy = 0;
if (!odata.writeret) {
fprintf(stderr, "Unable to write to standard output\n");
odata.busy = 0;
if (!odata.writeret) {
fprintf(stderr, "Unable to write to standard output\n");
@@
-747,7
+758,7
@@
int main(int argc, char **argv)
back->unthrottle(backhandle, bufchain_size(&stdout_data) +
bufchain_size(&stderr_data));
}
back->unthrottle(backhandle, bufchain_size(&stdout_data) +
bufchain_size(&stderr_data));
}
- } else if (n == 3) {
+ } else if (n ==
WAIT_OBJECT_0 +
3) {
edata.busy = 0;
if (!edata.writeret) {
fprintf(stderr, "Unable to write to standard output\n");
edata.busy = 0;
if (!edata.writeret) {
fprintf(stderr, "Unable to write to standard output\n");
@@
-760,7
+771,7
@@
int main(int argc, char **argv)
back->unthrottle(backhandle, bufchain_size(&stdout_data) +
bufchain_size(&stderr_data));
}
back->unthrottle(backhandle, bufchain_size(&stdout_data) +
bufchain_size(&stderr_data));
}
- } else if (n == 4) {
+ } else if (n ==
WAIT_OBJECT_0 +
4) {
MSG msg;
while (PeekMessage(&msg, INVALID_HANDLE_VALUE,
WM_AGENT_CALLBACK, WM_AGENT_CALLBACK,
MSG msg;
while (PeekMessage(&msg, INVALID_HANDLE_VALUE,
WM_AGENT_CALLBACK, WM_AGENT_CALLBACK,
@@
-770,6
+781,13
@@
int main(int argc, char **argv)
sfree(c);
}
}
sfree(c);
}
}
+
+ if (n == WAIT_TIMEOUT) {
+ now = next;
+ } else {
+ now = GETTICKCOUNT();
+ }
+
if (!reading && back->sendbuffer(backhandle) < MAX_STDIN_BACKLOG) {
SetEvent(idata.eventback);
reading = 1;
if (!reading && back->sendbuffer(backhandle) < MAX_STDIN_BACKLOG) {
SetEvent(idata.eventback);
reading = 1;