]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
Add compat code for missing wcwidth.
authorDarren Tucker <dtucker@zip.com.au>
Thu, 14 Jul 2016 00:59:09 +0000 (10:59 +1000)
committerDarren Tucker <dtucker@zip.com.au>
Thu, 14 Jul 2016 00:59:09 +0000 (10:59 +1000)
If we don't have wcwidth force fallback implementations of nl_langinfo
and mbtowc.  Based on advice from Ingo Schwarze.

configure.ac
openbsd-compat/bsd-misc.c
openbsd-compat/openbsd-compat.h

index 005a9ead58b70da176c3e4c41da6c571396172e4..f6c44b87473776b01711708772eb867906299003 100644 (file)
@@ -1721,7 +1721,6 @@ AC_CHECK_FUNCS([ \
        inet_ntop \
        innetgr \
        login_getcapbool \
-       mblen \
        md5_crypt \
        memmove \
        memset_s \
@@ -1789,6 +1788,12 @@ AC_CHECK_FUNCS([ \
        warn \
 ])
 
+dnl Wide character support.  Linux man page says it needs _XOPEN_SOURCE.
+saved_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -D_XOPEN_SOURCE"
+AC_CHECK_FUNCS([mblen mbtowc nl_langinfo wcwidth])
+CFLAGS="$saved_CFLAGS"
+
 AC_LINK_IFELSE(
         [AC_LANG_PROGRAM(
            [[ #include <ctype.h> ]],
index 2a788e47f7dd546c4862478cf3652bcb50e849dd..18bf62dd8183463ef711244a3203fa630906937e 100644 (file)
@@ -284,3 +284,20 @@ pledge(const char *promises, const char *paths[])
        return 0;
 }
 #endif
+
+#ifndef HAVE_MBTOWC
+/* a mbtowc that only supports ASCII */
+int
+mbtowc(wchar_t *pwc, const char *s, size_t n)
+{
+       if (s == NULL || *s == '\0')
+               return 0;       /* ASCII is not state-dependent */
+       if (*s < 0 || *s > 0x7f || n < 1) {
+               errno = EOPNOTSUPP;
+               return -1;
+       }
+       if (pwc != NULL)
+               *pwc = *s;
+       return 1;
+}
+#endif
index 8cc8a11b7617c379380b2fe087163999f9cc9472..997541e437440462b19dc3a362bc9a6c9635bcaa 100644 (file)
@@ -36,6 +36,8 @@
 
 #include <sys/socket.h>
 
+#include <stddef.h>  /* for wchar_t */
+
 /* OpenBSD function replacements */
 #include "base64.h"
 #include "sigact.h"
@@ -231,6 +233,22 @@ long long strtonum(const char *, long long, long long, const char **);
 # define mblen(x, y)   (1)
 #endif
 
+#ifndef HAVE_WCWIDTH
+# define wcwidth(x)    (((x) >= 0x20 && (x) <= 0x7e) ? 1 : -1)
+/* force our no-op nl_langinfo and mbtowc */
+# undef HAVE_NL_LANGINFO
+# undef HAVE_MBTOWC
+# undef HAVE_LANGINFO_H
+#endif
+
+#ifndef HAVE_NL_LANGINFO
+# define nl_langinfo(x)        ""
+#endif
+
+#ifndef HAVE_MBTOWC
+int mbtowc(wchar_t *, const char*, size_t);
+#endif
+
 #if !defined(HAVE_VASPRINTF) || !defined(HAVE_VSNPRINTF)
 # include <stdarg.h>
 #endif