From 6f5de427025feefd1a52e7e555992b523bea0131 Mon Sep 17 00:00:00 2001
From: David Lawrence Ramsey <pooka109@gmail.com>
Date: Thu, 6 Oct 2005 05:28:37 +0000
Subject: [PATCH] in 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

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3038 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog   |  7 +++++++
 src/winio.c | 12 +++++++-----
 2 files changed, 14 insertions(+), 5 deletions(-)

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 <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);
-- 
GitLab