X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/6d2d5e8dcea13c2c01cf583eeebfd72bc6bea6e0..cf6e59d623fbfd4efad0d63795ae5e7f33d5aa5b:/plink.c diff --git a/plink.c b/plink.c index 938bcb75..10a4ec10 100644 --- a/plink.c +++ b/plink.c @@ -41,6 +41,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 +85,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 +108,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 +511,8 @@ int main(int argc, char **argv) { back->special(TS_EOF); } } + if (back->socket() == INVALID_SOCKET) + break; /* we closed the connection */ } WSACleanup(); return 0;