aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tty.c41
1 files changed, 21 insertions, 20 deletions
diff --git a/tty.c b/tty.c
index 6816b46f..ebd21b94 100644
--- a/tty.c
+++ b/tty.c
@@ -1,4 +1,4 @@
-/* $Id: tty.c,v 1.47 2008-10-09 22:03:36 nicm Exp $ */
+/* $Id: tty.c,v 1.48 2008-10-27 20:13:37 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -204,30 +204,31 @@ tty_close(struct tty *tty)
}
/*
- * Skip any writing if the fd is invalid. Things like ssh -t can
- * easily leave us with a dead tty.
+ * Be flexible about error handling and try not kill the server just
+ * because the fd is invalid. Things like ssh -t can easily leave us
+ * with a dead tty.
*/
if (ioctl(tty->fd, TIOCGWINSZ, &ws) == -1) {
- if (errno != EBADF && errno != ENXIO)
+ if (errno != EBADF && errno != ENXIO && errno != ENOTTY)
fatal("ioctl(TIOCGWINSZ)");
+ } else if (tcsetattr(tty->fd, TCSANOW, &tty->tio) == -1) {
+ if (errno != EBADF && errno != ENXIO && errno != ENOTTY)
+ fatal("tcsetattr failed");
} else {
- if (tcsetattr(tty->fd, TCSANOW, &tty->tio) != 0)
- fatal("tcsetattr failed");
-
- tty_raw(tty, tparm(change_scroll_region, 0, ws.ws_row - 1));
- if (exit_alt_charset_mode != NULL)
- tty_puts(tty, exit_alt_charset_mode);
- if (exit_attribute_mode != NULL)
- tty_raw(tty, exit_attribute_mode);
- tty_raw(tty, clear_screen);
- if (keypad_local != NULL)
- tty_raw(tty, keypad_local);
- if (exit_ca_mode != NULL)
- tty_raw(tty, exit_ca_mode);
- if (cursor_normal != NULL)
- tty_raw(tty, cursor_normal);
+ tty_raw(tty, tparm(change_scroll_region, 0, ws.ws_row - 1));
+ if (exit_alt_charset_mode != NULL)
+ tty_puts(tty, exit_alt_charset_mode);
+ if (exit_attribute_mode != NULL)
+ tty_raw(tty, exit_attribute_mode);
+ tty_raw(tty, clear_screen);
+ if (keypad_local != NULL)
+ tty_raw(tty, keypad_local);
+ if (exit_ca_mode != NULL)
+ tty_raw(tty, exit_ca_mode);
+ if (cursor_normal != NULL)
+ tty_raw(tty, cursor_normal);
}
-
+
tty_free_term(tty->term);
tty_keys_free(tty);