summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cli/src/cli-rl.c30
-rw-r--r--cli/src/cli.h1
2 files changed, 31 insertions, 0 deletions
diff --git a/cli/src/cli-rl.c b/cli/src/cli-rl.c
index bc2e80eba..e0061d125 100644
--- a/cli/src/cli-rl.c
+++ b/cli/src/cli-rl.c
@@ -336,6 +336,28 @@ complete_none (const char *txt, int times)
}
+void *
+cli_rl_input (void *_data)
+{
+ struct cli_state *state = NULL;
+ char *line = NULL;
+
+ state = _data;
+
+ for (;;) {
+ line = readline (state->prompt);
+ if (!line)
+ break;
+
+ cli_rl_process_line (line);
+
+ free (line);
+ }
+
+ return NULL;
+}
+
+
int
cli_rl_enable (struct cli_state *state)
{
@@ -345,6 +367,14 @@ cli_rl_enable (struct cli_state *state)
rl_attempted_completion_function = cli_rl_autocomplete;
rl_completion_entry_function = complete_none;
+ if (!state->rl_async) {
+ ret = pthread_create (&state->input, NULL,
+ cli_rl_input, state);
+ if (ret == 0)
+ state->rl_enabled = 1;
+ goto out;
+ }
+
ret = event_register (state->ctx->event_pool, 0, cli_rl_stdin, state,
1, 0);
if (ret == -1)
diff --git a/cli/src/cli.h b/cli/src/cli.h
index a53b6a9e1..808e92360 100644
--- a/cli/src/cli.h
+++ b/cli/src/cli.h
@@ -85,6 +85,7 @@ struct cli_state {
/* terminal I/O */
const char *prompt;
int rl_enabled;
+ int rl_async;
int rl_processing;
/* autocompletion state */