]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
cli: add libedit support
authorPablo Neira Ayuso <pablo@netfilter.org>
Mon, 4 Jan 2021 20:24:51 +0000 (21:24 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 5 Jan 2021 17:36:19 +0000 (18:36 +0100)
Extend cli to support for libedit readline shim code:

./configure --with-cli=editline

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
configure.ac
include/cli.h
src/cli.c
src/main.c
tests/build/run-tests.sh

index 1b493541af3db02040865e9d3249cf3120950388..77322dc17e281c08a30687b06e9b0bf10632bc6c 100644 (file)
@@ -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, editline 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" = xeditline], [
+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])
index d82517750abceb1ca09aed773167bfd62462785e..609ed2ed0e0aacebd83f320d98f866723dd43d38 100644 (file)
@@ -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)
index 4c0c3e9d67c63a9008ca0dcc74e7792b28d5dff4..45811595fc779fcb07ff4caf0838ec5714335f2c 100644 (file)
--- 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 */
index 3c26f51029ff3e979d0d584578ef2ef0b5d7077a..0a1c47758d1aa282a13005dc3c2d563a220f9ff0 100644 (file)
@@ -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 = "editline";
 #elif defined(HAVE_LIBLINENOISE)
        cli = "linenoise";
 #else
index ccb62af3d8dd3d4768f4048bd518672fd8009f99..9ce93a8ed38115cb5c26afccd9fb24f12df391b1 100755 (executable)
@@ -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=editline --enable-debug --with-mini-gmp
           --enable-man-doc --with-xtables --with-json)
 ok=0
 failed=0