Module Name: src Committed By: christos Date: Tue Sep 5 18:07:59 UTC 2017
Modified Files: src/lib/libedit: el.c el.h readline.c tty.c Log Message: For readline emulation, don't reset the tty to "sane" (cooked) mode if we did not start this way. Also set and reset the tty on entry and exit from readline() since this is what readline does. To generate a diff of this commit: cvs rdiff -u -r1.94 -r1.95 src/lib/libedit/el.c cvs rdiff -u -r1.42 -r1.43 src/lib/libedit/el.h cvs rdiff -u -r1.142 -r1.143 src/lib/libedit/readline.c cvs rdiff -u -r1.65 -r1.66 src/lib/libedit/tty.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/el.c diff -u src/lib/libedit/el.c:1.94 src/lib/libedit/el.c:1.95 --- src/lib/libedit/el.c:1.94 Tue Jun 27 19:25:13 2017 +++ src/lib/libedit/el.c Tue Sep 5 14:07:59 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: el.c,v 1.94 2017/06/27 23:25:13 christos Exp $ */ +/* $NetBSD: el.c,v 1.95 2017/09/05 18:07:59 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.94 2017/06/27 23:25:13 christos Exp $"); +__RCSID("$NetBSD: el.c,v 1.95 2017/09/05 18:07:59 christos Exp $"); #endif #endif /* not lint && not SCCSID */ @@ -67,9 +67,9 @@ el_init(const char *prog, FILE *fin, FIL fileno(ferr)); } -EditLine * -el_init_fd(const char *prog, FILE *fin, FILE *fout, FILE *ferr, - int fdin, int fdout, int fderr) +libedit_private EditLine * +el_init_internal(const char *prog, FILE *fin, FILE *fout, FILE *ferr, + int fdin, int fdout, int fderr, int flags) { EditLine *el = el_malloc(sizeof(*el)); @@ -95,7 +95,7 @@ el_init_fd(const char *prog, FILE *fin, /* * Initialize all the modules. Order is important!!! */ - el->el_flags = 0; + el->el_flags = flags; if (setlocale(LC_CTYPE, NULL) != NULL){ if (strcmp(nl_langinfo(CODESET), "UTF-8") == 0) el->el_flags |= CHARSET_IS_UTF8; @@ -123,6 +123,12 @@ el_init_fd(const char *prog, FILE *fin, return el; } +EditLine * +el_init_fd(const char *prog, FILE *fin, FILE *fout, FILE *ferr, + int fdin, int fdout, int fderr) +{ + return el_init_internal(prog, fin, fout, ferr, fdin, fdout, fderr, 0); +} /* el_end(): * Clean up. Index: src/lib/libedit/el.h diff -u src/lib/libedit/el.h:1.42 src/lib/libedit/el.h:1.43 --- src/lib/libedit/el.h:1.42 Tue Jun 27 19:25:13 2017 +++ src/lib/libedit/el.h Tue Sep 5 14:07:59 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: el.h,v 1.42 2017/06/27 23:25:13 christos Exp $ */ +/* $NetBSD: el.h,v 1.43 2017/09/05 18:07:59 christos Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -57,6 +57,7 @@ #define UNBUFFERED 0x08 #define CHARSET_IS_UTF8 0x10 #define NARROW_HISTORY 0x40 +#define NO_RESET 0x80 typedef unsigned char el_action_t; /* Index to command array */ @@ -141,6 +142,8 @@ struct editline { }; libedit_private int el_editmode(EditLine *, int, const wchar_t **); +libedit_private EditLine *el_init_internal(const char *, FILE *, FILE *, + FILE *, int, int, int, int); #ifdef DEBUG #define EL_ABORT(a) do { \ Index: src/lib/libedit/readline.c diff -u src/lib/libedit/readline.c:1.142 src/lib/libedit/readline.c:1.143 --- src/lib/libedit/readline.c:1.142 Fri Sep 1 06:19:10 2017 +++ src/lib/libedit/readline.c Tue Sep 5 14:07:59 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: readline.c,v 1.142 2017/09/01 10:19:10 christos Exp $ */ +/* $NetBSD: readline.c,v 1.143 2017/09/05 18:07:59 christos Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include "config.h" #if !defined(lint) && !defined(SCCSID) -__RCSID("$NetBSD: readline.c,v 1.142 2017/09/01 10:19:10 christos Exp $"); +__RCSID("$NetBSD: readline.c,v 1.143 2017/09/05 18:07:59 christos Exp $"); #endif /* not lint && not SCCSID */ #include <sys/types.h> @@ -290,7 +290,9 @@ rl_initialize(void) if (tcgetattr(fileno(rl_instream), &t) != -1 && (t.c_lflag & ECHO) == 0) editmode = 0; - e = el_init(rl_readline_name, rl_instream, rl_outstream, stderr); + e = el_init_internal(rl_readline_name, rl_instream, rl_outstream, + stderr, fileno(rl_instream), fileno(rl_outstream), fileno(stderr), + NO_RESET); if (!editmode) el_set(e, EL_EDITMODE, 0); @@ -386,6 +388,8 @@ rl_initialize(void) _resize_fun(e, &rl_line_buffer); _rl_update_pos(); + tty_end(e); + return 0; } @@ -410,15 +414,17 @@ readline(const char *p) rl_did_startup_hook = 1; (*rl_startup_hook)(NULL, 0); } + tty_init(e); rl_done = 0; (void)setjmp(topbuf); + buf = NULL; /* update prompt accordingly to what has been passed */ if (rl_set_prompt(prompt) == -1) - return NULL; + goto out; if (rl_pre_input_hook) (*rl_pre_input_hook)(NULL, 0); @@ -443,7 +449,7 @@ readline(const char *p) buf = strdup(ret); if (buf == NULL) - return NULL; + goto out; lastidx = count - 1; if (buf[lastidx] == '\n') buf[lastidx] = '\0'; @@ -453,6 +459,8 @@ readline(const char *p) history(h, &ev, H_GETSIZE); history_length = ev.num; +out: + tty_end(e); return buf; } Index: src/lib/libedit/tty.c diff -u src/lib/libedit/tty.c:1.65 src/lib/libedit/tty.c:1.66 --- src/lib/libedit/tty.c:1.65 Mon May 9 17:46:56 2016 +++ src/lib/libedit/tty.c Tue Sep 5 14:07:59 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tty.c,v 1.65 2016/05/09 21:46:56 christos Exp $ */ +/* $NetBSD: tty.c,v 1.66 2017/09/05 18:07:59 christos Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93"; #else -__RCSID("$NetBSD: tty.c,v 1.65 2016/05/09 21:46:56 christos Exp $"); +__RCSID("$NetBSD: tty.c,v 1.66 2017/09/05 18:07:59 christos Exp $"); #endif #endif /* not lint && not SCCSID */ @@ -497,7 +497,7 @@ tty_setty(EditLine *el, int action, cons static int tty_setup(EditLine *el) { - int rst = 1; + int rst = (el->el_flags & NO_RESET) == 0; if (el->el_flags & EDIT_DISABLED) return 0;