X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/71ed591e9e049cf1c64ec9ddc10e2158c2f76c89..1e00c92b81273392a7db4796dc163b0729891e44:/mac/mac.c diff --git a/mac/mac.c b/mac/mac.c index a0bfa3ea..25362061 100644 --- a/mac/mac.c +++ b/mac/mac.c @@ -210,13 +210,10 @@ static void mac_startup(void) { default_protocol = be_default_protocol; /* Find the appropriate default port. */ { - int i; + Backend *b = backend_from_proto(default_protocol); default_port = 0; /* illegal */ - for (i = 0; backends[i].backend != NULL; i++) - if (backends[i].protocol == default_protocol) { - default_port = backends[i].backend->default_port; - break; - } + if (b) + default_port = b->default_port; } flags = FLAG_INTERACTIVE; @@ -659,9 +656,10 @@ void cleanup_exit(int status) } /* This should only kill the current session, not the whole application. */ -void connection_fatal(void *fontend, char *fmt, ...) { +void connection_fatal(void *frontend, char *fmt, ...) { va_list ap; Str255 stuff; + Session *s = frontend; va_start(ap, fmt); /* We'd like stuff to be a Pascal string */ @@ -669,7 +667,11 @@ void connection_fatal(void *fontend, char *fmt, ...) { va_end(ap); ParamText(stuff, NULL, NULL, NULL); StopAlert(128, NULL); - cleanup_exit(1); + + s->session_closed = TRUE; + + if (s->cfg.close_on_exit == FORCE_ON) + mac_closewindow(s->window); } /* Null SSH agent client -- never finds an agent. */ @@ -691,8 +693,9 @@ int agent_query(void *in, int inlen, void **out, int *outlen, /* Temporary null routines for testing. */ -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) { Str255 pappname; Str255 pfingerprint; @@ -705,64 +708,55 @@ void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, c2pstrcpy(pfingerprint, fingerprint); /* - * This function is horribly wrong. For one thing, the alert - * shouldn't be modal, it should be movable modal, or a sheet in - * Aqua. Also, PuTTY might be in the background, in which case we - * should use the Notification Manager to wake up the user. In - * any case, we shouldn't hold up processing of other connections' - * data just because this one's waiting for the user. Also see the - * note below about closing the connection. All in all, a bit of - * a mess really. + * The alert shouldn't be modal, it should be movable modal, or + * a sheet in Aqua. Also, PuTTY might be in the background, in + * which case we should use the Notification Manager to wake up + * the user. In any case, we shouldn't hold up processing of + * other connections' data just because this one's waiting for + * the user. */ /* Verify the key against the cache */ ret = verify_host_key(host, port, keytype, keystr); - if (ret == 0) /* success - key matched OK */ - return; - if (ret == 2) { /* key was different */ + if (ret == 0) { /* success - key matched OK */ + return 1; + } else if (ret == 2) { /* key was different */ ParamText(pappname, pkeytype, pfingerprint, NULL); alertret=CautionAlert(wWrong, NULL); - if (alertret == 9) { + if (alertret == 8) { /* Cancel */ - goto cancel; - } else if (alertret == 8) { + return 0; + } else if (alertret == 9) { /* Connect Just Once */ + return 1; } else { /* Update Key */ store_host_key(host, port, keytype, keystr); + return 1; } - } - if (ret == 1) { /* key was absent */ + } else /* ret == 1 */ { /* key was absent */ ParamText(pkeytype, pfingerprint, pappname, NULL); alertret=CautionAlert(wAbsent, NULL); - if (alertret == 8) { + if (alertret == 7) { /* Cancel */ - goto cancel; - } else if (alertret == 7) { + return 0; + } else if (alertret == 8) { /* Connect Just Once */ + return 1; } else { /* Update Key */ store_host_key(host, port, keytype, keystr); + return 1; } } - - return; - - cancel: - /* - * User chose "Cancel". Unfortunately, if I tear the - * connection down here, Bad Things happen when I return. I - * think this function should actually return something - * telling the SSH code to abandon the connection. - */ - return; } -void askalg(void *frontend, const char *algtype, const char *algname) +int askalg(void *frontend, const char *algtype, const char *algname, + void (*callback)(void *ctx, int result), void *ctx) { - + return 0; } void old_keyfile_warning(void) @@ -840,7 +834,41 @@ void update_specials_menu(void *frontend) mac_adjustmenus(); } -void notify_remote_exit(void *fe) { /* XXX anything needed here? */ } +void notify_remote_exit(void *frontend) +{ + Session *s = frontend; + int exitcode; + + if (!s->session_closed && + (exitcode = s->back->exitcode(s->backhandle)) >=0) { + s->session_closed = TRUE; + if (s->cfg.close_on_exit == FORCE_ON || + (s->cfg.close_on_exit == AUTO && exitcode == 0)) { + mac_closewindow(s->window); + return; + } + + /* The session's dead */ + + if (s->ldisc) { + ldisc_free(s->ldisc); + s->ldisc = NULL; + } + + if (s->back) { + s->back->free(s->backhandle); + s->backhandle = NULL; + s->back = NULL; + update_specials_menu(s); + } + + { + char title[100]; + sprintf(title, "%.70s (inactive)", appname); + set_title(s, title); + } + } +} /* * Local Variables: