From: Tom Lane Date: Tue, 15 Mar 2016 17:19:57 +0000 (-0400) Subject: Cope if platform declares mbstowcs_l(), but not locale_t, in . X-Git-Tag: REL9_6_BETA1~487 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e9b89986b7ced6daffdf14638a25a35c45423ff;p=postgresql Cope if platform declares mbstowcs_l(), but not locale_t, in . Previously, we included only if necessary to get the definition of type locale_t. According to notes in PGAC_TYPE_LOCALE_T, this is important because on some versions of glibc that file supplies an incompatible declaration of locale_t. (This info may be obsolete, because on my RHEL6 box that seems to be the *only* definition of locale_t; but there may still be glibc's in the wild for which it's a live concern.) It turns out though that on FreeBSD and maybe other BSDen, you can get locale_t from stdlib.h or locale.h but mbstowcs_l() and friends only from . This was leaving us compiling calls to mbstowcs_l() and friends with no visible prototype, which causes a warning and could possibly cause actual trouble, since it's not declared to return int. Hence, adjust the configure checks so that we'll include either if it's necessary to get type locale_t or if it's necessary to get a declaration of mbstowcs_l(). Report and patch by Aleksander Alekseev, somewhat whacked around by me. Back-patch to all supported branches, since we have been using mbstowcs_l() since 9.1. --- diff --git a/config/c-library.m4 b/config/c-library.m4 index 1d28c454ba..50d068d3fb 100644 --- a/config/c-library.m4 +++ b/config/c-library.m4 @@ -316,4 +316,34 @@ fi if test "$pgac_cv_type_locale_t" = 'yes (in xlocale.h)'; then AC_DEFINE(LOCALE_T_IN_XLOCALE, 1, [Define to 1 if `locale_t' requires .]) -fi])])# PGAC_HEADER_XLOCALE +fi])# PGAC_TYPE_LOCALE_T + + +# PGAC_FUNC_WCSTOMBS_L +# -------------------- +# Try to find a declaration for wcstombs_l(). It might be in stdlib.h +# (following the POSIX requirement for wcstombs()), or in locale.h, or in +# xlocale.h. If it's in the latter, define WCSTOMBS_L_IN_XLOCALE. +# +AC_DEFUN([PGAC_FUNC_WCSTOMBS_L], +[AC_CACHE_CHECK([for wcstombs_l declaration], pgac_cv_func_wcstombs_l, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM( +[#include +#include ], +[#ifndef wcstombs_l +(void) wcstombs_l; +#endif])], +[pgac_cv_func_wcstombs_l='yes'], +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM( +[#include +#include +#include ], +[#ifndef wcstombs_l +(void) wcstombs_l; +#endif])], +[pgac_cv_func_wcstombs_l='yes (in xlocale.h)'], +[pgac_cv_func_wcstombs_l='no'])])]) +if test "$pgac_cv_func_wcstombs_l" = 'yes (in xlocale.h)'; then + AC_DEFINE(WCSTOMBS_L_IN_XLOCALE, 1, + [Define to 1 if `wcstombs_l' requires .]) +fi])# PGAC_FUNC_WCSTOMBS_L diff --git a/configure b/configure index 08cff2357e..a45be67d50 100755 --- a/configure +++ b/configure @@ -12364,6 +12364,59 @@ $as_echo "#define GETTIMEOFDAY_1ARG 1" >>confdefs.h fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for wcstombs_l declaration" >&5 +$as_echo_n "checking for wcstombs_l declaration... " >&6; } +if ${pgac_cv_func_wcstombs_l+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +#ifndef wcstombs_l +(void) wcstombs_l; +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + pgac_cv_func_wcstombs_l='yes' +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +int +main () +{ +#ifndef wcstombs_l +(void) wcstombs_l; +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + pgac_cv_func_wcstombs_l='yes (in xlocale.h)' +else + pgac_cv_func_wcstombs_l='no' +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_func_wcstombs_l" >&5 +$as_echo "$pgac_cv_func_wcstombs_l" >&6; } +if test "$pgac_cv_func_wcstombs_l" = 'yes (in xlocale.h)'; then + +$as_echo "#define WCSTOMBS_L_IN_XLOCALE 1" >>confdefs.h + +fi # Some versions of libedit contain strlcpy(), setproctitle(), and other # symbols that that library has no business exposing to the world. Pending diff --git a/configure.in b/configure.in index 0b7dd97506..c298926b66 100644 --- a/configure.in +++ b/configure.in @@ -1423,6 +1423,7 @@ fi PGAC_VAR_INT_TIMEZONE AC_FUNC_ACCEPT_ARGTYPES PGAC_FUNC_GETTIMEOFDAY_1ARG +PGAC_FUNC_WCSTOMBS_L # Some versions of libedit contain strlcpy(), setproctitle(), and other # symbols that that library has no business exposing to the world. Pending diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index b3ceea5edc..3813226929 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -851,6 +851,9 @@ /* Define to select Win32-style shared memory. */ #undef USE_WIN32_SHARED_MEMORY +/* Define to 1 if `wcstombs_l' requires . */ +#undef WCSTOMBS_L_IN_XLOCALE + /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32 index 8566065bc7..eba36df92e 100644 --- a/src/include/pg_config.h.win32 +++ b/src/include/pg_config.h.win32 @@ -657,6 +657,9 @@ /* Define to select Win32-style semaphores. */ #define USE_WIN32_SEMAPHORES 1 +/* Define to 1 if `wcstombs_l' requires . */ +/* #undef WCSTOMBS_L_IN_XLOCALE */ + /* Number of bits in a file offset, on hosts where this is settable. */ /* #undef _FILE_OFFSET_BITS */ diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h index 2e6dba1b5e..0a4b9f7bd2 100644 --- a/src/include/utils/pg_locale.h +++ b/src/include/utils/pg_locale.h @@ -13,7 +13,7 @@ #define _PG_LOCALE_ #include -#ifdef LOCALE_T_IN_XLOCALE +#if defined(LOCALE_T_IN_XLOCALE) || defined(WCSTOMBS_L_IN_XLOCALE) #include #endif