diff --git a/client/display.c b/client/display.c
index d85b9d0..1dc4294 100644
--- a/client/display.c
+++ b/client/display.c
#include "display.h"
+static char *saved_prompt = NULL;
+static int saved_point = 0;
+static rl_prompt_input_func saved_func = NULL;
+static void *saved_user_data = NULL;
+
void rl_printf(const char *fmt, ...)
{
va_list args;
rl_printf("%s\n", str);
}
}
+
+void rl_prompt_input(const char *label, const char *msg,
+ rl_prompt_input_func func, void *user_data)
+{
+ char prompt[256];
+
+ /* Normal use should not prompt for user input to the value a second
+ * time before it releases the prompt, but we take a safe action. */
+ if (saved_prompt)
+ return;
+
+ saved_point = rl_point;
+ saved_prompt = strdup(rl_prompt);
+ saved_func = func;
+ saved_user_data = user_data;
+
+ memset(prompt, 0, sizeof(prompt));
+ snprintf(prompt, sizeof(prompt), COLOR_RED "[%s]" COLOR_OFF " %s ",
+ label, msg);
+ rl_set_prompt(prompt);
+
+ rl_replace_line("", 0);
+ rl_redisplay();
+}
+
+int rl_release_prompt(const char *input)
+{
+ rl_prompt_input_func func;
+ void *user_data;
+
+ if (!saved_prompt)
+ return -1;
+
+ /* This will cause rl_expand_prompt to re-run over the last prompt, but
+ * our prompt doesn't expand anyway. */
+ rl_set_prompt(saved_prompt);
+ rl_replace_line("", 0);
+ rl_point = saved_point;
+ rl_redisplay();
+
+ free(saved_prompt);
+ saved_prompt = NULL;
+
+ func = saved_func;
+ user_data = saved_user_data;
+
+ saved_func = NULL;
+ saved_user_data = NULL;
+
+ func(input, user_data);
+
+ return 0;
+}
diff --git a/client/display.h b/client/display.h
index 88dbbd0..e991d19 100644
--- a/client/display.h
+++ b/client/display.h
void rl_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
void rl_hexdump(const unsigned char *buf, size_t len);
+
+typedef void (*rl_prompt_input_func) (const char *input, void *user_data);
+void rl_prompt_input(const char *label, const char *msg,
+ rl_prompt_input_func func, void *user_data);
+int rl_release_prompt(const char *input);
diff --git a/client/main.c b/client/main.c
index 31d06b8..c42bf50 100644
--- a/client/main.c
+++ b/client/main.c
if (agent_input(dbus_conn, input) == TRUE)
goto done;
+ if (!rl_release_prompt(input))
+ goto done;
+
add_history(input);
cmd = strtok_r(input, " ", &arg);