diff --git a/ChangeLog b/ChangeLog index 2fbeeac9..b0fdf24b 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 e2487bf1..be0b832a 100644 --- a/src/winio.c +++ b/src/winio.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #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);