X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/6d2d5e8dcea13c2c01cf583eeebfd72bc6bea6e0..0a064ea7fe1a2dc3e5dd1af42354d0b7b7d41bbe:/plink.c diff --git a/plink.c b/plink.c index 938bcb75..bee734fd 100644 --- a/plink.c +++ b/plink.c @@ -11,6 +11,7 @@ #define PUTTY_DO_GLOBALS /* actually _define_ globals */ #include "putty.h" +#include "winstuff.h" #include "storage.h" void fatalbox (char *p, ...) { @@ -41,6 +42,8 @@ void logevent(char *string) { } void verify_ssh_host_key(char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; + HANDLE hin; + DWORD savemode, i; static const char absentmsg[] = "The server's host key is not cached in the registry. You\n" @@ -83,10 +86,21 @@ 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 (fgets(line, sizeof(line), stdin) && - line[0] != '\0' && line[0] != '\n') { + if (ret == 1) /* key was absent */ + fprintf(stderr, absentmsg, fingerprint); + + hin = GetStdHandle(STD_INPUT_HANDLE); + GetConsoleMode(hin, &savemode); + SetConsoleMode(hin, (savemode | ENABLE_ECHO_INPUT | + ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT)); + ReadFile(hin, line, sizeof(line)-1, &i, NULL); + SetConsoleMode(hin, savemode); + + if (ret == 2) { /* key was different */ + if (line[0] != '\0' && line[0] != '\r' && line[0] != '\n') { if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); } else { @@ -95,9 +109,7 @@ void verify_ssh_host_key(char *host, int port, char *keytype, } } if (ret == 1) { /* key was absent */ - fprintf(stderr, absentmsg, fingerprint); - if (fgets(line, sizeof(line), stdin) && - (line[0] == 'y' || line[0] == 'Y')) + if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); else { fprintf(stderr, abandoned); @@ -500,6 +512,8 @@ int main(int argc, char **argv) { back->special(TS_EOF); } } + if (back->socket() == INVALID_SOCKET) + break; /* we closed the connection */ } WSACleanup(); return 0;