From 1cbda2c7dd6159ad29c21c03804659d2ed044523 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Mon, 7 Dec 2015 21:27:42 +0100 Subject: [PATCH] client: Rewrite readline configuration AX_LIB_READLINE tries to cope with systems where readline lacks history support, or lacks headers, or needs headers included in unorthodox ways. It puts six HAVE_ macros into config.h, and its usage example takes 24 lines of code just to include two headers. Way too complicated for my taste. Replace with new MY_LIB_READLINE, which succeeds only when you have a sane readline, and then defines *one* macro: HAVE_LIBREADLINE. Signed-off-by: Markus Armbruster --- Make.mk | 2 +- configure.ac | 2 +- m4/ax_lib_readline.m4 | 107 ---------------------------------------- m4/my_lib_readline.m4 | 25 ++++++++++ src/client/configure.ac | 2 +- src/client/main.c | 8 +-- src/client/play.c | 29 ++--------- 7 files changed, 35 insertions(+), 140 deletions(-) delete mode 100644 m4/ax_lib_readline.m4 create mode 100644 m4/my_lib_readline.m4 diff --git a/Make.mk b/Make.mk index c1a6aa923..05547d1ce 100644 --- a/Make.mk +++ b/Make.mk @@ -432,5 +432,5 @@ $(srcdir)/src/client/config.h.in: src/client/configure.ac src/client/aclocal.m4 cd $(dir $@) && autoheader touch $@ -$(srcdir)/src/client/aclocal.m4: m4/ax_lib_readline.m4 m4/ax_lib_socket_nsl.m4 m4/my_terminfo.m4 m4/my_windows_api.m4 +$(srcdir)/src/client/aclocal.m4: m4/ax_lib_socket_nsl.m4 m4/my_lib_readline.m4 m4/my_terminfo.m4 m4/my_windows_api.m4 cat $^ >$@ diff --git a/configure.ac b/configure.ac index 589b06ae7..c0816116f 100644 --- a/configure.ac +++ b/configure.ac @@ -73,7 +73,7 @@ LIBS_util="$LIBS" LIBS="$LIBS_SOCKETS $LIBS" AX_LIB_SOCKET_NSL LIBS_server="$LIBS" -AX_LIB_READLINE +MY_LIB_READLINE ### Checks for header files diff --git a/m4/ax_lib_readline.m4 b/m4/ax_lib_readline.m4 deleted file mode 100644 index 056f25c2a..000000000 --- a/m4/ax_lib_readline.m4 +++ /dev/null @@ -1,107 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_lib_readline.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_LIB_READLINE -# -# DESCRIPTION -# -# Searches for a readline compatible library. If found, defines -# `HAVE_LIBREADLINE'. If the found library has the `add_history' function, -# sets also `HAVE_READLINE_HISTORY'. Also checks for the locations of the -# necessary include files and sets `HAVE_READLINE_H' or -# `HAVE_READLINE_READLINE_H' and `HAVE_READLINE_HISTORY_H' or -# 'HAVE_HISTORY_H' if the corresponding include files exists. -# -# The libraries that may be readline compatible are `libedit', -# `libeditline' and `libreadline'. Sometimes we need to link a termcap -# library for readline to work, this macro tests these cases too by trying -# to link with `libtermcap', `libcurses' or `libncurses' before giving up. -# -# Here is an example of how to use the information provided by this macro -# to perform the necessary includes or declarations in a C file: -# -# #ifdef HAVE_LIBREADLINE -# # if defined(HAVE_READLINE_READLINE_H) -# # include -# # elif defined(HAVE_READLINE_H) -# # include -# # else /* !defined(HAVE_READLINE_H) */ -# extern char *readline (); -# # endif /* !defined(HAVE_READLINE_H) */ -# char *cmdline = NULL; -# #else /* !defined(HAVE_READLINE_READLINE_H) */ -# /* no readline */ -# #endif /* HAVE_LIBREADLINE */ -# -# #ifdef HAVE_READLINE_HISTORY -# # if defined(HAVE_READLINE_HISTORY_H) -# # include -# # elif defined(HAVE_HISTORY_H) -# # include -# # else /* !defined(HAVE_HISTORY_H) */ -# extern void add_history (); -# extern int write_history (); -# extern int read_history (); -# # endif /* defined(HAVE_READLINE_HISTORY_H) */ -# /* no history */ -# #endif /* HAVE_READLINE_HISTORY */ -# -# LICENSE -# -# Copyright (c) 2008 Ville Laurikari -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 6 - -AU_ALIAS([VL_LIB_READLINE], [AX_LIB_READLINE]) -AC_DEFUN([AX_LIB_READLINE], [ - AC_CACHE_CHECK([for a readline compatible library], - ax_cv_lib_readline, [ - ORIG_LIBS="$LIBS" - for readline_lib in readline edit editline; do - for termcap_lib in "" termcap curses ncurses; do - if test -z "$termcap_lib"; then - TRY_LIB="-l$readline_lib" - else - TRY_LIB="-l$readline_lib -l$termcap_lib" - fi - LIBS="$ORIG_LIBS $TRY_LIB" - AC_TRY_LINK_FUNC(readline, ax_cv_lib_readline="$TRY_LIB") - if test -n "$ax_cv_lib_readline"; then - break - fi - done - if test -n "$ax_cv_lib_readline"; then - break - fi - done - if test -z "$ax_cv_lib_readline"; then - ax_cv_lib_readline="no" - fi - LIBS="$ORIG_LIBS" - ]) - - if test "$ax_cv_lib_readline" != "no"; then - LIBS="$LIBS $ax_cv_lib_readline" - AC_DEFINE(HAVE_LIBREADLINE, 1, - [Define if you have a readline compatible library]) - AC_CHECK_HEADERS(readline.h readline/readline.h) - AC_CACHE_CHECK([whether readline supports history], - ax_cv_lib_readline_history, [ - ax_cv_lib_readline_history="no" - AC_TRY_LINK_FUNC(add_history, ax_cv_lib_readline_history="yes") - ]) - if test "$ax_cv_lib_readline_history" = "yes"; then - AC_DEFINE(HAVE_READLINE_HISTORY, 1, - [Define if your readline library has \`add_history']) - AC_CHECK_HEADERS(history.h readline/history.h) - fi - fi -])dnl diff --git a/m4/my_lib_readline.m4 b/m4/my_lib_readline.m4 new file mode 100644 index 000000000..5d570e5eb --- /dev/null +++ b/m4/my_lib_readline.m4 @@ -0,0 +1,25 @@ +AC_DEFUN([MY_LIB_READLINE], [ + have_readline=no + for readline_lib in readline edit editline; do + for termcap_lib in "" termlib termcap curses ncurses; do + AC_CHECK_LIB([$readline_lib], [add_history], + [have_readline=yes; break 2], [], [$termcap_lib]) + done + done + + if test "$have_readline" = yes; then + AC_CHECK_HEADER([readline/readline.h], [], [have_readline=no], + [AC_INCLUDES_DEFAULT]) + AC_CHECK_HEADER([readline/history.h], [], [have_readline=no], + [AC_INCLUDES_DEFAULT]) + fi + + if test "$have_readline" = yes; then + if test "x$termcap_lib" != x; then + LIBS="-l$termcap_lib $LIBS" + fi + LIBS="-l$readline_lib $LIBS" + AC_DEFINE([HAVE_LIBREADLINE], [1], + [Define if you have libreadline]) + fi +]) diff --git a/src/client/configure.ac b/src/client/configure.ac index ddd49fc48..90cc518ea 100644 --- a/src/client/configure.ac +++ b/src/client/configure.ac @@ -58,7 +58,7 @@ if test "$Windows_API" = yes; then AC_LIBOBJ([w32/w32io]) AC_LIBOBJ([w32/w32sockets]) fi -AX_LIB_READLINE +MY_LIB_READLINE ### Checks for header files. diff --git a/src/client/main.c b/src/client/main.c index cb81f1b0b..cdffc8ac4 100644 --- a/src/client/main.c +++ b/src/client/main.c @@ -75,9 +75,9 @@ print_usage(char *program_name) " -r Restricted mode, no redirections\n" " -s [HOST:]PORT Specify server HOST and PORT\n" " -u Use UTF-8\n" -#ifdef HAVE_READLINE_HISTORY +#ifdef HAVE_LIBREADLINE " -H Save readline command history to file\n" -#endif /* HAVE_READLINE_HISTORY */ +#endif /* HAVE_LIBREADLINE */ " -h display this help and exit\n" " -v display version information and exit\n", program_name); @@ -107,11 +107,11 @@ main(int argc, char **argv) case '2': auxfname = optarg; break; -#ifdef HAVE_READLINE_HISTORY +#ifdef HAVE_LIBREADLINE case 'H': use_history_file = 1; break; -#endif /* HAVE_READLINE_HISTORY */ +#endif /* HAVE_LIBREADLINE */ case 'k': send_kill = 1; break; diff --git a/src/client/play.c b/src/client/play.c index 9979ad697..2f75b7832 100644 --- a/src/client/play.c +++ b/src/client/play.c @@ -53,26 +53,9 @@ #include "secure.h" #ifdef HAVE_LIBREADLINE -# if defined(HAVE_READLINE_READLINE_H) -# include -# elif defined(HAVE_READLINE_H) -# include -# else /* !defined(HAVE_READLINE_H) */ -extern char *readline (); -# endif /* !defined(HAVE_READLINE_H) */ -#endif /* HAVE_LIBREADLINE */ - -#ifdef HAVE_READLINE_HISTORY -# if defined(HAVE_READLINE_HISTORY_H) -# include -# elif defined(HAVE_HISTORY_H) -# include -# else /* !defined(HAVE_HISTORY_H) */ -extern void add_history (); -extern int write_history (); -extern int read_history (); -# endif /* !defined(HAVE_HISTORY_H) */ -#endif /* HAVE_READLINE_HISTORY */ +#include +#include +#endif #define EOF_COOKIE "ctld\n" #define INTR_COOKIE "aborted\n" @@ -446,10 +429,8 @@ input_handler(char *line) { input_from_rl = line; has_rl_input = 1; -#ifdef HAVE_READLINE_HISTORY if (line && *line) add_history(line); -#endif /* HAVE_READLINE_HISTORY */ } static int @@ -583,10 +564,8 @@ play(int sock, char *history_file) sigaction(SIGPIPE, &sa, NULL); #ifdef HAVE_LIBREADLINE rl_already_prompted = 1; -#ifdef HAVE_READLINE_HISTORY if (history_file) read_history(history_file); -#endif /* HAVE_READLINE_HISTORY */ rl_bind_key('\t', rl_insert); /* Disable tab completion */ rl_callback_handler_install("", input_handler); #endif /* HAVE_LIBREADLINE */ @@ -692,10 +671,8 @@ play(int sock, char *history_file) #ifdef HAVE_LIBREADLINE rl_callback_handler_remove(); -#ifdef HAVE_READLINE_HISTORY if (history_file) write_history(history_file); -#endif /* HAVE_READLINE_HISTORY */ #endif return ret; } -- 2.43.0