From d70b8769c888f42896ae3ef4972bf82e9b5a0c32 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 2 Jul 2020 15:47:57 +0200 Subject: Support a history file in gpg-card and gpg-connect-agent. * common/gpgrlhelp.c (read_write_history): New. (gnupg_rl_initialize): Register new function. * common/ttyio.c (my_rl_rw_history): New var. (tty_private_set_rl_hooks): Add arg read_write_history. (tty_read_history): New. (tty_write_history): New. * tools/gpg-card.c (HISTORYNAME): New. (oNoHistory): New enum value. (opts): New option --no-history. (cmd_history): New. (cmds): New command "history". (interactive_loop): Read and save the history. * tools/gpg-connect-agent.c (HISTORYNAME): New. (opts): New option --no-history. (main): Read and save the history. New command /history. -- Yeah, finally we have stored history; I should have added this much earlier. Signed-off-by: Werner Koch --- common/ttyio.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'common/ttyio.c') diff --git a/common/ttyio.c b/common/ttyio.c index 4c095bc03..a27c095cf 100644 --- a/common/ttyio.c +++ b/common/ttyio.c @@ -101,7 +101,7 @@ static void (*my_rl_cleanup_after_signal) (void); static void (*my_rl_init_stream) (FILE *); static char *(*my_rl_readline) (const char*); static void (*my_rl_add_history) (const char*); - +static int (*my_rl_rw_history)(const char *, int, int); /* This is a wrapper around ttyname so that we can use it even when the standard streams are redirected. It figures the name out the @@ -703,7 +703,8 @@ tty_private_set_rl_hooks (void (*init_stream) (FILE *), void (*inhibit_completion) (int), void (*cleanup_after_signal) (void), char *(*readline_fun) (const char*), - void (*add_history_fun) (const char*)) + void (*add_history_fun) (const char*), + int (*rw_history_fun)(const char *, int, int)) { my_rl_init_stream = init_stream; my_rl_set_completer = set_completer; @@ -711,6 +712,40 @@ tty_private_set_rl_hooks (void (*init_stream) (FILE *), my_rl_cleanup_after_signal = cleanup_after_signal; my_rl_readline = readline_fun; my_rl_add_history = add_history_fun; + my_rl_rw_history = rw_history_fun; +} + + +/* Read the history from FILENAME or limit the size of the history. + * If FILENAME is NULL and NLINES is zero the current history is + * cleared. Returns 0 on success or -1 on error and sets ERRNO. No + * error is return if readline support is not available. */ +int +tty_read_history (const char *filename, int nlines) +{ + int rc; + + if (!my_rl_rw_history) + return 0; + + rc = my_rl_rw_history (filename, 0, nlines); + if (rc && gpg_err_code_from_syserror () == GPG_ERR_ENOENT) + rc = 0; + + return rc; +} + + +/* Write the current history to the file FILENAME. Returns 0 on + * success or -1 on error and sets ERRNO. No error is return if + * readline support is not available. */ +int +tty_write_history (const char *filename) +{ + if (!my_rl_rw_history) + return 0; + + return my_rl_rw_history (filename, 1, 0); } -- cgit v1.2.3