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;