[PATCH nft] cli: add libedit support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux