Cleanups of the GSSAPI support. On Windows, standard GSS libraries
[u/mdw/putty] / mac / mac.c
index 2fb7d44..2536206 100644 (file)
--- 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. */
@@ -832,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: