Extend cli to support for libedit readline shim code. Signed-off-by: Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx> --- configure.ac | 7 ++++++- include/cli.h | 2 +- src/cli.c | 36 ++++++++++++++++++++++++++++-------- src/main.c | 4 +++- tests/build/run-tests.sh | 2 +- 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/configure.ac b/configure.ac index 1b493541af3d..043fd53e9bce 100644 --- a/configure.ac +++ b/configure.ac @@ -68,7 +68,7 @@ AC_CHECK_LIB([gmp],[__gmpz_init], , AC_MSG_ERROR([No suitable version of libgmp AM_CONDITIONAL([BUILD_MINIGMP], [test "x$with_mini_gmp" = xyes]) AC_ARG_WITH([cli], [AS_HELP_STRING([--without-cli], - [disable interactive CLI (libreadline or linenoise support)])], + [disable interactive CLI (libreadline, libedit or linenoise support)])], [], [with_cli=readline]) AS_IF([test "x$with_cli" = xreadline], [ @@ -80,6 +80,11 @@ AC_DEFINE([HAVE_LIBREADLINE], [1], []) AC_CHECK_LIB([linenoise], [linenoise], , AC_MSG_ERROR([No suitable version of linenoise found])) AC_DEFINE([HAVE_LIBLINENOISE], [1], []) +], + [test "x$with_cli" = xedit], [ +AC_CHECK_LIB([edit], [readline], , + AC_MSG_ERROR([No suitable version of libedit found])) +AC_DEFINE([HAVE_LIBEDIT], [1], []) ], [test "x$with_cli" != xno], [ AC_MSG_ERROR([unexpected CLI value: $with_cli]) diff --git a/include/cli.h b/include/cli.h index d82517750abc..609ed2ed0e0a 100644 --- a/include/cli.h +++ b/include/cli.h @@ -4,7 +4,7 @@ #include <nftables/libnftables.h> #include <config.h> -#if defined(HAVE_LIBREADLINE) || defined(HAVE_LIBLINENOISE) +#if defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDIT) || defined(HAVE_LIBLINENOISE) extern int cli_init(struct nft_ctx *nft); #else static inline int cli_init(struct nft_ctx *nft) diff --git a/src/cli.c b/src/cli.c index 4c0c3e9d67c6..45811595fc77 100644 --- a/src/cli.c +++ b/src/cli.c @@ -24,6 +24,9 @@ #ifdef HAVE_LIBREADLINE #include <readline/readline.h> #include <readline/history.h> +#elif defined(HAVE_LIBEDIT) +#include <editline/readline.h> +#include <editline/history.h> #else #include <linenoise.h> #endif @@ -48,7 +51,26 @@ init_histfile(void) snprintf(histfile, sizeof(histfile), "%s/%s", home, CMDLINE_HISTFILE); } -#ifdef HAVE_LIBREADLINE +#if defined(HAVE_LIBREADLINE) +static void nft_rl_prompt_save(void) +{ + rl_save_prompt(); + rl_clear_message(); + rl_set_prompt(".... "); +} +#define nft_rl_prompt_restore rl_restore_prompt +#elif defined(HAVE_LIBEDIT) +static void nft_rl_prompt_save(void) +{ + rl_set_prompt(".... "); +} +static void nft_rl_prompt_restore(void) +{ + rl_set_prompt("nft> "); +} +#endif + +#if defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDIT) static struct nft_ctx *cli_nft; static char *multiline; @@ -72,9 +94,7 @@ static char *cli_append_multiline(char *line) if (multiline == NULL) { multiline = line; - rl_save_prompt(); - rl_clear_message(); - rl_set_prompt(".... "); + nft_rl_prompt_save(); } else { len += strlen(multiline); s = malloc(len + 1); @@ -93,7 +113,7 @@ static char *cli_append_multiline(char *line) if (complete) { line = multiline; multiline = NULL; - rl_restore_prompt(); + nft_rl_prompt_restore(); } return line; } @@ -142,7 +162,7 @@ static char **cli_completion(const char *text, int start, int end) int cli_init(struct nft_ctx *nft) { cli_nft = nft; - rl_readline_name = "nft"; + rl_readline_name = (char *)"nft"; rl_instream = stdin; rl_outstream = stdout; @@ -166,7 +186,7 @@ void cli_exit(void) write_history(histfile); } -#else /* !HAVE_LIBREADLINE */ +#else /* HAVE_LINENOISE */ int cli_init(struct nft_ctx *nft) { @@ -195,4 +215,4 @@ void cli_exit(void) linenoiseHistorySave(histfile); } -#endif /* HAVE_LIBREADLINE */ +#endif /* HAVE_LINENOISE */ diff --git a/src/main.c b/src/main.c index 3c26f51029ff..a0caf0796a55 100644 --- a/src/main.c +++ b/src/main.c @@ -227,8 +227,10 @@ static void show_version(void) { const char *cli, *minigmp, *json, *xt; -#if defined(HAVE_LIBREADLINE) +#if defined(HAVE_READLINE) cli = "readline"; +#elif defined(HAVE_LIBEDIT) + cli = "edit"; #elif defined(HAVE_LIBLINENOISE) cli = "linenoise"; #else diff --git a/tests/build/run-tests.sh b/tests/build/run-tests.sh index ccb62af3d8dd..fc82f05b4216 100755 --- a/tests/build/run-tests.sh +++ b/tests/build/run-tests.sh @@ -2,7 +2,7 @@ log_file="`pwd`/tests.log" dir=../.. -argument=( --without-cli --with-cli=linenoise --enable-debug --with-mini-gmp +argument=( --without-cli --with-cli=linenoise --with-cli=edit --enable-debug --with-mini-gmp --enable-man-doc --with-xtables --with-json) ok=0 failed=0 -- 2.20.1