Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libedit PR/51517: Jay West: Tty settings not restored on...



details:   https://anonhg.NetBSD.org/src/rev/6e3a3064460f
branches:  trunk
changeset: 356097:6e3a3064460f
user:      christos <christos%NetBSD.org@localhost>
date:      Fri Sep 01 10:19:10 2017 +0000

description:
PR/51517: Jay West: Tty settings not restored on exit
PR/51518: Jay West: prompt is interleaved with client output

Both these issues are caused by rl_restore_handler not DTRT; fix
it so that it kills the internal libedit state completely. This is
inefficient, but it works.

Also fix:
1. add append_history()/H_NSAVE_FP
2. call the rl_startup_hook before printing the first prompt as documented.
   callint it from rl_initialize breaks python, because the callback ends
   up being invoked before the readline module is installed, and we end up
   dereferencing a NULL pointer.
3. add el_resize_terminal.

With those changes, s/lreadline/ledit/g in python works.

diffstat:

 lib/libedit/editline.3          |  11 ++++++++-
 lib/libedit/hist.h              |  19 +++++++++--------
 lib/libedit/histedit.h          |   3 +-
 lib/libedit/history.c           |  35 +++++++++++++++++++++++---------
 lib/libedit/readline.c          |  44 +++++++++++++++++++++++++++++++++++-----
 lib/libedit/readline/readline.h |   4 ++-
 6 files changed, 87 insertions(+), 29 deletions(-)

diffs (293 lines):

diff -r 57be3f3a6242 -r 6e3a3064460f lib/libedit/editline.3
--- a/lib/libedit/editline.3    Fri Sep 01 07:29:56 2017 +0000
+++ b/lib/libedit/editline.3    Fri Sep 01 10:19:10 2017 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: editline.3,v 1.96 2017/07/03 21:32:50 wiz Exp $
+.\"    $NetBSD: editline.3,v 1.97 2017/09/01 10:19:10 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 June 27, 2017
+.Dd September 1, 2017
 .Dt EDITLINE 3
 .Os
 .Sh NAME
@@ -843,6 +843,13 @@
 .Ft FILE
 pointer
 .Fa fp .
+.It Dv H_NSAVE_FP , Fa "size_t n" , Fa "FILE *fp"
+Save the last 
+.Ft n
+history entries to the opened
+.Ft FILE
+pointer
+.Fa fp .
 .It Dv H_SETUNIQUE , Fa "int unique"
 Set flag that adjacent identical event strings should not be entered
 into the history.
diff -r 57be3f3a6242 -r 6e3a3064460f lib/libedit/hist.h
--- a/lib/libedit/hist.h        Fri Sep 01 07:29:56 2017 +0000
+++ b/lib/libedit/hist.h        Fri Sep 01 10:19:10 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: hist.h,v 1.22 2016/05/09 21:46:56 christos Exp $       */
+/*     $NetBSD: hist.h,v 1.23 2017/09/01 10:19:10 christos Exp $       */
 
 /*-
  * Copyright (c) 1992, 1993
@@ -59,14 +59,15 @@
     (((el)->el_flags & NARROW_HISTORY) ? hist_convert(el, fn, arg) : \
        HIST_FUN_INTERNAL(el, fn, arg))
 
-#define        HIST_NEXT(el)           HIST_FUN(el, H_NEXT, NULL)
-#define        HIST_FIRST(el)          HIST_FUN(el, H_FIRST, NULL)
-#define        HIST_LAST(el)           HIST_FUN(el, H_LAST, NULL)
-#define        HIST_PREV(el)           HIST_FUN(el, H_PREV, NULL)
-#define        HIST_SET(el, num)       HIST_FUN(el, H_SET, num)
-#define        HIST_LOAD(el, fname)    HIST_FUN(el, H_LOAD fname)
-#define        HIST_SAVE(el, fname)    HIST_FUN(el, H_SAVE fname)
-#define        HIST_SAVE_FP(el, fp)    HIST_FUN(el, H_SAVE_FP fp)
+#define        HIST_NEXT(el)                   HIST_FUN(el, H_NEXT, NULL)
+#define        HIST_FIRST(el)                  HIST_FUN(el, H_FIRST, NULL)
+#define        HIST_LAST(el)                   HIST_FUN(el, H_LAST, NULL)
+#define        HIST_PREV(el)                   HIST_FUN(el, H_PREV, NULL)
+#define        HIST_SET(el, num)               HIST_FUN(el, H_SET, num)
+#define        HIST_LOAD(el, fname)            HIST_FUN(el, H_LOAD fname)
+#define        HIST_SAVE(el, fname)            HIST_FUN(el, H_SAVE fname)
+#define        HIST_SAVE_FP(el, fp)            HIST_FUN(el, H_SAVE_FP, fp)
+#define        HIST_NSAVE_FP(el, n, fp)        HIST_FUN(el, H_NSAVE_FP, n, fp)
 
 libedit_private int            hist_init(EditLine *);
 libedit_private void           hist_end(EditLine *);
diff -r 57be3f3a6242 -r 6e3a3064460f lib/libedit/histedit.h
--- a/lib/libedit/histedit.h    Fri Sep 01 07:29:56 2017 +0000
+++ b/lib/libedit/histedit.h    Fri Sep 01 10:19:10 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: histedit.h,v 1.56 2016/04/19 19:50:53 christos Exp $   */
+/*     $NetBSD: histedit.h,v 1.57 2017/09/01 10:19:10 christos Exp $   */
 
 /*-
  * Copyright (c) 1992, 1993
@@ -226,6 +226,7 @@
 #define        H_DELDATA       24      /* , int, histdata_t *);*/
 #define        H_REPLACE       25      /* , const char *, histdata_t); */
 #define        H_SAVE_FP       26      /* , FILE *);           */
+#define        H_NSAVE_FP      27      /* , size_t, FILE *);   */
 
 
 
diff -r 57be3f3a6242 -r 6e3a3064460f lib/libedit/history.c
--- a/lib/libedit/history.c     Fri Sep 01 07:29:56 2017 +0000
+++ b/lib/libedit/history.c     Fri Sep 01 10:19:10 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: history.c,v 1.57 2016/04/11 18:56:31 christos Exp $    */
+/*     $NetBSD: history.c,v 1.58 2017/09/01 10:19:10 christos Exp $    */
 
 /*-
  * Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)history.c  8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: history.c,v 1.57 2016/04/11 18:56:31 christos Exp $");
+__RCSID("$NetBSD: history.c,v 1.58 2017/09/01 10:19:10 christos Exp $");
 #endif
 #endif /* not lint && not SCCSID */
 
@@ -140,7 +140,7 @@
 static int history_set_fun(TYPE(History) *, TYPE(History) *);
 static int history_load(TYPE(History) *, const char *);
 static int history_save(TYPE(History) *, const char *);
-static int history_save_fp(TYPE(History) *, FILE *);
+static int history_save_fp(TYPE(History) *, size_t, FILE *);
 static int history_prev_event(TYPE(History) *, TYPE(HistEvent) *, int);
 static int history_next_event(TYPE(History) *, TYPE(HistEvent) *, int);
 static int history_next_string(TYPE(History) *, TYPE(HistEvent) *,
@@ -825,7 +825,7 @@
  *     TYPE(History) save function
  */
 static int
-history_save_fp(TYPE(History) *h, FILE *fp)
+history_save_fp(TYPE(History) *h, size_t nelem, FILE *fp)
 {
        TYPE(HistEvent) ev;
        int i = -1, retval;
@@ -838,14 +838,22 @@
 
        if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1)
                goto done;
-       if (fputs(hist_cookie, fp) == EOF)
+       if (ftell(fp) == 0 && fputs(hist_cookie, fp) == EOF)
                goto done;
        ptr = h_malloc((max_size = 1024) * sizeof(*ptr));
        if (ptr == NULL)
                goto done;
-       for (i = 0, retval = HLAST(h, &ev);
-           retval != -1;
-           retval = HPREV(h, &ev), i++) {
+       if (nelem != (size_t)-1) {
+               for (retval = HFIRST(h, &ev); retval != -1 && nelem-- > 0;
+                   retval = HNEXT(h, &ev))
+                       continue;
+       } else
+               retval = -1;
+
+       if (retval == -1)
+               retval = HLAST(h, &ev);
+
+       for (i = 0; retval != -1; retval = HPREV(h, &ev), i++) {
                str = ct_encode_string(ev.str, &conv);
                len = strlen(str) * 4 + 1;
                if (len > max_size) {
@@ -880,7 +888,7 @@
     if ((fp = fopen(fname, "w")) == NULL)
        return -1;
 
-    i = history_save_fp(h, fp);
+    i = history_save_fp(h, (size_t)-1, fp);
 
     (void) fclose(fp);
     return i;
@@ -1068,7 +1076,14 @@
                break;
 
        case H_SAVE_FP:
-               retval = history_save_fp(h, va_arg(va, FILE *));
+               retval = history_save_fp(h, (size_t)-1, va_arg(va, FILE *));
+               if (retval == -1)
+                   he_seterrev(ev, _HE_HIST_WRITE);
+               break;
+
+       case H_NSAVE_FP:
+               retval = history_save_fp(h, va_arg(va, size_t),
+                   va_arg(va, FILE *));
                if (retval == -1)
                    he_seterrev(ev, _HE_HIST_WRITE);
                break;
diff -r 57be3f3a6242 -r 6e3a3064460f lib/libedit/readline.c
--- a/lib/libedit/readline.c    Fri Sep 01 07:29:56 2017 +0000
+++ b/lib/libedit/readline.c    Fri Sep 01 10:19:10 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: readline.c,v 1.141 2017/04/21 05:38:03 abhinav Exp $   */
+/*     $NetBSD: readline.c,v 1.142 2017/09/01 10:19:10 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.141 2017/04/21 05:38:03 abhinav Exp $");
+__RCSID("$NetBSD: readline.c,v 1.142 2017/09/01 10:19:10 christos Exp $");
 #endif /* not lint && not SCCSID */
 
 #include <sys/types.h>
@@ -122,6 +122,7 @@
 int _rl_print_completions_horizontally = 0;
 VFunction *rl_redisplay_function = NULL;
 Function *rl_startup_hook = NULL;
+int rl_did_startup_hook = 0;
 VFunction *rl_completion_display_matches_hook = NULL;
 VFunction *rl_prep_term_function = (VFunction *)rl_prep_terminal;
 VFunction *rl_deprep_term_function = (VFunction *)rl_deprep_terminal;
@@ -385,9 +386,6 @@
        _resize_fun(e, &rl_line_buffer);
        _rl_update_pos();
 
-       if (rl_startup_hook)
-               (*rl_startup_hook)(NULL, 0);
-
        return 0;
 }
 
@@ -408,6 +406,11 @@
 
        if (e == NULL || h == NULL)
                rl_initialize();
+       if (rl_did_startup_hook == 0 && rl_startup_hook) {
+               rl_did_startup_hook = 1;
+               (*rl_startup_hook)(NULL, 0);
+       }
+
 
        rl_done = 0;
 
@@ -1365,6 +1368,28 @@
            (errno ? errno : EINVAL) : 0;
 }
 
+int
+append_history(int n, const char *filename)
+{
+       HistEvent ev;
+       FILE *fp;
+
+       if (h == NULL || e == NULL)
+               rl_initialize();
+       if (filename == NULL && (filename = _default_history_file()) == NULL)
+               return errno;
+
+       if ((fp = fopen(filename, "a")) == NULL)
+               return errno;
+
+       if (history(h, &ev, H_NSAVE_FP, (size_t)n,  fp) == -1) {
+               int serrno = errno ? errno : EINVAL;
+               fclose(fp);
+               return serrno;
+       }
+       fclose(fp);
+       return 0;
+}
 
 /*
  * returns history ``num''th event
@@ -2058,8 +2083,9 @@
 void
 rl_callback_handler_remove(void)
 {
-       el_set(e, EL_UNBUFFERED, 0);
        rl_linefunc = NULL;
+       el_end(e);
+       e = NULL;
 }
 
 void
@@ -2369,3 +2395,9 @@
 {
        return 0;
 }
+
+void
+rl_resize_terminal(void)
+{
+       el_resize(e);
+}
diff -r 57be3f3a6242 -r 6e3a3064460f lib/libedit/readline/readline.h
--- a/lib/libedit/readline/readline.h   Fri Sep 01 07:29:56 2017 +0000
+++ b/lib/libedit/readline/readline.h   Fri Sep 01 10:19:10 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: readline.h,v 1.41 2016/10/28 18:32:35 christos Exp $   */
+/*     $NetBSD: readline.h,v 1.42 2017/09/01 10:19:10 christos Exp $   */
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -147,6 +147,7 @@
 void            using_history(void);
 int             add_history(const char *);
 void            clear_history(void);
+int             append_history(int, const char *);
 void            stifle_history(int);
 int             unstifle_history(void);
 int             history_is_stifled(void);
@@ -182,6 +183,7 @@
 int             rl_insert(int, int);
 int             rl_insert_text(const char *);
 void            rl_reset_terminal(const char *);
+void            rl_resize_terminal(void);
 int             rl_bind_key(int, rl_command_func_t *);
 int             rl_newline(int, int);
 void            rl_callback_read_char(void);



Home | Main Index | Thread Index | Old Index