aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure14
-rw-r--r--configure.ac2
-rw-r--r--meson.build21
-rw-r--r--src/include/pg_config.h.in7
-rw-r--r--src/port/snprintf.c29
5 files changed, 49 insertions, 24 deletions
diff --git a/configure b/configure
index 30d949c3c46..3d0e701c745 100755
--- a/configure
+++ b/configure
@@ -15401,7 +15401,7 @@ fi
LIBS_including_readline="$LIBS"
LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
-for ac_func in backtrace_symbols copyfile copy_file_range elf_aux_info getauxval getifaddrs getpeerucred inet_pton kqueue localeconv_l mbstowcs_l memset_s posix_fallocate ppoll pthread_is_threaded_np setproctitle setproctitle_fast strchrnul strsignal syncfs sync_file_range uselocale wcstombs_l
+for ac_func in backtrace_symbols copyfile copy_file_range elf_aux_info getauxval getifaddrs getpeerucred inet_pton kqueue localeconv_l mbstowcs_l memset_s posix_fallocate ppoll pthread_is_threaded_np setproctitle setproctitle_fast strsignal syncfs sync_file_range uselocale wcstombs_l
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -15955,6 +15955,18 @@ cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_PWRITEV $ac_have_decl
_ACEOF
+ac_fn_c_check_decl "$LINENO" "strchrnul" "ac_cv_have_decl_strchrnul" "#include <string.h>
+"
+if test "x$ac_cv_have_decl_strchrnul" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRCHRNUL $ac_have_decl
+_ACEOF
+
# This is probably only present on macOS, but may as well check always
ac_fn_c_check_decl "$LINENO" "F_FULLFSYNC" "ac_cv_have_decl_F_FULLFSYNC" "#include <fcntl.h>
diff --git a/configure.ac b/configure.ac
index 25cdfcf65af..47a287926bc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1772,7 +1772,6 @@ AC_CHECK_FUNCS(m4_normalize([
pthread_is_threaded_np
setproctitle
setproctitle_fast
- strchrnul
strsignal
syncfs
sync_file_range
@@ -1812,6 +1811,7 @@ AC_CHECK_DECLS([strlcat, strlcpy, strnlen, strsep])
# won't handle deployment target restrictions on macOS
AC_CHECK_DECLS([preadv], [], [], [#include <sys/uio.h>])
AC_CHECK_DECLS([pwritev], [], [], [#include <sys/uio.h>])
+AC_CHECK_DECLS([strchrnul], [], [], [#include <string.h>])
# This is probably only present on macOS, but may as well check always
AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>])
diff --git a/meson.build b/meson.build
index b8da4966297..ba7916d1493 100644
--- a/meson.build
+++ b/meson.build
@@ -2577,6 +2577,7 @@ decl_checks = [
decl_checks += [
['preadv', 'sys/uio.h'],
['pwritev', 'sys/uio.h'],
+ ['strchrnul', 'string.h'],
]
# Check presence of some optional LLVM functions.
@@ -2593,8 +2594,23 @@ foreach c : decl_checks
args = c.get(2, {})
varname = 'HAVE_DECL_' + func.underscorify().to_upper()
- found = cc.has_header_symbol(header, func,
- args: test_c_args, include_directories: postgres_inc,
+ found = cc.compiles('''
+#include <@0@>
+
+int main()
+{
+#ifndef @1@
+ (void) @1@;
+#endif
+
+return 0;
+}
+'''.format(header, func),
+ name: 'test whether @0@ is declared'.format(func),
+ # need to add cflags_warn to get at least
+ # -Werror=unguarded-availability-new if applicable
+ args: test_c_args + cflags_warn,
+ include_directories: postgres_inc,
kwargs: args)
cdata.set10(varname, found, description:
'''Define to 1 if you have the declaration of `@0@', and to 0 if you
@@ -2802,7 +2818,6 @@ func_checks = [
['shm_unlink', {'dependencies': [rt_dep], 'define': false}],
['shmget', {'dependencies': [cygipc_dep], 'define': false}],
['socket', {'dependencies': [socket_dep], 'define': false}],
- ['strchrnul'],
['strerror_r', {'dependencies': [thread_dep]}],
['strlcat'],
['strlcpy'],
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 92f0616c400..2ac61575883 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -103,6 +103,10 @@
don't. */
#undef HAVE_DECL_PWRITEV
+/* Define to 1 if you have the declaration of `strchrnul', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRCHRNUL
+
/* Define to 1 if you have the declaration of `strlcat', and to 0 if you
don't. */
#undef HAVE_DECL_STRLCAT
@@ -373,9 +377,6 @@
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
-/* Define to 1 if you have the `strchrnul' function. */
-#undef HAVE_STRCHRNUL
-
/* Define to 1 if you have the `strerror_r' function. */
#undef HAVE_STRERROR_R
diff --git a/src/port/snprintf.c b/src/port/snprintf.c
index f8f2018ea0c..d7f18b42d19 100644
--- a/src/port/snprintf.c
+++ b/src/port/snprintf.c
@@ -338,13 +338,22 @@ static void leading_pad(int zpad, int signvalue, int *padlen,
static void trailing_pad(int padlen, PrintfTarget *target);
/*
- * If strchrnul exists (it's a glibc-ism), it's a good bit faster than the
- * equivalent manual loop. If it doesn't exist, provide a replacement.
+ * If strchrnul exists (it's a glibc-ism, but since adopted by some other
+ * platforms), it's a good bit faster than the equivalent manual loop.
+ * Use it if possible, and if it doesn't exist, use this replacement.
*
* Note: glibc declares this as returning "char *", but that would require
* casting away const internally, so we don't follow that detail.
+ *
+ * Note: macOS has this too as of Sequoia 15.4, but it's hidden behind
+ * a deployment-target check that causes compile errors if the deployment
+ * target isn't high enough. So !HAVE_DECL_STRCHRNUL may mean "yes it's
+ * declared, but it doesn't compile". To avoid failing in that scenario,
+ * use a macro to avoid matching <string.h>'s name.
*/
-#ifndef HAVE_STRCHRNUL
+#if !HAVE_DECL_STRCHRNUL
+
+#define strchrnul pg_strchrnul
static inline const char *
strchrnul(const char *s, int c)
@@ -354,19 +363,7 @@ strchrnul(const char *s, int c)
return s;
}
-#else
-
-/*
- * glibc's <string.h> declares strchrnul only if _GNU_SOURCE is defined.
- * While we typically use that on glibc platforms, configure will set
- * HAVE_STRCHRNUL whether it's used or not. Fill in the missing declaration
- * so that this file will compile cleanly with or without _GNU_SOURCE.
- */
-#ifndef _GNU_SOURCE
-extern char *strchrnul(const char *s, int c);
-#endif
-
-#endif /* HAVE_STRCHRNUL */
+#endif /* !HAVE_DECL_STRCHRNUL */
/*