X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/49bad83179144047e7d9e070d63d869dba691736..96621a840849b4afb6582424d2a1eea08a0be418:/plink.c diff --git a/plink.c b/plink.c index 16a44b38..76ed437c 100644 --- a/plink.c +++ b/plink.c @@ -119,18 +119,11 @@ void verify_ssh_host_key(char *host, int port, char *keytype, } } -HANDLE outhandle, errhandle; +HANDLE inhandle, outhandle, errhandle; DWORD orig_console_mode; WSAEVENT netevent; -void begin_session(void) { - if (!cfg.ldisc_term) - SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), ENABLE_PROCESSED_INPUT); - else - SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), orig_console_mode); -} - void from_backend(int is_stderr, char *data, int len) { int pos; DWORD ret; @@ -144,18 +137,35 @@ void from_backend(int is_stderr, char *data, int len) { } } +int term_ldisc(int mode) { return FALSE; } +void ldisc_update(int echo, int edit) { + /* Update stdin read mode to reflect changes in line discipline. */ + DWORD mode; + + mode = ENABLE_PROCESSED_INPUT; + if (echo) + mode = mode | ENABLE_ECHO_INPUT; + else + mode = mode &~ ENABLE_ECHO_INPUT; + if (edit) + mode = mode | ENABLE_LINE_INPUT; + else + mode = mode &~ ENABLE_LINE_INPUT; + SetConsoleMode(inhandle, mode); +} + struct input_data { DWORD len; char buffer[4096]; HANDLE event, eventback; }; -static int get_password(const char *prompt, char *str, int maxlen) +static int get_line(const char *prompt, char *str, int maxlen, int is_pw) { HANDLE hin, hout; - DWORD savemode, i; + DWORD savemode, newmode, i; - if (password) { + if (is_pw && password) { static int tried_once = 0; if (tried_once) { @@ -176,8 +186,12 @@ static int get_password(const char *prompt, char *str, int maxlen) } GetConsoleMode(hin, &savemode); - SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) | - ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT); + newmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT; + if (is_pw) + newmode &= ~ENABLE_ECHO_INPUT; + else + newmode |= ENABLE_ECHO_INPUT; + SetConsoleMode(hin, newmode); WriteFile(hout, prompt, strlen(prompt), &i, NULL); ReadFile(hin, str, maxlen-1, &i, NULL); @@ -187,7 +201,8 @@ static int get_password(const char *prompt, char *str, int maxlen) if ((int)i > maxlen) i = maxlen-1; else i = i - 2; str[i] = '\0'; - WriteFile(hout, "\r\n", 2, &i, NULL); + if (is_pw) + WriteFile(hout, "\r\n", 2, &i, NULL); return 1; } @@ -223,6 +238,7 @@ static void usage(void) printf(" -ssh force use of ssh protocol\n"); printf(" -P port connect to specified port\n"); printf(" -pw passw login with specified password\n"); + printf(" -m file read remote command(s) from file\n"); exit(1); } @@ -255,7 +271,7 @@ int main(int argc, char **argv) { int skcount, sksize; int connopen; - ssh_get_password = get_password; + ssh_get_line = get_line; sklist = NULL; skcount = sksize = 0; @@ -304,6 +320,35 @@ int main(int argc, char **argv) { --argc, username = *++argv; strncpy(cfg.username, username, sizeof(cfg.username)); cfg.username[sizeof(cfg.username)-1] = '\0'; + } else if (!strcmp(p, "-m") && argc > 1) { + char *filename, *command; + int cmdlen, cmdsize; + FILE *fp; + int c, d; + + --argc, filename = *++argv; + + cmdlen = cmdsize = 0; + command = NULL; + fp = fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "plink: unable to open command " + "file \"%s\"\n", filename); + return 1; + } + do { + c = fgetc(fp); + d = c; + if (c == EOF) + d = 0; + if (cmdlen >= cmdsize) { + cmdsize = cmdlen + 512; + command = srealloc(command, cmdsize); + } + command[cmdlen++] = d; + } while (c != EOF); + cfg.remote_cmd_ptr = command; + cfg.nopty = TRUE; /* command => no terminal */ } else if (!strcmp(p, "-P") && argc > 1) { --argc, portnumber = atoi(*++argv); } @@ -377,7 +422,7 @@ int main(int argc, char **argv) { /* No settings for this host; use defaults */ strncpy(cfg.host, p, sizeof(cfg.host)-1); cfg.host[sizeof(cfg.host)-1] = '\0'; - cfg.port = 22; + cfg.port = default_port; } else cfg = cfg2; } else { @@ -386,7 +431,7 @@ int main(int argc, char **argv) { cfg.username[sizeof(cfg.username)-1] = '\0'; strncpy(cfg.host, r, sizeof(cfg.host)-1); cfg.host[sizeof(cfg.host)-1] = '\0'; - cfg.port = 22; + cfg.port = default_port; } } } else { @@ -403,7 +448,6 @@ int main(int argc, char **argv) { len2 = strlen(cp); len -= len2; cp += len2; } cfg.nopty = TRUE; /* command => no terminal */ - cfg.ldisc_term = TRUE; /* use stdin like a line buffer */ break; /* done with cmdline */ } } @@ -413,7 +457,7 @@ int main(int argc, char **argv) { usage(); } - if (!*cfg.remote_cmd) + if (!*cfg.remote_cmd_ptr) flags |= FLAG_INTERACTIVE; /* @@ -475,10 +519,11 @@ int main(int argc, char **argv) { stdinevent = CreateEvent(NULL, FALSE, FALSE, NULL); - GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &orig_console_mode); - SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), ENABLE_PROCESSED_INPUT); + 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); /* * Turn off ECHO and LINE input modes. We don't care if this @@ -557,7 +602,7 @@ int main(int argc, char **argv) { WPARAM wp; socket = sklist[i]; wp = (WPARAM)socket; - if (!WSAEnumNetworkEvents(socket, netevent, &things)) { + if (!WSAEnumNetworkEvents(socket, NULL, &things)) { noise_ultralight(socket); noise_ultralight(things.lNetworkEvents); if (things.lNetworkEvents & FD_READ)