[Asterisk-code-review] cli: Fix ast el read char to work with libedit >= 3.1 (asterisk[master])
Joshua Colp
asteriskteam at digium.com
Wed Nov 16 12:18:27 CST 2016
Joshua Colp has submitted this change and it was merged. ( https://gerrit.asterisk.org/4412 )
Change subject: cli: Fix ast_el_read_char to work with libedit >= 3.1
......................................................................
cli: Fix ast_el_read_char to work with libedit >= 3.1
Libedit 3.1 is not build with unicode on as a default and so the
prototype for the el_gets callback changed from expecting a char buffer
to accepting a wchar buffer. If ast_el_read_char isn't changed,
the cli reads garbage from teh terminal.
Added a configure test for (*el_rfunc_t)(EditLine *, wchar_t *) and
updated ast_el_read_char to use the HAVE_ define to detemrine whether
to use char or wchar.
ASTERISK-26592 #close
Change-Id: I9099b46f68e06d0202ff80e53022a2b68b08871a
---
M configure
M configure.ac
M include/asterisk/autoconfig.h.in
M main/asterisk.c
4 files changed, 92 insertions(+), 3 deletions(-)
Approvals:
Mark Michelson: Looks good to me, approved
Anonymous Coward #1000019: Verified
Joshua Colp: Looks good to me, but someone else must approve
diff --git a/configure b/configure
index 5d21730..17f84ea 100755
--- a/configure
+++ b/configure
@@ -1055,6 +1055,10 @@
LIBXML2_DIR
LIBXML2_INCLUDE
LIBXML2_LIB
+PBX_LIBEDIT_IS_UNICODE
+LIBEDIT_IS_UNICODE_DIR
+LIBEDIT_IS_UNICODE_INCLUDE
+LIBEDIT_IS_UNICODE_LIB
PBX_LIBEDIT
LIBEDIT_DIR
LIBEDIT_INCLUDE
@@ -10726,6 +10730,18 @@
fi
+
+
+
+
+
+
+
+LIBEDIT_IS_UNICODE_DESCRIP="Libedit compiled for unicode"
+LIBEDIT_IS_UNICODE_OPTION=libedit
+LIBEDIT_IS_UNICODE_DIR=${LIBEDIT_DIR}
+
+PBX_LIBEDIT_IS_UNICODE=0
@@ -21129,11 +21145,58 @@
fi
if test "$PBX_LIBEDIT" = "1"; then
- LIBEDIT_INTERNAL="no"
+ LIBEDIT_INTERNAL="no"
fi
fi
if test "${LIBEDIT_INTERNAL}" = "yes"; then
PBX_LIBEDIT=1
+ LIBEDIT_IS_UNICODE=no
+ else
+
+ if test "x${PBX_LIBEDIT_IS_UNICODE}" != "x1" -a "${USE_LIBEDIT_IS_UNICODE}" != "no"; then
+ if test "xTesting for libedit unicode support" != "x"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Testing for libedit unicode support" >&5
+$as_echo_n "checking for Testing for libedit unicode support... " >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if \"el_rfunc_t *callback;\" compiles using histedit.h" >&5
+$as_echo_n "checking if \"el_rfunc_t *callback;\" compiles using histedit.h... " >&6; }
+ fi
+ saved_cppflags="${CPPFLAGS}"
+ if test "x${LIBEDIT_IS_UNICODE_DIR}" != "x"; then
+ LIBEDIT_IS_UNICODE_INCLUDE="-I${LIBEDIT_IS_UNICODE_DIR}/include"
+ fi
+ CPPFLAGS="${CPPFLAGS} ${LIBEDIT_IS_UNICODE_INCLUDE}"
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+ #include <histedit.h>
+int
+main ()
+{
+ el_rfunc_t *callback;;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ PBX_LIBEDIT_IS_UNICODE=1
+
+$as_echo "#define HAVE_LIBEDIT_IS_UNICODE 1" >>confdefs.h
+
+
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="${saved_cppflags}"
+ fi
+
fi
fi
diff --git a/configure.ac b/configure.ac
index ea55df4..7261e53 100644
--- a/configure.ac
+++ b/configure.ac
@@ -479,6 +479,7 @@
AST_EXT_LIB_SETUP([LDAP], [OpenLDAP], [ldap])
AST_LIBCURL_CHECK_CONFIG([], [7.10.1])
AST_EXT_LIB_SETUP([LIBEDIT], [NetBSD Editline library], [libedit], [, use 'internal' Editline otherwise])
+AST_EXT_LIB_SETUP_OPTIONAL([LIBEDIT_IS_UNICODE], [Libedit compiled for unicode], [LIBEDIT], [libedit])
AST_EXT_LIB_SETUP([LIBXML2], [LibXML2], [libxml2])
AST_EXT_LIB_SETUP([LIBXSLT], [LibXSLT], [libxslt])
AST_EXT_LIB_SETUP_OPTIONAL([LIBXSLT_CLEANUP], [LibXSLT Library Cleanup Function], [LIBXSLT], [libxslt])
@@ -1530,11 +1531,14 @@
if test "${LIBEDIT_SYSTEM}" = "yes"; then
AST_PKG_CONFIG_CHECK(LIBEDIT, libedit)
if test "$PBX_LIBEDIT" = "1"; then
- LIBEDIT_INTERNAL="no"
+ LIBEDIT_INTERNAL="no"
fi
fi
if test "${LIBEDIT_INTERNAL}" = "yes"; then
PBX_LIBEDIT=1
+ LIBEDIT_IS_UNICODE=no
+ else
+ AST_C_COMPILE_CHECK([LIBEDIT_IS_UNICODE], [el_rfunc_t *callback;], [histedit.h], [], [Testing for libedit unicode support])
fi
fi
diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in
index 706798c..3673c8b 100644
--- a/include/asterisk/autoconfig.h.in
+++ b/include/asterisk/autoconfig.h.in
@@ -402,6 +402,9 @@
/* Define if your system has the LIBEDIT libraries. */
#undef HAVE_LIBEDIT
+/* Define if your system has the LIBEDIT_IS_UNICODE headers. */
+#undef HAVE_LIBEDIT_IS_UNICODE
+
/* Define to 1 if you have the <libintl.h> header file. */
#undef HAVE_LIBINTL_H
diff --git a/main/asterisk.c b/main/asterisk.c
index be6c7cc..4a6567f 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -2691,7 +2691,11 @@
}
}
+#ifdef HAVE_LIBEDIT_IS_UNICODE
+static int ast_el_read_char(EditLine *editline, wchar_t *cp)
+#else
static int ast_el_read_char(EditLine *editline, char *cp)
+#endif
{
int num_read = 0;
int lastpos = 0;
@@ -2721,10 +2725,16 @@
}
if (!ast_opt_exec && fds[1].revents) {
- num_read = read(STDIN_FILENO, cp, 1);
+ char c = '\0';
+ num_read = read(STDIN_FILENO, &c, 1);
if (num_read < 1) {
break;
} else {
+#ifdef HAVE_LIBEDIT_IS_UNICODE
+ *cp = btowc(c);
+#else
+ *cp = c;
+#endif
return (num_read);
}
}
@@ -2768,7 +2778,11 @@
console_print(buf);
if ((res < EL_BUF_SIZE - 1) && ((buf[res-1] == '\n') || (res >= 2 && buf[res-2] == '\n'))) {
+#ifdef HAVE_LIBEDIT_IS_UNICODE
+ *cp = btowc(CC_REFRESH);
+#else
*cp = CC_REFRESH;
+#endif
return(1);
} else {
lastpos = 1;
@@ -2776,7 +2790,12 @@
}
}
+#ifdef HAVE_LIBEDIT_IS_UNICODE
+ *cp = btowc('\0');
+#else
*cp = '\0';
+#endif
+
return (0);
}
--
To view, visit https://gerrit.asterisk.org/4412
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I9099b46f68e06d0202ff80e53022a2b68b08871a
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: George Joseph <gjoseph at digium.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Mark Michelson <mmichelson at digium.com>
More information about the asterisk-code-review
mailing list