X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/fa17a66e26aa47ff467d0af711621a70b1268f88..c83de30314874097728e01c7e7e94144548032b0:/plink.c diff --git a/plink.c b/plink.c index 121c65f9..d493c686 100644 --- a/plink.c +++ b/plink.c @@ -88,10 +88,14 @@ void verify_ssh_host_key(char *host, int port, char *keytype, if (ret == 0) /* success - key matched OK */ return; - if (ret == 2) /* key was different */ + if (ret == 2) { /* key was different */ fprintf(stderr, wrongmsg, fingerprint); - if (ret == 1) /* key was absent */ + fflush(stderr); + } + if (ret == 1) { /* key was absent */ fprintf(stderr, absentmsg, fingerprint); + fflush(stderr); + } hin = GetStdHandle(STD_INPUT_HANDLE); GetConsoleMode(hin, &savemode); @@ -238,6 +242,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); } @@ -319,6 +324,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); } @@ -393,8 +427,10 @@ int main(int argc, char **argv) { strncpy(cfg.host, p, sizeof(cfg.host)-1); cfg.host[sizeof(cfg.host)-1] = '\0'; cfg.port = default_port; - } else + } else { cfg = cfg2; + cfg.remote_cmd_ptr = cfg.remote_cmd; + } } else { *r++ = '\0'; strncpy(cfg.username, p, sizeof(cfg.username)-1); @@ -427,7 +463,7 @@ int main(int argc, char **argv) { usage(); } - if (!*cfg.remote_cmd) + if (!*cfg.remote_cmd_ptr) flags |= FLAG_INTERACTIVE; /* @@ -536,11 +572,10 @@ int main(int argc, char **argv) { n = WaitForMultipleObjects(2, handles, FALSE, INFINITE); if (n == 0) { WSANETWORKEVENTS things; - enum234 e; SOCKET socket; - extern SOCKET first_socket(enum234 *), next_socket(enum234 *); + extern SOCKET first_socket(int *), next_socket(int *); extern int select_result(WPARAM, LPARAM); - int i; + int i, socketstate; /* * We must not call select_result() for any socket @@ -550,8 +585,8 @@ int main(int argc, char **argv) { */ /* Count the active sockets. */ i = 0; - for (socket = first_socket(&e); socket != INVALID_SOCKET; - socket = next_socket(&e)) + for (socket = first_socket(&socketstate); socket != INVALID_SOCKET; + socket = next_socket(&socketstate)) i++; /* Expand the buffer if necessary. */ @@ -562,8 +597,8 @@ int main(int argc, char **argv) { /* Retrieve the sockets into sklist. */ skcount = 0; - for (socket = first_socket(&e); socket != INVALID_SOCKET; - socket = next_socket(&e)) { + for (socket = first_socket(&socketstate); socket != INVALID_SOCKET; + socket = next_socket(&socketstate)) { sklist[skcount++] = socket; }