[parted-devel] [PATCH] Work around test failures caused by inadequate libreadline.

Jim Meyering jim at meyering.net
Fri Jun 22 17:57:51 UTC 2007


* configure.ac: Reject an inadequate libreadline5.0.
* parted/ui.c (_readline) [!HAVE_LIBREADLINE]: Echo each
just-read line, to be consistent with libreadline5.2.

Signed-off-by: Jim Meyering <jim at meyering.net>
---
 configure.ac |   39 ++++++++++++++++++++++++++++++++++++---
 parted/ui.c  |   10 ++++++++--
 2 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index b21be56..6d1b93f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -307,13 +307,13 @@ fi
 dnl Check for readline
 dnl NOTE: We need to remove the gl_cv_ignore_unused_libraries flag if we
 dnl detected one earlier.  libreadline on some platforms (e.g., RHEL and
-dnl Fedora) is left with 
+dnl Fedora) is left with
 if test "$with_readline" = yes; then
 	OLD_LIBS="$LIBS"
 	LIBS="$LIBS $PARTED_LIBS"
+	found_working_libreadline=no
 	AC_CHECK_LIB(readline, readline,
-		PARTED_LIBS="-lreadline $PARTED_LIBS"
-		AC_DEFINE(HAVE_LIBREADLINE, 1, [have readline]),
+		found_working_libreadline=yes,
 		AC_MSG_ERROR(
 GNU Readline could not be found which is required for the
 --with-readline (which is enabled by default).  Either disable readline support with
@@ -326,6 +326,39 @@ package as well (which may be called readline-devel or something similar).
 		$PARTED_LIBS
 	)
  	LIBS="$OLD_LIBS"
+
+	# See if libreadline is too old to be used.
+	# The readline function in Debian's libreadline5 5.0-10 fails to
+	# print to stdout the response (from stdin) to a prompt, when stdout
+	# is redirected, while 5.2-3 works fine.  That failure would cause
+	# several of parted's tests to failure.
+	# The purist approach would be to write a run-test, but that's
+	# not friendly to cross-compilers, so here's a compromise:
+	#
+	# See if libreadline defines one of these symbols:
+	# [this is the list of public symbols that are in 5.2, but not 5.0]
+	#
+	# $ diff -u /tmp/readline-5.[02]|grep '+T.[^_]'
+	# +T rl_vi_rubout
+	# +T rl_variable_value
+	# +T rl_reset_screen_size
+	# +T alloc_history_entry
+	# +T copy_history_entry
+	# +T replace_history_data
+	#
+	# If not, then reject this readline lib.
+	AC_CHECK_LIB([readline], [rl_variable_value],
+		     ,
+		     AC_MSG_ERROR(
+Your version of libreadline is too old to be used.
+Consider upgrading to version 5.2 or newer.)
+		     found_working_libreadline=no,
+		     $PARTED_LIBS)
+
+	if test $found_working_libreadline = yes; then
+		PARTED_LIBS="-lreadline $PARTED_LIBS"
+		AC_DEFINE(HAVE_LIBREADLINE, 1, [have readline]),
+	fi
 fi
 
 AC_SUBST(PARTED_LIBS)
diff --git a/parted/ui.c b/parted/ui.c
index 58e4563..9828b1a 100644
--- a/parted/ui.c
+++ b/parted/ui.c
@@ -563,9 +563,15 @@ _readline (const char* prompt, const StrList* possibilities)
                 fputs (prompt, stdout);
                 fflush (stdout);
                 line = (char*) malloc (256);
-                if (fgets (line, 256, stdin) && strcmp (line, "") != 0)
+                if (fgets (line, 256, stdin) && strcmp (line, "") != 0) {
+#ifndef HAVE_LIBREADLINE
+                        /* Echo the input line, to be consistent with
+                           how readline-5.2 works.  */
+                        fputs (line, stdout);
+                        fflush (stdout);
+#endif
                         line [strlen (line) - 1] = 0;    /* kill trailing CR */
-                else {
+                } else {
                         free (line);
                         line = NULL;
                 }
-- 
1.5.2.1.280.g38570




More information about the parted-devel mailing list