summaryrefslogtreecommitdiffstats
path: root/common/ttyio.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2020-07-02 15:47:57 +0200
committerWerner Koch <wk@gnupg.org>2020-07-02 15:48:55 +0200
commitd70b8769c888f42896ae3ef4972bf82e9b5a0c32 (patch)
tree8a7334e5c82d69ec24a6b7c29e48971297a33f02 /common/ttyio.c
parentscd:nks: Fix certificate read problem with TCOS signature card v2. (diff)
downloadgnupg2-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/ttyio.c')
-rw-r--r--common/ttyio.c39
1 files changed, 37 insertions, 2 deletions
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);
}