diff --git a/ChangeLog b/ChangeLog index 2fbeeac9ef87ee4d3ef2a38164401af17694323c..b0fdf24baf577244492e153d2a57dc45dc0692c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -325,6 +325,13 @@ CVS code - the number of lines and characters in the file or selection, as wc does. (DLR) - winio.c: + get_key_buffer() + - Only save all open buffers and hang up when a blocking + wgetch() returns ERR and errno is set to EIO (input/output + error). If errno is set to something else, recover properly. + This fixes problems with nano's erroneously hanging up while + e.g. resizing or unsuspending in a chroot. (DLR, found by Mike + Frysinger) get_escape_seq_kbinput() - Fix typo preventing the VT100/VT220/VT320/xterm/rxvt escape sequence for ',' on the numeric keypad with NumLock off from diff --git a/src/winio.c b/src/winio.c index e2487bf18a92dc7c61b77bc0799c66832f8e654b..be0b832ad09456862d0b868f46981dbfc7c6104d 100644 --- a/src/winio.c +++ b/src/winio.c @@ -27,6 +27,7 @@ #include <stdarg.h> #include <string.h> #include <unistd.h> +#include <errno.h> #include <ctype.h> #include "proto.h" @@ -142,12 +143,13 @@ void get_key_buffer(WINDOW *win) * screen updates. */ doupdate(); - input = wgetch(win); + while ((input = wgetch(win)) == ERR) { + /* If errno is EIO, it means that the input source that we were + * using is gone, so die gracefully. */ + if (errno == EIO) + handle_hupterm(0); + } - /* If we get ERR when using blocking input, it means that the input - * source that we were using is gone, so die gracefully. */ - if (input == ERR) - handle_hupterm(0); #ifndef NANO_SMALL allow_pending_sigwinch(FALSE);