Module Name:    src
Committed By:   christos
Date:           Sun Aug 15 10:08:41 UTC 2021

Modified Files:
        src/lib/libedit: editline.3 el.c el.h eln.c histedit.h read.c

Log Message:
Disable attempts to handle EINTR and non-blocking I/O by default. It is
confusing to other programs and unexpected behavior. Reported by Ingo Schwarze.
This behavior is now controlled with EL_SAFEREAD.


To generate a diff of this commit:
cvs rdiff -u -r1.99 -r1.100 src/lib/libedit/editline.3 src/lib/libedit/el.c
cvs rdiff -u -r1.45 -r1.46 src/lib/libedit/el.h
cvs rdiff -u -r1.35 -r1.36 src/lib/libedit/eln.c
cvs rdiff -u -r1.57 -r1.58 src/lib/libedit/histedit.h
cvs rdiff -u -r1.106 -r1.107 src/lib/libedit/read.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libedit/editline.3
diff -u src/lib/libedit/editline.3:1.99 src/lib/libedit/editline.3:1.100
--- src/lib/libedit/editline.3:1.99	Sun Nov 18 12:09:39 2018
+++ src/lib/libedit/editline.3	Sun Aug 15 06:08:41 2021
@@ -1,4 +1,4 @@
-.\"	$NetBSD: editline.3,v 1.99 2018/11/18 17:09:39 christos Exp $
+.\"	$NetBSD: editline.3,v 1.100 2021/08/15 10:08:41 christos Exp $
 .\"
 .\" Copyright (c) 1997-2014 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -26,7 +26,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd November 9, 2018
+.Dd August 15, 2021
 .Dt EDITLINE 3
 .Os
 .Sh NAME
@@ -507,6 +507,16 @@ unbuffered mode is disabled (the default
 In unbuffered mode,
 .Fn el_gets
 will return immediately after processing a single character.
+.It Dv EL_SAFEREAD , Fa "int flag"
+If
+.Fa flag
+argument non zero, then
+.Nm editline
+attempts to recover from read errors, ignoring the first interrrupted
+error, and trying to reset the input file descriptor to reset non-blocking I/O.
+This is disabled by default, and desirable only when
+.Nm editline
+is used in shell-like applications.
 .It Dv EL_GETCFN , Fa "el_rfunc_t f"
 Whenever reading a character, use the function
 .Bd -ragged -offset indent -compact
@@ -634,6 +644,10 @@ call.
 Set
 .Fa c
 to non-zero if unbuffered mode is enabled.
+.It Dv EL_SAFEREAD , Fa "int *c"
+Set
+.Fa c
+to non-zero if safe read is set.
 .It Dv EL_GETFP , Fa "int fd", Fa "FILE **fp"
 Set
 .Fa fp
Index: src/lib/libedit/el.c
diff -u src/lib/libedit/el.c:1.99 src/lib/libedit/el.c:1.100
--- src/lib/libedit/el.c:1.99	Tue Jul 23 06:18:52 2019
+++ src/lib/libedit/el.c	Sun Aug 15 06:08:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: el.c,v 1.99 2019/07/23 10:18:52 christos Exp $	*/
+/*	$NetBSD: el.c,v 1.100 2021/08/15 10:08:41 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)el.c	8.2 (Berkeley) 1/3/94";
 #else
-__RCSID("$NetBSD: el.c,v 1.99 2019/07/23 10:18:52 christos Exp $");
+__RCSID("$NetBSD: el.c,v 1.100 2021/08/15 10:08:41 christos Exp $");
 #endif
 #endif /* not lint && not SCCSID */
 
@@ -300,6 +300,14 @@ el_wset(EditLine *el, int op, ...)
 		break;
 	}
 
+	case EL_SAFEREAD:
+		if (va_arg(ap, int))
+			el->el_flags |= FIXIO;
+		else
+			el->el_flags &= ~FIXIO;
+		rv = 0;
+		break;
+
 	case EL_EDITMODE:
 		if (va_arg(ap, int))
 			el->el_flags &= ~EDIT_DISABLED;
@@ -429,6 +437,11 @@ el_wget(EditLine *el, int op, ...)
 		rv = 0;
 		break;
 
+	case EL_SAFEREAD:
+		*va_arg(ap, int *) = (el->el_flags & FIXIO);
+		rv = 0;
+		break;
+
 	case EL_TERMINAL:
 		terminal_get(el, va_arg(ap, const char **));
 		rv = 0;

