diff options
author | Werner Koch <wk@gnupg.org> | 2020-07-02 15:47:57 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2020-07-02 15:48:55 +0200 |
commit | d70b8769c888f42896ae3ef4972bf82e9b5a0c32 (patch) | |
tree | 8a7334e5c82d69ec24a6b7c29e48971297a33f02 /common/gpgrlhelp.c | |
parent | scd:nks: Fix certificate read problem with TCOS signature card v2. (diff) | |
download | gnupg2-d70b8769c888f42896ae3ef4972bf82e9b5a0c32.tar.xz gnupg2-d70b8769c888f42896ae3ef4972bf82e9b5a0c32.zip |
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 <wk@gnupg.org>
Diffstat (limited to 'common/gpgrlhelp.c')
-rw-r--r-- | common/gpgrlhelp.c | 71 |
1 files changed, 69 insertions, 2 deletions
diff --git a/common/gpgrlhelp.c b/common/gpgrlhelp.c index 680d9998b..fd3a48f8a 100644 --- a/common/gpgrlhelp.c +++ b/common/gpgrlhelp.c @@ -77,11 +77,77 @@ init_stream (FILE *fp) rl_inhibit_completion = 1; } + +/* Read or write the history to or from the file FILENAME. The + * behaviour depends on the flag WRITE_MODE: + * + * In read mode (WRITE_MODE is false) these semantics are used: + * + * If NLINES is positive only this number of lines are read from the + * history and the history is always limited to that number of + * lines. A negative value for NLINES is undefined. + * + * If FILENAME is NULL the current history is cleared. If NLINES is + * positive the number of lines stored in the history is limited to + * that number. A negative value for NLINES is undefined. + * + * If WRITE_MODE is true these semantics are used: + * + * If NLINES is negative the history and the history file are + * cleared; if it is zero the entire history is written to the file; + * if it is positive the history is written to the file and the file + * is truncated to this number of lines. + * + * If FILENAME is NULL no file operations are done but if NLINES is + * negative the entire history is cleared. + * + * On success 0 is returned; on error -1 is returned and ERRNO is set. + */ +static int +read_write_history (const char *filename, int write_mode, int nlines) +{ + int rc; + + if (write_mode) + { + if (nlines < 0) + clear_history (); + rc = filename? write_history (filename) : 0; + if (!rc && filename && nlines > 0) + rc = history_truncate_file (filename, nlines); + if (rc) + { + gpg_err_set_errno (rc); + return -1; + } + } + else + { + clear_history (); + if (filename) + { + if (nlines) + rc = read_history_range (filename, 0, nlines); + else + rc = read_history (filename); + if (rc) + { + gpg_err_set_errno (rc); + return -1; + } + } + if (nlines > 0) + stifle_history (nlines); + } + + return 0; +} + #endif /*HAVE_LIBREADLINE*/ /* Initialize our readline code. This should be called as early as - possible as it is actually a constructur. */ + * possible as it is actually a constructor. */ void gnupg_rl_initialize (void) { @@ -91,7 +157,8 @@ gnupg_rl_initialize (void) inhibit_completion, cleanup_after_signal, readline, - add_history); + add_history, + read_write_history); rl_readline_name = GNUPG_NAME; #endif } |