#include "storage.h"
#include "tree234.h"
-#define WM_AGENT_CALLBACK (WM_XUSER + 4)
+#define WM_AGENT_CALLBACK (WM_APP + 4)
#define MAX_STDIN_BACKLOG 4096
SetConsoleMode(inhandle, mode);
}
+char *get_ttymode(void *frontend, const char *mode) { return NULL; }
+
struct input_data {
DWORD len;
char buffer[4096];
printf("Usage: plink [options] [user@]host [command]\n");
printf(" (\"host\" can also be a PuTTY saved session name)\n");
printf("Options:\n");
- printf(" -V print version information\n");
+ printf(" -V print version information and exit\n");
+ printf(" -pgpfp print PGP key fingerprints and exit\n");
printf(" -v show verbose messages\n");
printf(" -load sessname Load settings from saved session\n");
printf(" -ssh -telnet -rlogin -raw\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(" -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(" -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);
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 exitcode;
int errors;
int use_subsystem = 0;
+ long now, next;
ssh_get_line = console_get_line;
use_subsystem = 1;
} else if (!strcmp(p, "-V")) {
version();
+ } else if (!strcmp(p, "-pgpfp")) {
+ pgp_fingerprints();
+ exit(1);
} else {
fprintf(stderr, "plink: unknown option \"%s\"\n", p);
errors = 1;
cfg.port = default_port;
} else {
cfg = cfg2;
- /* Ick: patch up internal pointer after copy */
- cfg.remote_cmd_ptr = cfg.remote_cmd;
}
}
cfg.host[p1] = '\0';
}
- if (!*cfg.remote_cmd_ptr)
+ if (!cfg.remote_cmd_ptr && !*cfg.remote_cmd)
flags |= FLAG_INTERACTIVE;
/*
inhandle = GetStdHandle(STD_INPUT_HANDLE);
outhandle = GetStdHandle(STD_OUTPUT_HANDLE);
errhandle = GetStdHandle(STD_ERROR_HANDLE);
- GetConsoleMode(inhandle, &orig_console_mode);
- SetConsoleMode(inhandle, ENABLE_PROCESSED_INPUT);
-
- main_thread_id = GetCurrentThreadId();
-
/*
* Turn off ECHO and LINE input modes. We don't care if this
* call fails, because we know we aren't necessarily running in
* a console.
*/
+ GetConsoleMode(inhandle, &orig_console_mode);
+ SetConsoleMode(inhandle, ENABLE_PROCESSED_INPUT);
+
+ main_thread_id = GetCurrentThreadId();
+
handles[0] = netevent;
handles[1] = stdinevent;
handles[2] = stdoutevent;
cleanup_exit(1);
}
+ now = GETTICKCOUNT();
+
while (1) {
int n;
+ DWORD ticks;
if (!sending && back->sendok(backhandle)) {
/*
cleanup_exit(1);
}
sending = TRUE;
+ reading = TRUE;
}
- n = MsgWaitForMultipleObjects(4, handles, FALSE, INFINITE,
+ if (run_timers(now, &next)) {
+ ticks = next - GETTICKCOUNT();
+ if (ticks < 0) ticks = 0; /* just in case */
+ } else {
+ ticks = INFINITE;
+ }
+
+ n = MsgWaitForMultipleObjects(4, handles, FALSE, ticks,
QS_POSTMESSAGE);
- if (n == 0) {
+ if (n == WAIT_OBJECT_0 + 0) {
WSANETWORKEVENTS things;
SOCKET socket;
extern SOCKET first_socket(int *), next_socket(int *);
}
}
}
- } else if (n == 1) {
+ } else if (n == WAIT_OBJECT_0 + 1) {
reading = 0;
noise_ultralight(idata.len);
if (connopen && back->socket(backhandle) != NULL) {
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");
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");
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,
sfree(c);
}
}
+
+ if (n == WAIT_TIMEOUT) {
+ now = next;
+ } else {
+ now = GETTICKCOUNT();
+ }
+
if (!reading && back->sendbuffer(backhandle) < MAX_STDIN_BACKLOG) {
SetEvent(idata.eventback);
reading = 1;