]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
cli: Fix ast_el_read_char to work with libedit >= 3.1 11/4411/1
authorGeorge Joseph <gjoseph@digium.com>
Mon, 14 Nov 2016 18:16:03 +0000 (11:16 -0700)
committerGeorge Joseph <gjoseph@digium.com>
Mon, 14 Nov 2016 18:20:26 +0000 (13:20 -0500)
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

configure
configure.ac
include/asterisk/autoconfig.h.in
main/asterisk.c

index 0446c4571884e578b46dcfd1c40f022c8f84afc3..0214a0b04d1d0d73f7961e3b6d9502a30f27a836 100755 (executable)
--- a/configure
+++ b/configure
@@ -1031,6 +1031,10 @@ PBX_LIBXML2
 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
 
 
 
+LIBEDIT_IS_UNICODE_DESCRIP="Libedit compiled for unicode"
+LIBEDIT_IS_UNICODE_OPTION=libedit
+LIBEDIT_IS_UNICODE_DIR=${LIBEDIT_DIR}
+
+PBX_LIBEDIT_IS_UNICODE=0
+
+
+
+
+
+
+
     LIBXML2_DESCRIP="LibXML2"
     LIBXML2_OPTION="libxml2"
     PBX_LIBXML2=0
    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
 
index e4a20cfa5a0b5baa0787ab3959a8c6586fd9e356..550e68baa5bd5c529c28a46c45289a2e32de9190 100644 (file)
@@ -479,6 +479,7 @@ AST_EXT_LIB_SETUP([KQUEUE], [kqueue support], [kqueue])
 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])
@@ -1519,11 +1520,14 @@ if test "${USE_LIBEDIT}" != "no"; then
    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
 
index 55189e2aba970a433835ae0b18ea67a763d4a9c4..53ac21748736253a9fbb029d5af41c02d5a484ab 100644 (file)
 /* 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
 
index 1c7a0e1885501e5e2446c72266e492ffd40a08ef..fa919936b4767580ff852f2ba1fcbe7781949968 100644 (file)
@@ -2834,7 +2834,11 @@ static void send_rasterisk_connect_commands(void)
        }
 }
 
+#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;
@@ -2864,10 +2868,16 @@ static int ast_el_read_char(EditLine *editline, char *cp)
                }
 
                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);
                        }
                }
@@ -2911,7 +2921,11 @@ static int ast_el_read_char(EditLine *editline, char *cp)
                        console_print(buf, 0);
 
                        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;
@@ -2919,7 +2933,12 @@ static int ast_el_read_char(EditLine *editline, char *cp)
                }
        }
 
+#ifdef         HAVE_LIBEDIT_IS_UNICODE
+       *cp = btowc('\0');
+#else
        *cp = '\0';
+#endif
+
        return (0);
 }