Index: src/lib/libedit/el.h
diff -u src/lib/libedit/el.h:1.45 src/lib/libedit/el.h:1.46
--- src/lib/libedit/el.h:1.45	Tue Jul 23 06:18:52 2019
+++ src/lib/libedit/el.h	Sun Aug 15 06:08:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: el.h,v 1.45 2019/07/23 10:18:52 christos Exp $	*/
+/*	$NetBSD: el.h,v 1.46 2021/08/15 10:08:41 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -51,12 +51,13 @@
 
 #define	EL_BUFSIZ	((size_t)1024)	/* Maximum line size		*/
 
-#define	HANDLE_SIGNALS	0x01
-#define	NO_TTY		0x02
-#define	EDIT_DISABLED	0x04
-#define	UNBUFFERED	0x08
-#define	NARROW_HISTORY	0x40
-#define	NO_RESET	0x80
+#define	HANDLE_SIGNALS	0x001
+#define	NO_TTY		0x002
+#define	EDIT_DISABLED	0x004
+#define	UNBUFFERED	0x008
+#define	NARROW_HISTORY	0x040
+#define	NO_RESET	0x080
+#define	FIXIO		0x100
 
 typedef unsigned char el_action_t;	/* Index to command array	*/
 

Index: src/lib/libedit/eln.c
diff -u src/lib/libedit/eln.c:1.35 src/lib/libedit/eln.c:1.36
--- src/lib/libedit/eln.c:1.35	Fri Apr 26 12:56:57 2019
+++ src/lib/libedit/eln.c	Sun Aug 15 06:08:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: eln.c,v 1.35 2019/04/26 16:56:57 christos Exp $	*/
+/*	$NetBSD: eln.c,v 1.36 2021/08/15 10:08:41 christos Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 #include "config.h"
 #if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: eln.c,v 1.35 2019/04/26 16:56:57 christos Exp $");
+__RCSID("$NetBSD: eln.c,v 1.36 2021/08/15 10:08:41 christos Exp $");
 #endif /* not lint && not SCCSID */
 
 #include <errno.h>
@@ -153,6 +153,7 @@ el_set(EditLine *el, int op, ...)
 
 	case EL_SIGNAL:         /* int */
 	case EL_EDITMODE:
+	case EL_SAFEREAD:
 	case EL_UNBUFFERED:
 	case EL_PREP_TERM:
 		ret = el_wset(el, op, va_arg(ap, int));
@@ -315,6 +316,7 @@ el_get(EditLine *el, int op, ...)
 
 	case EL_SIGNAL:         /* int * */
 	case EL_EDITMODE:
+	case EL_SAFEREAD:
 	case EL_UNBUFFERED:
 	case EL_PREP_TERM:
 		ret = el_wget(el, op, va_arg(ap, int *));

Index: src/lib/libedit/histedit.h
diff -u src/lib/libedit/histedit.h:1.57 src/lib/libedit/histedit.h:1.58
--- src/lib/libedit/histedit.h:1.57	Fri Sep  1 06:19:10 2017
+++ src/lib/libedit/histedit.h	Sun Aug 15 06:08:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: histedit.h,v 1.57 2017/09/01 10:19:10 christos Exp $	*/
+/*	$NetBSD: histedit.h,v 1.58 2021/08/15 10:08:41 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -157,6 +157,7 @@ unsigned char	_el_fn_complete(EditLine *
 #define	EL_RPROMPT_ESC	22	/* , prompt_func, Char);	      set/get */
 #define	EL_RESIZE	23	/* , el_zfunc_t, void *);	      set     */
 #define	EL_ALIAS_TEXT	24	/* , el_afunc_t, void *);	      set     */
+#define	EL_SAFEREAD	25	/* , int);			      set/get */
 
 #define	EL_BUILTIN_GETCFN	(NULL)
 

Index: src/lib/libedit/read.c
diff -u src/lib/libedit/read.c:1.106 src/lib/libedit/read.c:1.107
--- src/lib/libedit/read.c:1.106	Tue Jul 23 06:18:52 2019
+++ src/lib/libedit/read.c	Sun Aug 15 06:08:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: read.c,v 1.106 2019/07/23 10:18:52 christos Exp $	*/
+/*	$NetBSD: read.c,v 1.107 2021/08/15 10:08:41 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)read.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: read.c,v 1.106 2019/07/23 10:18:52 christos Exp $");
+__RCSID("$NetBSD: read.c,v 1.107 2021/08/15 10:08:41 christos Exp $");
 #endif
 #endif /* not lint && not SCCSID */
 
@@ -277,7 +277,7 @@ static int
 read_char(EditLine *el, wchar_t *cp)
 {
 	ssize_t num_read;
-	int tried = 0;
+	int tried = (el->el_flags & FIXIO) == 0;
 	char cbuf[MB_LEN_MAX];
 	size_t cbp = 0;
 	int save_errno = errno;

Reply via email to