X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/bf61b5660299e88399304cd8eb9bacddc73a765b..dee42491003c8fdd01bd039da46b9d6a2d171584:/unix/uxcons.c diff --git a/unix/uxcons.c b/unix/uxcons.c index 579178c7..6579155e 100644 --- a/unix/uxcons.c +++ b/unix/uxcons.c @@ -16,6 +16,8 @@ int console_batch_mode = FALSE; +static void *console_logctx = NULL; + /* * Clean up and exit. */ @@ -25,28 +27,42 @@ void cleanup_exit(int code) * Clean up. */ sk_cleanup(); + random_save_seed(); + exit(code); +} - if (cfg.protocol == PROT_SSH) - random_save_seed(); +void set_busy_status(void *frontend, int status) +{ +} - exit(code); +void update_specials_menu(void *frontend) +{ +} + +void notify_remote_exit(void *frontend) +{ +} + +void timer_change_notify(long next) +{ } -void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, - char *keystr, char *fingerprint) +int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, + char *keystr, char *fingerprint, + void (*callback)(void *ctx, int result), void *ctx) { int ret; static const char absentmsg_batch[] = "The server's host key is not cached. You have no guarantee\n" "that the server is the computer you think it is.\n" - "The server's key fingerprint is:\n" + "The server's %s key fingerprint is:\n" "%s\n" "Connection abandoned.\n"; static const char absentmsg[] = "The server's host key is not cached. You have no guarantee\n" "that the server is the computer you think it is.\n" - "The server's key fingerprint is:\n" + "The server's %s key fingerprint is:\n" "%s\n" "If you trust this host, enter \"y\" to add the key to\n" "PuTTY's cache and carry on connecting.\n" @@ -62,7 +78,7 @@ void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, "cached. This means that either the server administrator\n" "has changed the host key, or you have actually connected\n" "to another computer pretending to be the server.\n" - "The new key fingerprint is:\n" + "The new %s key fingerprint is:\n" "%s\n" "Connection abandoned.\n"; static const char wrongmsg[] = @@ -71,7 +87,7 @@ void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, "cached. This means that either the server administrator\n" "has changed the host key, or you have actually connected\n" "to another computer pretending to be the server.\n" - "The new key fingerprint is:\n" + "The new %s key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "enter \"y\" to update PuTTY's cache and continue connecting.\n" @@ -92,22 +108,22 @@ void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ - return; + return 1; if (ret == 2) { /* key was different */ if (console_batch_mode) { - fprintf(stderr, wrongmsg_batch, fingerprint); - cleanup_exit(1); + fprintf(stderr, wrongmsg_batch, keytype, fingerprint); + return 0; } - fprintf(stderr, wrongmsg, fingerprint); + fprintf(stderr, wrongmsg, keytype, fingerprint); fflush(stderr); } if (ret == 1) { /* key was absent */ if (console_batch_mode) { - fprintf(stderr, absentmsg_batch, fingerprint); - cleanup_exit(1); + fprintf(stderr, absentmsg_batch, keytype, fingerprint); + return 0; } - fprintf(stderr, absentmsg, fingerprint); + fprintf(stderr, absentmsg, keytype, fingerprint); fflush(stderr); } @@ -125,25 +141,26 @@ void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, if (line[0] != '\0' && line[0] != '\r' && line[0] != '\n') { if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); + return 1; } else { fprintf(stderr, abandoned); - cleanup_exit(0); + return 0; } } /* - * Ask whether the selected cipher is acceptable (since it was + * Ask whether the selected algorithm is acceptable (since it was * below the configured 'warn' threshold). - * cs: 0 = both ways, 1 = client->server, 2 = server->client */ -void askcipher(void *frontend, char *ciphername, int cs) +int askalg(void *frontend, const char *algtype, const char *algname, + void (*callback)(void *ctx, int result), void *ctx) { static const char msg[] = - "The first %scipher supported by the server is\n" + "The first %s supported by the server is\n" "%s, which is below the configured warning threshold.\n" "Continue with connection? (y/n) "; static const char msg_batch[] = - "The first %scipher supported by the server is\n" + "The first %s supported by the server is\n" "%s, which is below the configured warning threshold.\n" "Connection abandoned.\n"; static const char abandoned[] = "Connection abandoned.\n"; @@ -151,17 +168,11 @@ void askcipher(void *frontend, char *ciphername, int cs) char line[32]; if (console_batch_mode) { - fprintf(stderr, msg_batch, - (cs == 0) ? "" : - (cs == 1) ? "client-to-server " : "server-to-client ", - ciphername); - cleanup_exit(1); + fprintf(stderr, msg_batch, algtype, algname); + return 0; } - fprintf(stderr, msg, - (cs == 0) ? "" : - (cs == 1) ? "client-to-server " : "server-to-client ", - ciphername); + fprintf(stderr, msg, algtype, algname); fflush(stderr); { @@ -176,10 +187,10 @@ void askcipher(void *frontend, char *ciphername, int cs) } if (line[0] == 'y' || line[0] == 'Y') { - return; + return 1; } else { fprintf(stderr, abandoned); - cleanup_exit(0); + return 0; } } @@ -187,7 +198,8 @@ void askcipher(void *frontend, char *ciphername, int cs) * Ask whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ -int askappend(void *frontend, char *filename) +int askappend(void *frontend, Filename filename, + void (*callback)(void *ctx, int result), void *ctx) { static const char msgtemplate[] = "The session log file \"%.*s\" already exists.\n" @@ -205,11 +217,11 @@ int askappend(void *frontend, char *filename) char line[32]; if (console_batch_mode) { - fprintf(stderr, msgtemplate_batch, FILENAME_MAX, filename); + fprintf(stderr, msgtemplate_batch, FILENAME_MAX, filename.path); fflush(stderr); return 0; } - fprintf(stderr, msgtemplate, FILENAME_MAX, filename); + fprintf(stderr, msgtemplate, FILENAME_MAX, filename.path); fflush(stderr); { @@ -257,9 +269,15 @@ void old_keyfile_warning(void) fputs(message, stderr); } -void logevent(void *frontend, char *string) +void console_provide_logctx(void *logctx) +{ + console_logctx = logctx; +} + +void logevent(void *frontend, const char *string) { - log_eventlog(logctx, string); + if (console_logctx) + log_eventlog(console_logctx, string); } int console_get_line(const char *prompt, char *str, @@ -271,6 +289,7 @@ int console_get_line(const char *prompt, char *str, if (console_batch_mode) { if (maxlen > 0) str[0] = '\0'; + return 0; } else { tcgetattr(0, &oldmode); newmode = oldmode; @@ -293,8 +312,9 @@ int console_get_line(const char *prompt, char *str, if (is_pw) fputs("\n", stdout); + + return 1; } - return 1; } void frontend_keypress(void *handle) @@ -304,3 +324,18 @@ void frontend_keypress(void *handle) */ return; } + +int is_interactive(void) +{ + return isatty(0); +} + +/* + * X11-forwarding-related things suitable for console. + */ + +const char platform_x11_best_transport[] = "unix"; + +char *platform_get_x_display(void) { + return dupstr(getenv("DISPLAY")); +}