[dm-devel] [PATCH v4 01/12] multipathd: replace libreadline with getline()
mwilck at suse.com
mwilck at suse.com
Tue Aug 30 19:27:02 UTC 2022
From: Hannes Reinecke <hare at suse.de>
libreadline changed the license to be incompatible with multipath-tools
usage, so replace it with a simple getline().
mwilck: Make this the default option via Makefile.inc; it is used if
READLINE is unset. Compiling with READLINE=libreadline or READLINE=libedit
remains possible.
Signed-off-by: Hannes Reinecke <hare at suse.de>
Signed-off-by: Martin Wilck <mwilck at suse.com>
---
Makefile.inc | 4 ++--
multipathd/cli.c | 2 ++
multipathd/cli.h | 4 +++-
multipathd/uxclnt.c | 49 +++++++++++++++++++++++++++++++++------------
4 files changed, 43 insertions(+), 16 deletions(-)
diff --git a/Makefile.inc b/Makefile.inc
index ad7afd0..4b32fa7 100644
--- a/Makefile.inc
+++ b/Makefile.inc
@@ -9,10 +9,10 @@
# Uncomment to disable dmevents polling support
# ENABLE_DMEVENTS_POLL = 0
#
-# Readline library to use, libedit or libreadline
+# Readline library to use, libedit, libreadline, or empty
# Caution: Using libreadline may make the multipathd binary undistributable,
# see https://github.com/opensvc/multipath-tools/issues/36
-READLINE = libedit
+READLINE :=
# List of scsi device handler modules to load on boot, e.g.
# SCSI_DH_MODULES_PRELOAD := scsi_dh_alua scsi_dh_rdac
diff --git a/multipathd/cli.c b/multipathd/cli.c
index fa482a6..cc56950 100644
--- a/multipathd/cli.c
+++ b/multipathd/cli.c
@@ -459,6 +459,7 @@ void cli_exit(void)
keys = NULL;
}
+#if defined(USE_LIBREADLINE) || defined(USE_LIBEDIT)
static int
key_match_fingerprint (struct key * kw, uint64_t fp)
{
@@ -564,3 +565,4 @@ key_generator (const char * str, int state)
*/
return ((char *)NULL);
}
+#endif
diff --git a/multipathd/cli.h b/multipathd/cli.h
index a6082ac..2a0c102 100644
--- a/multipathd/cli.h
+++ b/multipathd/cli.h
@@ -151,6 +151,8 @@ void free_keys (vector vec);
void free_handlers (void);
int cli_init (void);
void cli_exit(void);
-char * key_generator (const char * str, int state);
+#if defined(USE_LIBREADLINE) || defined(USE_LIBEDIT)
+char *key_generator (const char * str, int state);
+#endif
#endif /* _CLI_H_ */
diff --git a/multipathd/uxclnt.c b/multipathd/uxclnt.c
index 251e7d7..deff565 100644
--- a/multipathd/uxclnt.c
+++ b/multipathd/uxclnt.c
@@ -30,6 +30,7 @@
#include "defaults.h"
#include "vector.h"
+#include "util.h"
#include "cli.h"
#include "uxclnt.h"
@@ -77,35 +78,57 @@ static int need_quit(char *str, size_t len)
*/
static void process(int fd, unsigned int timeout)
{
- char *line;
- char *reply;
- int ret;
- cli_init();
+#if defined(USE_LIBREADLINE) || defined(USE_LIBEDIT)
rl_readline_name = "multipathd";
rl_completion_entry_function = key_generator;
- while ((line = readline("multipathd> "))) {
- size_t llen = strlen(line);
+#endif
- if (!llen) {
- free(line);
+ cli_init();
+ for(;;)
+ {
+ char *line __attribute__((cleanup(cleanup_charp))) = NULL;
+ char *reply __attribute__((cleanup(cleanup_charp))) = NULL;
+ ssize_t llen;
+ int ret;
+
+#if defined(USE_LIBREADLINE) || defined(USE_LIBEDIT)
+ line = readline("multipathd> ");
+ if (!line)
+ break;
+ llen = strlen(line);
+ if (!llen)
continue;
+#else
+ size_t lsize = 0;
+
+ fputs("multipathd> ", stdout);
+ errno = 0;
+ llen = getline(&line, &lsize, stdin);
+ if (llen == -1) {
+ if (errno != 0)
+ fprintf(stderr, "Error in getline: %m");
+ break;
}
+ if (!llen || !strcmp(line, "\n"))
+ continue;
+#endif
if (need_quit(line, llen))
break;
- if (send_packet(fd, line) != 0) break;
+ if (send_packet(fd, line) != 0)
+ break;
ret = recv_packet(fd, &reply, timeout);
- if (ret != 0) break;
+ if (ret != 0)
+ break;
print_reply(reply);
+#if defined(USE_LIBREADLINE) || defined(USE_LIBEDIT)
if (line && *line)
add_history(line);
-
- free(line);
- free(reply);
+#endif
}
}
--
2.37.1
More information about the dm-devel
mailing list