1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-03 22:56:33 +02:00

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>
This commit is contained in:
Werner Koch 2020-07-02 15:47:57 +02:00
parent 07aef873eb
commit d70b8769c8
No known key found for this signature in database
GPG key ID: E3FDFF218E45B72B
9 changed files with 216 additions and 7 deletions

View file

@ -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
}