From: Paul Eggert Date: Tue, 4 Jun 2024 04:57:53 +0000 (-0700) Subject: Update from Gnulib by running admin/merge-gnulib X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=468120048f35329257ebe33365eaf6a692fefc92;p=emacs.git Update from Gnulib by running admin/merge-gnulib * lib/endian.c, lib/endian.in.h, m4/endian_h.m4, m4/sys_cdefs_h.m4: New files, copied from Gnulib. (cherry picked from commit 799f78a92c6c31f4d181390523b83d036020ede1) --- diff --git a/lib/acl-internal.c b/lib/acl-internal.c index 68aead8de65..9ebb6e544b0 100644 --- a/lib/acl-internal.c +++ b/lib/acl-internal.c @@ -23,6 +23,12 @@ #include "acl-internal.h" +#if defined __CYGWIN__ +# include +# include +# include +#endif + #if USE_ACL && HAVE_ACL_GET_FILE /* Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */ # if HAVE_ACL_TYPE_EXTENDED /* Mac OS X */ @@ -63,8 +69,58 @@ acl_access_nontrivial (acl_t acl) acl_tag_t tag; if (acl_get_tag_type (ace, &tag) < 0) return -1; - if (!(tag == ACL_USER_OBJ || tag == ACL_GROUP_OBJ || tag == ACL_OTHER)) - return 1; + switch (tag) + { + case ACL_USER_OBJ: + case ACL_GROUP_OBJ: + case ACL_OTHER: + break; +# ifdef __CYGWIN__ + /* On Cygwin, a trivial ACL inside the Cygwin file system consists of + e.g. + user::rwx + group::r-x + other::r-x + but a trivial ACL outside the Cygwin file system has more entries: + e.g. + user::rwx + group::r-x + group:SYSTEM:rwx + group:Administrators:rwx + mask::r-x + other::r-x + */ + case ACL_GROUP: + { + int ignorable = 0; + void *qualifier = acl_get_qualifier (ace); + if (qualifier != NULL) + { + gid_t group_id = *(gid_t const *) qualifier; + acl_free (qualifier); + struct group *group_details = getgrgid (group_id); + if (group_details != NULL) + { + const char *group_sid = group_details->gr_passwd; + /* Ignore the ace if the group_sid is one of + - S-1-5-18 (group "SYSTEM") + - S-1-5-32-544 (group "Administrators") + Cf. */ + ignorable = (strcmp (group_sid, "S-1-5-18") == 0 + || strcmp (group_sid, "S-1-5-32-544") == 0); + } + } + if (!ignorable) + return 1; + } + break; + case ACL_MASK: + /* XXX Is it OK to ignore acl_get_permset (ace, ...) ? */ + break; +# endif + default: + return 1; + } } return got_one; diff --git a/lib/attribute.h b/lib/attribute.h index 710341ba417..604965a6d18 100644 --- a/lib/attribute.h +++ b/lib/attribute.h @@ -49,8 +49,9 @@ _GL_ATTRIBUTE_MALLOC, _GL_ATTRIBUTE_MAY_ALIAS, _GL_ATTRIBUTE_MAYBE_UNUSED, _GL_ATTRIBUTE_NODISCARD, _GL_ATTRIBUTE_NOINLINE, _GL_ATTRIBUTE_NONNULL, _GL_ATTRIBUTE_NONSTRING, _GL_ATTRIBUTE_NOTHROW, _GL_ATTRIBUTE_PACKED, - _GL_ATTRIBUTE_PURE, _GL_ATTRIBUTE_RETURNS_NONNULL, - _GL_ATTRIBUTE_SENTINEL. */ + _GL_ATTRIBUTE_PURE, _GL_ATTRIBUTE_REPRODUCIBLE, + _GL_ATTRIBUTE_RETURNS_NONNULL, _GL_ATTRIBUTE_SENTINEL, + _GL_ATTRIBUTE_UNSEQUENCED. */ #if !_GL_CONFIG_H_INCLUDED #error "Please include config.h first." #endif @@ -88,7 +89,7 @@ is the size of the returned memory block. ATTRIBUTE_ALLOC_SIZE ((M, N)) - Multiply the Mth and Nth arguments to determine the size of the returned memory block. */ -/* Applies to: function, pointer to function, function types. */ +/* Applies to: functions, pointer to functions, function types. */ #define ATTRIBUTE_ALLOC_SIZE(args) _GL_ATTRIBUTE_ALLOC_SIZE (args) /* ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers @@ -170,7 +171,7 @@ /* Attributes regarding debugging information emitted by the compiler. */ /* Omit the function from stack traces when debugging. */ -/* Applies to: function. */ +/* Applies to: functions. */ #define ATTRIBUTE_ARTIFICIAL _GL_ATTRIBUTE_ARTIFICIAL /* Make the entity visible to debuggers etc., even with '-fwhole-program'. */ @@ -192,25 +193,64 @@ /* Always inline the function, and report an error if the compiler cannot inline. */ -/* Applies to: function. */ +/* Applies to: functions. */ #define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE -/* It is OK for a compiler to omit duplicate calls with the same arguments. +/* It is OK for a compiler to move calls to the function and to omit + calls to the function if another call has the same arguments or the + result is not used. This attribute is safe for a function that neither depends on - nor affects observable state, and always returns exactly once - - e.g., does not loop forever, and does not call longjmp. - (This attribute is stricter than ATTRIBUTE_PURE.) */ + nor affects state, and always returns exactly once - + e.g., does not raise an exception, call longjmp, or loop forever. + (This attribute is stricter than ATTRIBUTE_PURE because the + function cannot observe state. It is stricter than UNSEQUENCED + because the function must return exactly once and cannot depend on + state addressed by its arguments.) */ /* Applies to: functions. */ #define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST -/* It is OK for a compiler to omit duplicate calls with the same - arguments if observable state is not changed between calls. - This attribute is safe for a function that does not affect - observable state, and always returns exactly once. - (This attribute is looser than ATTRIBUTE_CONST.) */ +/* It is OK for a compiler to move calls to the function and to omit duplicate + calls to the function with the same arguments, so long as the state + addressed by its arguments is the same. + This attribute is safe for a function that is effectless, idempotent, + stateless, and independent; see ISO C 23 § 6.7.12.7 for a definition of + these terms. + (This attribute is stricter than REPRODUCIBLE because the function + must be stateless and independent. It is looser than ATTRIBUTE_CONST + because the function need not return exactly once and can depend + on state addressed by its arguments.) + See also and + . */ +/* Applies to: functions, pointer to functions, function type. */ +#define UNSEQUENCED _GL_ATTRIBUTE_UNSEQUENCED + +/* It is OK for a compiler to move calls to the function and to omit + calls to the function if another call has the same arguments or the + result is not used, and if observable state is the same. + This attribute is safe for a function that does not affect observable state + and always returns exactly once. + (This attribute is looser than ATTRIBUTE_CONST because the function + can depend on observable state. It is stricter than REPRODUCIBLE + because the function must return exactly once and cannot affect + state addressed by its arguments.) */ /* Applies to: functions. */ #define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE +/* It is OK for a compiler to move calls to the function and to omit duplicate + calls to the function with the same arguments, so long as the state + addressed by its arguments is the same and is updated in time for + the rest of the program. + This attribute is safe for a function that is effectless and idempotent; see + ISO C 23 § 6.7.12.7 for a definition of these terms. + (This attribute is looser than UNSEQUENCED because the function need + not be stateless and idempotent. It is looser than ATTRIBUTE_PURE + because the function need not return exactly once and can affect + state addressed by its arguments.) + See also and + . */ +/* Applies to: functions, pointer to functions, function type. */ +#define REPRODUCIBLE _GL_ATTRIBUTE_REPRODUCIBLE + /* The function is rarely executed. */ /* Applies to: functions. */ #define ATTRIBUTE_COLD _GL_ATTRIBUTE_COLD diff --git a/lib/boot-time-aux.h b/lib/boot-time-aux.h index 7f8c5405e4c..8b98c4e5734 100644 --- a/lib/boot-time-aux.h +++ b/lib/boot-time-aux.h @@ -108,8 +108,16 @@ get_linux_boot_time_fallback (struct timespec *p_boot_time) struct stat statbuf; if (stat (filename, &statbuf) >= 0) { - *p_boot_time = get_stat_mtime (&statbuf); - return 0; + struct timespec boot_time = get_stat_mtime (&statbuf); + /* On Alpine 3.20.0_rc2 /var/run/utmp was observed with bogus + timestamps of ~10 s. Reject timestamps before + 2005-07-25 23:34:15 UTC (1122334455), as neither Alpine + nor Devuan existed then. */ + if (boot_time.tv_sec >= 1122334455) + { + *p_boot_time = boot_time; + return 0; + } } } return -1; @@ -337,4 +345,78 @@ get_windows_boot_time (struct timespec *p_boot_time) return -1; } +# ifndef __CYGWIN__ +# if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA) + +/* Don't assume that UNICODE is not defined. */ +# undef LoadLibrary +# define LoadLibrary LoadLibraryA + +/* Avoid warnings from gcc -Wcast-function-type. */ +# define GetProcAddress \ + (void *) GetProcAddress + +/* GetTickCount64 is only available on Windows Vista and later. */ +typedef ULONGLONG (WINAPI * GetTickCount64FuncType) (void); + +static GetTickCount64FuncType GetTickCount64Func = NULL; +static BOOL initialized = FALSE; + +static void +initialize (void) +{ + HMODULE kernel32 = LoadLibrary ("kernel32.dll"); + if (kernel32 != NULL) + { + GetTickCount64Func = + (GetTickCount64FuncType) GetProcAddress (kernel32, "GetTickCount64"); + } + initialized = TRUE; +} + +# else + +# define GetTickCount64Func GetTickCount64 + +# endif + +/* Fallback for Windows in the form: + boot time = current time - uptime + This uses the GetTickCount64 function which is only available on Windows + Vista and later. See: + . */ +static int +get_windows_boot_time_fallback (struct timespec *p_boot_time) +{ +# if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA) + if (! initialized) + initialize (); +# endif + if (GetTickCount64Func != NULL) + { + ULONGLONG uptime_ms = GetTickCount64Func (); + struct timespec uptime; + struct timespec result; + struct timeval tv; + if (gettimeofday (&tv, NULL) >= 0) + { + uptime.tv_sec = uptime_ms / 1000; + uptime.tv_nsec = (uptime_ms % 1000) * 1000000; + result.tv_sec = tv.tv_sec; + result.tv_nsec = tv.tv_usec * 1000; + if (result.tv_nsec < uptime.tv_nsec) + { + result.tv_nsec += 1000000000; + result.tv_sec -= 1; + } + result.tv_sec -= uptime.tv_sec; + result.tv_nsec -= uptime.tv_nsec; + *p_boot_time = result; + return 0; + } + } + return -1; +} + +# endif #endif diff --git a/lib/boot-time.c b/lib/boot-time.c index c1171e8024d..71562dcf751 100644 --- a/lib/boot-time.c +++ b/lib/boot-time.c @@ -43,6 +43,13 @@ # include #endif +#if defined _WIN32 && ! defined __CYGWIN__ +# define WIN32_LEAN_AND_MEAN +# include +# include +# include +#endif + #include "idx.h" #include "readutmp.h" #include "stat-time.h" @@ -247,6 +254,10 @@ get_boot_time_uncached (struct timespec *p_boot_time) { /* Workaround for Windows: */ get_windows_boot_time (&found_boot_time); +# ifndef __CYGWIN__ + if (found_boot_time.tv_sec == 0) + get_windows_boot_time_fallback (&found_boot_time); +# endif } # endif diff --git a/lib/endian.c b/lib/endian.c new file mode 100644 index 00000000000..3e7e56f523d --- /dev/null +++ b/lib/endian.c @@ -0,0 +1,23 @@ +/* Inline functions for . + + Copyright 2024 Free Software Foundation, Inc. + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +/* Written by Collin Funk. */ + +#include + +#define _GL_ENDIAN_INLINE _GL_EXTERN_INLINE +#include diff --git a/lib/endian.in.h b/lib/endian.in.h new file mode 100644 index 00000000000..bd65ae8aaba --- /dev/null +++ b/lib/endian.in.h @@ -0,0 +1,236 @@ +/* endian.h - Byte order macros + + Copyright 2024 Free Software Foundation, Inc. + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +/* Written by Collin Funk. */ + +#ifndef _@GUARD_PREFIX@_ENDIAN_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if @HAVE_ENDIAN_H@ + +/* The include_next requires a split double-inclusion guard. */ +# @INCLUDE_NEXT@ @NEXT_ENDIAN_H@ + +#endif + + +/* glibc defines all macros and functions but is missing types from + stdint.h. */ +#if @ENDIAN_H_JUST_MISSING_STDINT@ +# include +#else + +/* Others platforms. */ +#ifndef _@GUARD_PREFIX@_ENDIAN_H +#define _@GUARD_PREFIX@_ENDIAN_H 1 + +/* This file uses _GL_INLINE, WORDS_BIGENDIAN. */ +#if !_GL_CONFIG_H_INCLUDED + #error "Please include config.h first." +#endif + +/* Define uint16_t and uint32_t. + Define uint64_t if it is available. */ +#include + +/* Byteswap functions. */ +#include + +_GL_INLINE_HEADER_BEGIN +#ifndef _GL_ENDIAN_INLINE +# define _GL_ENDIAN_INLINE _GL_INLINE +#endif + +#define LITTLE_ENDIAN 1234 +#define BIG_ENDIAN 4321 +#define PDP_ENDIAN 3412 + +#ifdef WORDS_BIGENDIAN +# define BYTE_ORDER BIG_ENDIAN +#else +# define BYTE_ORDER LITTLE_ENDIAN +#endif + +/* Make sure function-like macros get undefined. */ +#if @HAVE_ENDIAN_H@ +# undef be16toh +# undef be32toh +# undef be64toh +# undef htobe16 +# undef htobe32 +# undef htobe64 +# undef le16toh +# undef le32toh +# undef le64toh +# undef htole16 +# undef htole32 +# undef htole64 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Big endian to host. */ + +_GL_ENDIAN_INLINE uint16_t +be16toh (uint16_t x) +{ +#if BYTE_ORDER == BIG_ENDIAN + return x; +#else + return bswap_16 (x); +#endif +} + +_GL_ENDIAN_INLINE uint32_t +be32toh (uint32_t x) +{ +#if BYTE_ORDER == BIG_ENDIAN + return x; +#else + return bswap_32 (x); +#endif +} + +#ifdef UINT64_MAX +_GL_ENDIAN_INLINE uint64_t +be64toh (uint64_t x) +{ +# if BYTE_ORDER == BIG_ENDIAN + return x; +# else + return bswap_64 (x); +# endif +} +#endif + +/* Host to big endian. */ + +_GL_ENDIAN_INLINE uint16_t +htobe16 (uint16_t x) +{ +#if BYTE_ORDER == BIG_ENDIAN + return x; +#else + return bswap_16 (x); +#endif +} + +_GL_ENDIAN_INLINE uint32_t +htobe32 (uint32_t x) +{ +#if BYTE_ORDER == BIG_ENDIAN + return x; +#else + return bswap_32 (x); +#endif +} + +#ifdef UINT64_MAX +_GL_ENDIAN_INLINE uint64_t +htobe64 (uint64_t x) +{ +# if BYTE_ORDER == BIG_ENDIAN + return x; +# else + return bswap_64 (x); +# endif +} +#endif + +/* Little endian to host. */ + +_GL_ENDIAN_INLINE uint16_t +le16toh (uint16_t x) +{ +#if BYTE_ORDER == BIG_ENDIAN + return bswap_16 (x); +#else + return x; +#endif +} + +_GL_ENDIAN_INLINE uint32_t +le32toh (uint32_t x) +{ +#if BYTE_ORDER == BIG_ENDIAN + return bswap_32 (x); +#else + return x; +#endif +} + +#ifdef UINT64_MAX +_GL_ENDIAN_INLINE uint64_t +le64toh (uint64_t x) +{ +# if BYTE_ORDER == BIG_ENDIAN + return bswap_64 (x); +# else + return x; +# endif +} +#endif + +/* Host to little endian. */ + +_GL_ENDIAN_INLINE uint16_t +htole16 (uint16_t x) +{ +#if BYTE_ORDER == BIG_ENDIAN + return bswap_16 (x); +#else + return x; +#endif +} + +_GL_ENDIAN_INLINE uint32_t +htole32 (uint32_t x) +{ +#if BYTE_ORDER == BIG_ENDIAN + return bswap_32 (x); +#else + return x; +#endif +} + +#ifdef UINT64_MAX +_GL_ENDIAN_INLINE uint64_t +htole64 (uint64_t x) +{ +# if BYTE_ORDER == BIG_ENDIAN + return bswap_64 (x); +# else + return x; +# endif +} +#endif + +#ifdef __cplusplus +} +#endif + +_GL_INLINE_HEADER_END + +#endif /* @ENDIAN_H_JUST_MISSING_STDINT@ */ +#endif /* _@GUARD_PREFIX@_ENDIAN_H */ +#endif /* _@GUARD_PREFIX@_ENDIAN_H */ diff --git a/lib/euidaccess.c b/lib/euidaccess.c index ad392dba19c..6229f2c0d06 100644 --- a/lib/euidaccess.c +++ b/lib/euidaccess.c @@ -29,9 +29,7 @@ #include #include #include -#if defined _WIN32 && ! defined __CYGWIN__ -# include -#else +#if !(defined _WIN32 && ! defined __CYGWIN__) # include "root-uid.h" #endif @@ -88,7 +86,7 @@ euidaccess (const char *file, int mode) #elif HAVE_EACCESS /* FreeBSD */ return eaccess (file, mode); #elif defined _WIN32 && ! defined __CYGWIN__ /* mingw */ - return _access (file, mode); + return access (file, mode); #else /* Mac OS X, NetBSD, OpenBSD, HP-UX, Solaris, Cygwin, BeOS */ uid_t uid = getuid (); diff --git a/lib/getopt.c b/lib/getopt.c index f66f119ec50..ea2d1a529c4 100644 --- a/lib/getopt.c +++ b/lib/getopt.c @@ -723,7 +723,7 @@ _getopt_internal (int argc, char **argv, const char *optstring, return result; } -/* glibc gets a LSB-compliant getopt and a POSIX-complaint __posix_getopt. +/* glibc gets a LSB-compliant getopt and a POSIX-compliant __posix_getopt. Standalone applications just get a POSIX-compliant getopt. POSIX and LSB both require these functions to take 'char *const *argv' even though this is incorrect (because of the permutation). */ diff --git a/lib/gnulib.mk.in b/lib/gnulib.mk.in index 358d58d5015..832b245edc2 100644 --- a/lib/gnulib.mk.in +++ b/lib/gnulib.mk.in @@ -264,6 +264,8 @@ EMACSRES = @EMACSRES@ EMACS_MANIFEST = @EMACS_MANIFEST@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ +ENDIAN_H = @ENDIAN_H@ +ENDIAN_H_JUST_MISSING_STDINT = @ENDIAN_H_JUST_MISSING_STDINT@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ @@ -349,6 +351,7 @@ GL_COND_OBJ_UTIMENSAT_CONDITION = @GL_COND_OBJ_UTIMENSAT_CONDITION@ GL_GENERATE_ALLOCA_H_CONDITION = @GL_GENERATE_ALLOCA_H_CONDITION@ GL_GENERATE_ASSERT_H_CONDITION = @GL_GENERATE_ASSERT_H_CONDITION@ GL_GENERATE_BYTESWAP_H_CONDITION = @GL_GENERATE_BYTESWAP_H_CONDITION@ +GL_GENERATE_ENDIAN_H_CONDITION = @GL_GENERATE_ENDIAN_H_CONDITION@ GL_GENERATE_ERRNO_H_CONDITION = @GL_GENERATE_ERRNO_H_CONDITION@ GL_GENERATE_EXECINFO_H_CONDITION = @GL_GENERATE_EXECINFO_H_CONDITION@ GL_GENERATE_GETOPT_CDEFS_H_CONDITION = @GL_GENERATE_GETOPT_CDEFS_H_CONDITION@ @@ -761,6 +764,7 @@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DIRENT_H = @HAVE_DIRENT_H@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP3 = @HAVE_DUP3@ +HAVE_ENDIAN_H = @HAVE_ENDIAN_H@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_EXECVPE = @HAVE_EXECVPE@ HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@ @@ -1044,6 +1048,7 @@ NDK_BUILD_SDK = @NDK_BUILD_SDK@ NEXT_ASSERT_H = @NEXT_ASSERT_H@ NEXT_AS_FIRST_DIRECTIVE_ASSERT_H = @NEXT_AS_FIRST_DIRECTIVE_ASSERT_H@ NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@ +NEXT_AS_FIRST_DIRECTIVE_ENDIAN_H = @NEXT_AS_FIRST_DIRECTIVE_ENDIAN_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ @@ -1063,6 +1068,7 @@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_DIRENT_H = @NEXT_DIRENT_H@ +NEXT_ENDIAN_H = @NEXT_ENDIAN_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ @@ -1189,6 +1195,7 @@ REPLACE_GETPROGNAME = @REPLACE_GETPROGNAME@ REPLACE_GETRANDOM = @REPLACE_GETRANDOM@ REPLACE_GETSUBOPT = @REPLACE_GETSUBOPT@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ +REPLACE_GETUSERSHELL = @REPLACE_GETUSERSHELL@ REPLACE_GMTIME = @REPLACE_GMTIME@ REPLACE_IMAXABS = @REPLACE_IMAXABS@ REPLACE_IMAXDIV = @REPLACE_IMAXDIV@ @@ -1450,6 +1457,7 @@ gl_GNULIB_ENABLED_d3b2383720ee0e541357aa2aac598e2b_CONDITION = @gl_GNULIB_ENABLE gl_GNULIB_ENABLED_dirfd_CONDITION = @gl_GNULIB_ENABLED_dirfd_CONDITION@ gl_GNULIB_ENABLED_e80bf6f757095d2e5fc94dafb8f8fc8b_CONDITION = @gl_GNULIB_ENABLED_e80bf6f757095d2e5fc94dafb8f8fc8b_CONDITION@ gl_GNULIB_ENABLED_ef455225c00f5049c808c2eda3e76866_CONDITION = @gl_GNULIB_ENABLED_ef455225c00f5049c808c2eda3e76866_CONDITION@ +gl_GNULIB_ENABLED_endian_CONDITION = @gl_GNULIB_ENABLED_endian_CONDITION@ gl_GNULIB_ENABLED_euidaccess_CONDITION = @gl_GNULIB_ENABLED_euidaccess_CONDITION@ gl_GNULIB_ENABLED_fd38c7e463b54744b77b98aeafb4fa7c_CONDITION = @gl_GNULIB_ENABLED_fd38c7e463b54744b77b98aeafb4fa7c_CONDITION@ gl_GNULIB_ENABLED_getdelim_CONDITION = @gl_GNULIB_ENABLED_getdelim_CONDITION@ @@ -1900,6 +1908,39 @@ EXTRA_DIST += eloop-threshold.h endif ## end gnulib module eloop-threshold +## begin gnulib module endian +ifeq (,$(OMIT_GNULIB_MODULE_endian)) + +ifneq (,$(gl_GNULIB_ENABLED_endian_CONDITION)) +BUILT_SOURCES += $(ENDIAN_H) + +# We need the following in order to create when the system +# doesn't have one. +ifneq (,$(GL_GENERATE_ENDIAN_H_CONDITION)) +endian.h: endian.in.h $(top_builddir)/config.status + $(gl_V_at)$(SED_HEADER_STDOUT) \ + -e 's|@''GUARD_PREFIX''@|GL|g' \ + -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ + -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ + -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ + -e 's|@''HAVE_ENDIAN_H''@|$(HAVE_ENDIAN_H)|g' \ + -e 's|@''NEXT_ENDIAN_H''@|$(NEXT_ENDIAN_H)|g' \ + -e 's|@''ENDIAN_H_JUST_MISSING_STDINT''@|$(ENDIAN_H_JUST_MISSING_STDINT)|g' \ + $(srcdir)/endian.in.h > $@-t + $(AM_V_at)mv $@-t $@ +libgnu_a_SOURCES += endian.c +else +endian.h: $(top_builddir)/config.status + rm -f $@ +endif +MOSTLYCLEANFILES += endian.h endian.h-t + +endif +EXTRA_DIST += endian.in.h + +endif +## end gnulib module endian + ## begin gnulib module errno ifeq (,$(OMIT_GNULIB_MODULE_errno)) @@ -4254,6 +4295,7 @@ unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \ -e 's|@''REPLACE_GETPASS''@|$(REPLACE_GETPASS)|g' \ -e 's|@''REPLACE_GETPASS_FOR_GETPASS_GNU''@|$(REPLACE_GETPASS_FOR_GETPASS_GNU)|g' \ + -e 's|@''REPLACE_GETUSERSHELL''@|$(REPLACE_GETUSERSHELL)|g' \ -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \ -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \ -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \ diff --git a/lib/ieee754.in.h b/lib/ieee754.in.h index 805048ca9fc..4dd0ff55d29 100644 --- a/lib/ieee754.in.h +++ b/lib/ieee754.in.h @@ -16,37 +16,28 @@ . */ #ifndef _IEEE754_H - #define _IEEE754_H 1 #ifndef _GL_GNULIB_HEADER /* Ordinary glibc usage. */ # include -# include +# include +# define _IEEE754_BYTE_ORDER __BYTE_ORDER +# define _IEEE754_BIG_ENDIAN __BIG_ENDIAN +# define _IEEE754_LITTLE_ENDIAN __LITTLE_ENDIAN +# define _IEEE754_FLOAT_WORD_ORDER __FLOAT_WORD_ORDER #else /* Gnulib usage. */ -# ifndef __BEGIN_DECLS -# ifdef __cplusplus -# define __BEGIN_DECLS extern "C" { -# define __END_DECLS } -# else -# define __BEGIN_DECLS -# define __END_DECLS -# endif -# endif -# ifndef __FLOAT_WORD_ORDER -# define __LITTLE_ENDIAN 1234 -# define __BIG_ENDIAN 4321 -# ifdef WORDS_BIGENDIAN -# define __BYTE_ORDER __BIG_ENDIAN -# else -# define __BYTE_ORDER __LITTLE_ENDIAN -# endif -# define __FLOAT_WORD_ORDER __BYTE_ORDER -# endif +# include +# define _IEEE754_BYTE_ORDER BYTE_ORDER +# define _IEEE754_BIG_ENDIAN BIG_ENDIAN +# define _IEEE754_LITTLE_ENDIAN LITTLE_ENDIAN +# define _IEEE754_FLOAT_WORD_ORDER BYTE_ORDER #endif -__BEGIN_DECLS +#ifdef __cplusplus +extern "C" { +#endif union ieee754_float { @@ -55,12 +46,12 @@ union ieee754_float /* This is the IEEE 754 single-precision format. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:8; unsigned int mantissa:23; #endif /* Big endian. */ -#if __BYTE_ORDER == __LITTLE_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_LITTLE_ENDIAN unsigned int mantissa:23; unsigned int exponent:8; unsigned int negative:1; @@ -70,13 +61,13 @@ union ieee754_float /* This format makes it easier to see if a NaN is a signalling NaN. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:8; unsigned int quiet_nan:1; unsigned int mantissa:22; #endif /* Big endian. */ -#if __BYTE_ORDER == __LITTLE_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_LITTLE_ENDIAN unsigned int mantissa:22; unsigned int quiet_nan:1; unsigned int exponent:8; @@ -95,15 +86,15 @@ union ieee754_double /* This is the IEEE 754 double-precision format. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:11; /* Together these comprise the mantissa. */ unsigned int mantissa0:20; unsigned int mantissa1:32; #endif /* Big endian. */ -#if __BYTE_ORDER == __LITTLE_ENDIAN -# if __FLOAT_WORD_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_LITTLE_ENDIAN +# if _IEEE754_FLOAT_WORD_ORDER == _IEEE754_BIG_ENDIAN unsigned int mantissa0:20; unsigned int exponent:11; unsigned int negative:1; @@ -121,7 +112,7 @@ union ieee754_double /* This format makes it easier to see if a NaN is a signalling NaN. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:11; unsigned int quiet_nan:1; @@ -129,7 +120,7 @@ union ieee754_double unsigned int mantissa0:19; unsigned int mantissa1:32; #else -# if __FLOAT_WORD_ORDER == __BIG_ENDIAN +# if _IEEE754_FLOAT_WORD_ORDER == _IEEE754_BIG_ENDIAN unsigned int mantissa0:19; unsigned int quiet_nan:1; unsigned int exponent:11; @@ -157,15 +148,15 @@ union ieee854_long_double /* This is the IEEE 854 double-extended-precision format. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:15; unsigned int empty:16; unsigned int mantissa0:32; unsigned int mantissa1:32; #endif -#if __BYTE_ORDER == __LITTLE_ENDIAN -# if __FLOAT_WORD_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_LITTLE_ENDIAN +# if _IEEE754_FLOAT_WORD_ORDER == _IEEE754_BIG_ENDIAN unsigned int exponent:15; unsigned int negative:1; unsigned int empty:16; @@ -184,7 +175,7 @@ union ieee854_long_double /* This is for NaNs in the IEEE 854 double-extended-precision format. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:15; unsigned int empty:16; @@ -193,8 +184,8 @@ union ieee854_long_double unsigned int mantissa0:30; unsigned int mantissa1:32; #endif -#if __BYTE_ORDER == __LITTLE_ENDIAN -# if __FLOAT_WORD_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_LITTLE_ENDIAN +# if _IEEE754_FLOAT_WORD_ORDER == _IEEE754_BIG_ENDIAN unsigned int exponent:15; unsigned int negative:1; unsigned int empty:16; @@ -217,6 +208,8 @@ union ieee854_long_double #define IEEE854_LONG_DOUBLE_BIAS 0x3fff -__END_DECLS +#ifdef __cplusplus +} +#endif #endif /* ieee754.h */ diff --git a/lib/readlink.c b/lib/readlink.c index a5369fa977b..f4af30ebc42 100644 --- a/lib/readlink.c +++ b/lib/readlink.c @@ -98,6 +98,16 @@ rpl_readlink (char const *file, char *buf, size_t bufsize) } # endif +# if defined __CYGWIN__ + /* On Cygwin 3.3.6, readlink("/dev/null") returns "\\Device\\Null", which + is unusable. Better fail with EINVAL. */ + if (r > 0 && strncmp (file, "/dev/", 5) == 0 && buf[0] == '\\') + { + errno = EINVAL; + return -1; + } +# endif + return r; } diff --git a/lib/readlinkat.c b/lib/readlinkat.c index faf85401ae6..f4d64c0d135 100644 --- a/lib/readlinkat.c +++ b/lib/readlinkat.c @@ -79,6 +79,16 @@ rpl_readlinkat (int fd, char const *file, char *buf, size_t bufsize) } # endif +# if defined __CYGWIN__ + /* On Cygwin 3.3.6, readlinkat(AT_FDCWD,"/dev/null") returns "\\Device\\Null", + which is unusable. Better fail with EINVAL. */ + if (r > 0 && strncmp (file, "/dev/", 5) == 0 && buf[0] == '\\') + { + errno = EINVAL; + return -1; + } +# endif + return r; } diff --git a/lib/stdint.in.h b/lib/stdint.in.h index fea7483b9cc..cd3fbdd9654 100644 --- a/lib/stdint.in.h +++ b/lib/stdint.in.h @@ -80,7 +80,7 @@ #define _@GUARD_PREFIX@_STDINT_H /* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX, - LONG_MIN, LONG_MAX, ULONG_MAX, _GL_INTEGER_WIDTH. */ + LONG_MIN, LONG_MAX, ULONG_MAX, CHAR_BIT, _GL_INTEGER_WIDTH. */ #include /* Override WINT_MIN and WINT_MAX if gnulib's or overrides @@ -189,6 +189,10 @@ typedef __int64 gl_int64_t; # define int64_t gl_int64_t # define GL_INT64_T # else +/* Verify that 'long long' has exactly 64 bits. */ +typedef _gl_verify_int64_bits[ + _STDINT_MAX (1, sizeof (long long) * CHAR_BIT, 0ll) >> 31 >> 31 == 1 + ? 1 : -1]; # undef int64_t typedef long long int gl_int64_t; # define int64_t gl_int64_t @@ -210,6 +214,11 @@ typedef unsigned __int64 gl_uint64_t; # define uint64_t gl_uint64_t # define GL_UINT64_T # else +/* Verify that 'unsigned long long' has exactly 64 bits. */ +typedef _gl_verify_uint64_bits[ + _STDINT_MAX (0, sizeof (unsigned long long) * CHAR_BIT, 0ull) + >> 31 >> 31 >> 1 == 1 + ? 1 : -1]; # undef uint64_t typedef unsigned long long int gl_uint64_t; # define uint64_t gl_uint64_t diff --git a/lib/stdlib.in.h b/lib/stdlib.in.h index ef9fde30eb2..cfc69d0a506 100644 --- a/lib/stdlib.in.h +++ b/lib/stdlib.in.h @@ -26,6 +26,10 @@ #@INCLUDE_NEXT@ @NEXT_STDLIB_H@ +/* Make sure that the macros that indicate the special invocation convention + get undefined. This is needed at least on CentOS 7. */ +#undef __need_malloc_and_calloc + #else /* Normal invocation convention. */ diff --git a/lib/strftime.c b/lib/strftime.c index 834f3a79f46..5f1e76833f7 100644 --- a/lib/strftime.c +++ b/lib/strftime.c @@ -1252,6 +1252,9 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) cpy (am_len, a_month); break; #else +# if defined _WIN32 && !defined __CYGWIN__ + format_char = L_('b'); +# endif goto underlying_strftime; #endif @@ -1288,6 +1291,9 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_T_FMT)); #elif USE_C_LOCALE && !HAVE_STRFTIME_L subfmt = L_("%a %b %e %H:%M:%S %Y"); +#elif defined _WIN32 && !defined __CYGWIN__ + /* On native Windows, "%c" is "%d/%m/%Y %H:%M:%S" by default. */ + subfmt = L_("%a %b %e %H:%M:%S %Y"); #else goto underlying_strftime; #endif @@ -1709,8 +1715,9 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) #elif USE_C_LOCALE && !HAVE_STRFTIME_L subfmt = L_("%I:%M:%S %p"); goto subformat; -#elif (defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ - /* macOS, FreeBSD strftime() may produce empty output for "%r". */ +#elif (defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || (defined _WIN32 && !defined __CYGWIN__) + /* macOS, FreeBSD, native Windows strftime() may produce empty output + for "%r". */ subfmt = L_("%I:%M:%S %p"); goto subformat; #else diff --git a/lib/unistd.in.h b/lib/unistd.in.h index 7dbed38969b..e01629af259 100644 --- a/lib/unistd.in.h +++ b/lib/unistd.in.h @@ -1531,12 +1531,21 @@ _GL_CXXALIASWARN (getpid); #if @GNULIB_GETUSERSHELL@ +# if @REPLACE_GETUSERSHELL@ /* Return the next valid login shell on the system, or NULL when the end of the list has been reached. */ -# if !@HAVE_DECL_GETUSERSHELL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef getusershell +# define getusershell rpl_getusershell +# endif +_GL_FUNCDECL_RPL (getusershell, char *, (void)); +_GL_CXXALIAS_RPL (getusershell, char *, (void)); +# else +# if !@HAVE_DECL_GETUSERSHELL@ _GL_FUNCDECL_SYS (getusershell, char *, (void)); -# endif +# endif _GL_CXXALIAS_SYS (getusershell, char *, (void)); +# endif _GL_CXXALIASWARN (getusershell); #elif defined GNULIB_POSIXCHECK # undef getusershell @@ -1548,10 +1557,19 @@ _GL_WARN_ON_USE (getusershell, "getusershell is unportable - " #if @GNULIB_GETUSERSHELL@ /* Rewind to pointer that is advanced at each getusershell() call. */ -# if !@HAVE_DECL_GETUSERSHELL@ +# if @REPLACE_GETUSERSHELL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef setusershell +# define setusershell rpl_setusershell +# endif +_GL_FUNCDECL_RPL (setusershell, void, (void)); +_GL_CXXALIAS_RPL (setusershell, void, (void)); +# else +# if !@HAVE_DECL_GETUSERSHELL@ _GL_FUNCDECL_SYS (setusershell, void, (void)); -# endif +# endif _GL_CXXALIAS_SYS (setusershell, void, (void)); +# endif _GL_CXXALIASWARN (setusershell); #elif defined GNULIB_POSIXCHECK # undef setusershell @@ -1564,10 +1582,19 @@ _GL_WARN_ON_USE (setusershell, "setusershell is unportable - " #if @GNULIB_GETUSERSHELL@ /* Free the pointer that is advanced at each getusershell() call and associated resources. */ -# if !@HAVE_DECL_GETUSERSHELL@ +# if @REPLACE_GETUSERSHELL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef endusershell +# define endusershell rpl_endusershell +# endif +_GL_FUNCDECL_RPL (endusershell, void, (void)); +_GL_CXXALIAS_RPL (endusershell, void, (void)); +# else +# if !@HAVE_DECL_GETUSERSHELL@ _GL_FUNCDECL_SYS (endusershell, void, (void)); -# endif +# endif _GL_CXXALIAS_SYS (endusershell, void, (void)); +# endif _GL_CXXALIASWARN (endusershell); #elif defined GNULIB_POSIXCHECK # undef endusershell diff --git a/lib/utimens.c b/lib/utimens.c index 4bfb9c91a7b..6b9f62a53c1 100644 --- a/lib/utimens.c +++ b/lib/utimens.c @@ -220,7 +220,7 @@ fdutimens (int fd, char const *file, struct timespec const timespec[2]) if (0 <= utimensat_works_really) { int result; -# if __linux__ || __sun +# if defined __linux__ || defined __sun || defined __NetBSD__ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT, but work if both times are either explicitly specified or @@ -230,6 +230,7 @@ fdutimens (int fd, char const *file, struct timespec const timespec[2]) where UTIME_OMIT would have worked. The same bug occurs in Solaris 11.1 (Apr 2013). + The same bug occurs in NetBSD 10.0 (May 2024). FIXME: Simplify this in 2024, when these file system bugs are no longer common on Gnulib target platforms. */ @@ -440,7 +441,7 @@ fdutimens (int fd, char const *file, struct timespec const timespec[2]) # endif if (futimes (fd, t) == 0) { -# if __linux__ && __GLIBC__ +# if defined __linux__ && defined __GLIBC__ /* Work around a longstanding glibc bug, still present as of 2010-12-27. On older Linux kernels that lack both utimensat and utimes, glibc's futimes rounds instead of @@ -553,7 +554,7 @@ lutimens (char const *file, struct timespec const timespec[2]) if (0 <= lutimensat_works_really) { int result; -# if __linux__ || __sun +# if defined __linux__ || defined __sun || defined __NetBSD__ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT, but work if both times are either explicitly specified or @@ -563,6 +564,7 @@ lutimens (char const *file, struct timespec const timespec[2]) UTIME_OMIT would have worked. The same bug occurs in Solaris 11.1 (Apr 2013). + The same bug occurs in NetBSD 10.0 (May 2024). FIXME: Simplify this for Linux in 2016 and for Solaris in 2024, when file system bugs are no longer common. */ diff --git a/lib/utimensat.c b/lib/utimensat.c index 1321264269e..b44207b4bec 100644 --- a/lib/utimensat.c +++ b/lib/utimensat.c @@ -77,7 +77,7 @@ rpl_utimensat (int fd, char const *file, struct timespec const times[2], int flag) # undef utimensat { -# if defined __linux__ || defined __sun +# if defined __linux__ || defined __sun || defined __NetBSD__ struct timespec ts[2]; # endif @@ -86,7 +86,7 @@ rpl_utimensat (int fd, char const *file, struct timespec const times[2], if (0 <= utimensat_works_really) { int result; -# if defined __linux__ || defined __sun +# if defined __linux__ || defined __sun || defined __NetBSD__ struct stat st; /* As recently as Linux kernel 2.6.32 (Dec 2009), several file systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT, @@ -97,6 +97,7 @@ rpl_utimensat (int fd, char const *file, struct timespec const times[2], UTIME_OMIT would have worked. The same bug occurs in Solaris 11.1 (Apr 2013). + The same bug occurs in NetBSD 10.0 (May 2024). FIXME: Simplify this in 2024, when these file system bugs are no longer common on Gnulib target platforms. */ @@ -117,9 +118,11 @@ rpl_utimensat (int fd, char const *file, struct timespec const times[2], ts[1] = times[1]; times = ts; } -# ifdef __hppa__ +# if defined __hppa__ || defined __NetBSD__ /* Linux kernel 2.6.22.19 on hppa does not reject invalid tv_nsec - values. */ + values. + + The same bug occurs in NetBSD 10.0 (May 2024). */ else if (times && ((times[0].tv_nsec != UTIME_NOW && ! (0 <= times[0].tv_nsec diff --git a/lib/verify.h b/lib/verify.h index 08268c2498f..978926a4918 100644 --- a/lib/verify.h +++ b/lib/verify.h @@ -259,11 +259,22 @@ template && (!defined __cplusplus \ || (__cpp_static_assert < 201411 \ && __GNUG__ < 6 && __clang_major__ < 6 && _MSC_VER < 1910))) -# if defined __cplusplus && _MSC_VER >= 1900 && !defined __clang__ +# if (defined __cplusplus && defined __GNUG__ && __GNUG__ < 6 \ + && __cplusplus == 201103L && !defined __clang__) +/* g++ >= 4.7, < 6 with option -std=c++11 or -std=gnu++11 supports the + two-arguments static_assert but not the one-argument static_assert, and + it does not support _Static_assert. + We have to play preprocessor tricks to distinguish the two cases. */ +# define _GL_SA1(a1) static_assert ((a1), "static assertion failed") +# define _GL_SA2 static_assert +# define _GL_SA3 static_assert +# define _GL_SA_PICK(x1,x2,x3,x4,...) x4 +# define static_assert(...) _GL_SA_PICK(__VA_ARGS__,_GL_SA3,_GL_SA2,_GL_SA1) (__VA_ARGS__) +# elif defined __cplusplus && _MSC_VER >= 1900 && !defined __clang__ /* MSVC 14 in C++ mode supports the two-arguments static_assert but not the one-argument static_assert, and it does not support _Static_assert. We have to play preprocessor tricks to distinguish the two cases. - Since the MSVC preprocessor is not ISO C compliant (see above),. + Since the MSVC preprocessor is not ISO C compliant (see above), the solution is specific to MSVC. */ # define _GL_EXPAND(x) x # define _GL_SA1(a1) static_assert ((a1), "static assertion failed") diff --git a/m4/endian_h.m4 b/m4/endian_h.m4 new file mode 100644 index 00000000000..3149b492270 --- /dev/null +++ b/m4/endian_h.m4 @@ -0,0 +1,103 @@ +# endian_h.m4 +# serial 4 +dnl Copyright 2024 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl A placeholder for , for platforms that have issues. + +AC_DEFUN_ONCE([gl_ENDIAN_H], +[ + AC_REQUIRE([gl_BIGENDIAN]) + + AC_CHECK_HEADERS_ONCE([endian.h]) + gl_CHECK_NEXT_HEADERS([endian.h]) + if test $ac_cv_header_endian_h = yes; then + HAVE_ENDIAN_H=1 + dnl Check if endian.h defines uint16_t, uint32_t, and uint64_t. + AC_CACHE_CHECK([if endian.h defines stdint types], + [gl_cv_header_endian_h_stdint_types], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include + ]], + [[uint16_t t1 = 0; + uint32_t t2 = 0; + uint64_t t3 = 0; + return !(t1 + t2 + t3); + ]])], + [gl_cv_header_endian_h_stdint_types=yes], + [gl_cv_header_endian_h_stdint_types=no]) + ]) + AC_CACHE_CHECK([if endian.h defines functions and macros], + [gl_cv_header_working_endian_h], + [gl_cv_header_working_endian_h=no + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( +[[ +#include +]], +[[ +#if LITTLE_ENDIAN == BIG_ENDIAN +# error "Endian macros not unique." +#endif +#if BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN +# error "Byte order not defined." +#endif + +/* Big endian to host. */ +int value16_1 = be16toh (0.0); +int value32_1 = be32toh (0.0); +int value64_1 = be64toh (0.0); + +/* Host to big endian. */ +int value16_2 = htobe16 (0.0); +int value32_2 = htobe32 (0.0); +int value64_2 = htobe64 (0.0); + +/* Little endian to host. */ +int value16_3 = le16toh (0.0); +int value32_3 = le32toh (0.0); +int value64_3 = le64toh (0.0); + +/* Host to little endian. */ +int value16_4 = htole16 (0.0); +int value32_4 = htole32 (0.0); +int value64_4 = htole64 (0.0); + +/* Make sure the variables get used. */ +return !(value16_1 + value32_1 + value64_1 + + value16_2 + value32_2 + value64_2 + + value16_3 + value32_3 + value64_3 + + value16_4 + value32_4 + value64_4); +]])], + [gl_cv_header_working_endian_h=yes], + [gl_cv_header_working_endian_h=no]) + ]) + else + HAVE_ENDIAN_H=0 + fi + + dnl Check if endian.h should be generated. + if test "$gl_cv_header_endian_h_stdint_types" = yes \ + && test "$gl_cv_header_working_endian_h" = yes; then + GL_GENERATE_ENDIAN_H=false + else + GL_GENERATE_ENDIAN_H=true + fi + + dnl Check if endian.h works but is missing types from stdint.h. + if test $GL_GENERATE_ENDIAN_H; then + if test "$gl_cv_header_working_endian_h" = yes; then + ENDIAN_H_JUST_MISSING_STDINT=1 + else + ENDIAN_H_JUST_MISSING_STDINT=0 + fi + else + ENDIAN_H_JUST_MISSING_STDINT=0 + fi + + AC_SUBST([HAVE_ENDIAN_H]) + AC_SUBST([ENDIAN_H_JUST_MISSING_STDINT]) +]) diff --git a/m4/getopt.m4 b/m4/getopt.m4 index 297722eae44..53cab8bef93 100644 --- a/m4/getopt.m4 +++ b/m4/getopt.m4 @@ -1,5 +1,5 @@ # getopt.m4 -# serial 49 +# serial 50 dnl Copyright (C) 2002-2006, 2008-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -366,14 +366,7 @@ dnl is ambiguous with environment values that contain newlines. AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER], [ - AC_CHECK_HEADERS_ONCE([sys/cdefs.h]) - if test $ac_cv_header_sys_cdefs_h = yes; then - HAVE_SYS_CDEFS_H=1 - else - HAVE_SYS_CDEFS_H=0 - fi - AC_SUBST([HAVE_SYS_CDEFS_H]) - + gl_CHECK_HEADER_SYS_CDEFS_H AC_DEFINE([__GETOPT_PREFIX], [[rpl_]], [Define to rpl_ if the getopt replacement functions and variables should be used.]) diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4 index cb730449507..b34b4534bfe 100644 --- a/m4/gnulib-common.m4 +++ b/m4/gnulib-common.m4 @@ -1,5 +1,5 @@ # gnulib-common.m4 -# serial 93 +# serial 95 dnl Copyright (C) 2007-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -114,8 +114,10 @@ AC_DEFUN([gl_COMMON_BODY], [ # define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3) # define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7) # define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96) +# define _GL_ATTR_reproducible 0 /* not yet supported, as of GCC 14 */ # define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9) # define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0) +# define _GL_ATTR_unsequenced 0 /* not yet supported, as of GCC 14 */ # define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7) # define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4) # endif @@ -152,7 +154,7 @@ AC_DEFUN([gl_COMMON_BODY], [ _GL_ATTRIBUTE_ALLOC_SIZE ((M, N)) declares that the Mth argument multiplied by the Nth argument of the function is the size of the returned memory block. */ -/* Applies to: function, pointer to function, function types. */ +/* Applies to: functions, pointer to functions, function types. */ #ifndef _GL_ATTRIBUTE_ALLOC_SIZE # if _GL_HAS_ATTRIBUTE (alloc_size) # define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args)) @@ -163,7 +165,7 @@ AC_DEFUN([gl_COMMON_BODY], [ /* _GL_ATTRIBUTE_ALWAYS_INLINE tells that the compiler should always inline the function and report an error if it cannot do so. */ -/* Applies to: function. */ +/* Applies to: functions. */ #ifndef _GL_ATTRIBUTE_ALWAYS_INLINE # if _GL_HAS_ATTRIBUTE (always_inline) # define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__)) @@ -175,7 +177,7 @@ AC_DEFUN([gl_COMMON_BODY], [ /* _GL_ATTRIBUTE_ARTIFICIAL declares that the function is not important to show in stack traces when debugging. The compiler should omit the function from stack traces. */ -/* Applies to: function. */ +/* Applies to: functions. */ #ifndef _GL_ATTRIBUTE_ARTIFICIAL # if _GL_HAS_ATTRIBUTE (artificial) # define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__)) @@ -201,18 +203,23 @@ AC_DEFUN([gl_COMMON_BODY], [ # endif #endif -/* _GL_ATTRIBUTE_CONST declares that it is OK for a compiler to omit duplicate - calls to the function with the same arguments. - This attribute is safe for a function that neither depends on nor affects - observable state, and always returns exactly once - e.g., does not loop - forever, and does not call longjmp. - (This attribute is stricter than _GL_ATTRIBUTE_PURE.) */ +/* _GL_ATTRIBUTE_CONST declares: + It is OK for a compiler to move calls to the function and to omit + calls to the function if another call has the same arguments or the + result is not used. + This attribute is safe for a function that neither depends on + nor affects state, and always returns exactly once - + e.g., does not raise an exception, call longjmp, or loop forever. + (This attribute is stricter than _GL_ATTRIBUTE_PURE because the + function cannot observe state. It is stricter than + _GL_ATTRIBUTE_UNSEQUENCED because the function must return exactly + once and cannot depend on state addressed by its arguments.) */ /* Applies to: functions. */ #ifndef _GL_ATTRIBUTE_CONST # if _GL_HAS_ATTRIBUTE (const) # define _GL_ATTRIBUTE_CONST __attribute__ ((__const__)) # else -# define _GL_ATTRIBUTE_CONST +# define _GL_ATTRIBUTE_CONST _GL_ATTRIBUTE_UNSEQUENCED # endif #endif @@ -505,9 +512,9 @@ AC_DEFUN([gl_COMMON_BODY], [ minimizing the memory required. */ /* Applies to: struct members, struct, union, in C++ also: class. */ +#ifndef _GL_ATTRIBUTE_PACKED /* Oracle Studio 12.6 miscompiles code with __attribute__ ((__packed__)) despite __has_attribute OK. */ -#ifndef _GL_ATTRIBUTE_PACKED # if _GL_HAS_ATTRIBUTE (packed) && !defined __SUNPRO_C # define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__)) # else @@ -515,18 +522,49 @@ AC_DEFUN([gl_COMMON_BODY], [ # endif #endif -/* _GL_ATTRIBUTE_PURE declares that It is OK for a compiler to omit duplicate - calls to the function with the same arguments if observable state is not - changed between calls. - This attribute is safe for a function that does not affect - observable state, and always returns exactly once. - (This attribute is looser than _GL_ATTRIBUTE_CONST.) */ +/* _GL_ATTRIBUTE_PURE declares: + It is OK for a compiler to move calls to the function and to omit + calls to the function if another call has the same arguments or the + result is not used, and if observable state is the same. + This attribute is safe for a function that does not affect observable state + and always returns exactly once. + (This attribute is looser than _GL_ATTRIBUTE_CONST because the function + can depend on observable state. It is stricter than + _GL_ATTRIBUTE_REPRODUCIBLE because the function must return exactly + once and cannot affect state addressed by its arguments.) */ /* Applies to: functions. */ #ifndef _GL_ATTRIBUTE_PURE # if _GL_HAS_ATTRIBUTE (pure) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) # else -# define _GL_ATTRIBUTE_PURE +# define _GL_ATTRIBUTE_PURE _GL_ATTRIBUTE_REPRODUCIBLE +# endif +#endif + +/* _GL_ATTRIBUTE_REPRODUCIBLE declares: + It is OK for a compiler to move calls to the function and to omit duplicate + calls to the function with the same arguments, so long as the state + addressed by its arguments is the same and is updated in time for + the rest of the program. + This attribute is safe for a function that is effectless and idempotent; see + ISO C 23 § 6.7.12.7 for a definition of these terms. + (This attribute is looser than _GL_ATTRIBUTE_UNSEQUENCED because + the function need not be stateless and idempotent. It is looser + than _GL_ATTRIBUTE_PURE because the function need not return + exactly once and can affect state addressed by its arguments.) + See also and + . */ +/* Applies to: functions, pointer to functions, function types. */ +#ifndef _GL_ATTRIBUTE_REPRODUCIBLE +/* This may be revisited when gcc and clang support [[reproducible]] or possibly + __attribute__ ((__reproducible__)). */ +# ifndef _GL_BRACKET_BEFORE_ATTRIBUTE +# if _GL_HAS_ATTRIBUTE (reproducible) +# define _GL_ATTRIBUTE_REPRODUCIBLE [[reproducible]] +# endif +# endif +# ifndef _GL_ATTRIBUTE_REPRODUCIBLE +# define _GL_ATTRIBUTE_REPRODUCIBLE # endif #endif @@ -554,6 +592,33 @@ AC_DEFUN([gl_COMMON_BODY], [ # endif #endif +/* _GL_ATTRIBUTE_UNSEQUENCED declares: + It is OK for a compiler to move calls to the function and to omit duplicate + calls to the function with the same arguments, so long as the state + addressed by its arguments is the same. + This attribute is safe for a function that is effectless, idempotent, + stateless, and independent; see ISO C 23 § 6.7.12.7 for a definition of + these terms. + (This attribute is stricter than _GL_ATTRIBUTE_REPRODUCIBLE because + the function must be stateless and independent. It is looser than + _GL_ATTRIBUTE_CONST because the function need not return exactly + once and can depend on state addressed by its arguments.) + See also and + . */ +/* Applies to: functions, pointer to functions, function types. */ +#ifndef _GL_ATTRIBUTE_UNSEQUENCED +/* This may be revisited when gcc and clang support [[unsequenced]] or possibly + __attribute__ ((__unsequenced__)). */ +# ifndef _GL_BRACKET_BEFORE_ATTRIBUTE +# if _GL_HAS_ATTRIBUTE (unsequenced) +# define _GL_ATTRIBUTE_UNSEQUENCED [[unsequenced]] +# endif +# endif +# ifndef _GL_ATTRIBUTE_UNSEQUENCED +# define _GL_ATTRIBUTE_UNSEQUENCED +# endif +#endif + /* A helper macro. Don't use it directly. */ #ifndef _GL_ATTRIBUTE_UNUSED # if _GL_HAS_ATTRIBUTE (unused) diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4 index 4dd1e68d15c..9af4b3a9fc8 100644 --- a/m4/gnulib-comp.m4 +++ b/m4/gnulib-comp.m4 @@ -77,6 +77,7 @@ AC_DEFUN([gl_EARLY], # Code from module dtotimespec: # Code from module dup2: # Code from module eloop-threshold: + # Code from module endian: # Code from module environ: # Code from module errno: # Code from module euidaccess: @@ -666,6 +667,7 @@ AC_DEFUN([gl_INIT], gl_gnulib_enabled_cloexec=false gl_gnulib_enabled_dirfd=false gl_gnulib_enabled_925677f0343de64b89a9f0c790b4104c=false + gl_gnulib_enabled_endian=false gl_gnulib_enabled_euidaccess=false gl_gnulib_enabled_getdelim=false gl_gnulib_enabled_getdtablesize=false @@ -724,6 +726,15 @@ AC_DEFUN([gl_INIT], gl_gnulib_enabled_925677f0343de64b89a9f0c790b4104c=true fi } + func_gl_gnulib_m4code_endian () + { + if $gl_gnulib_enabled_endian; then :; else + gl_ENDIAN_H + gl_CONDITIONAL_HEADER([endian.h]) + AC_PROG_MKDIR_P + gl_gnulib_enabled_endian=true + fi + } func_gl_gnulib_m4code_euidaccess () { if $gl_gnulib_enabled_euidaccess; then :; else @@ -1036,6 +1047,9 @@ AC_DEFUN([gl_INIT], if case $host_os in mingw* | windows*) false;; *) test $HAVE_GETRANDOM = 0 || test $REPLACE_GETRANDOM = 1;; esac; then func_gl_gnulib_m4code_open fi + if $GL_GENERATE_IEEE754_H; then + func_gl_gnulib_m4code_endian + fi if test $REPLACE_MKTIME = 1; then func_gl_gnulib_m4code_verify fi @@ -1071,6 +1085,7 @@ AC_DEFUN([gl_INIT], AM_CONDITIONAL([gl_GNULIB_ENABLED_cloexec], [$gl_gnulib_enabled_cloexec]) AM_CONDITIONAL([gl_GNULIB_ENABLED_dirfd], [$gl_gnulib_enabled_dirfd]) AM_CONDITIONAL([gl_GNULIB_ENABLED_925677f0343de64b89a9f0c790b4104c], [$gl_gnulib_enabled_925677f0343de64b89a9f0c790b4104c]) + AM_CONDITIONAL([gl_GNULIB_ENABLED_endian], [$gl_gnulib_enabled_endian]) AM_CONDITIONAL([gl_GNULIB_ENABLED_euidaccess], [$gl_gnulib_enabled_euidaccess]) AM_CONDITIONAL([gl_GNULIB_ENABLED_getdelim], [$gl_gnulib_enabled_getdelim]) AM_CONDITIONAL([gl_GNULIB_ENABLED_getdtablesize], [$gl_gnulib_enabled_getdtablesize]) @@ -1312,6 +1327,8 @@ AC_DEFUN([gl_FILE_LIST], [ lib/dup2.c lib/dynarray.h lib/eloop-threshold.h + lib/endian.c + lib/endian.in.h lib/errno.in.h lib/euidaccess.c lib/execinfo.c @@ -1506,6 +1523,7 @@ AC_DEFUN([gl_FILE_LIST], [ m4/double-slash-root.m4 m4/dup2.m4 m4/eealloc.m4 + m4/endian_h.m4 m4/environ.m4 m4/errno_h.m4 m4/euidaccess.m4 @@ -1605,6 +1623,7 @@ AC_DEFUN([gl_FILE_LIST], [ m4/strtoimax.m4 m4/strtoll.m4 m4/symlink.m4 + m4/sys_cdefs_h.m4 m4/sys_random_h.m4 m4/sys_select_h.m4 m4/sys_socket_h.m4 diff --git a/m4/readlink.m4 b/m4/readlink.m4 index bc9a5deb06e..7ebdb6ca14f 100644 --- a/m4/readlink.m4 +++ b/m4/readlink.m4 @@ -1,5 +1,5 @@ # readlink.m4 -# serial 17 +# serial 18 dnl Copyright (C) 2003, 2007, 2009-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -8,7 +8,7 @@ dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_READLINK], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) - AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_REQUIRE([AC_CANONICAL_HOST]) AC_CHECK_FUNCS_ONCE([readlink]) if test $ac_cv_func_readlink = no; then HAVE_READLINK=0 @@ -18,9 +18,13 @@ AC_DEFUN([gl_FUNC_READLINK], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include - /* Cause compilation failure if original declaration has wrong type. */ - ssize_t readlink (const char *, char *, size_t);]])], + /* Cause compilation failure if original declaration has + wrong type. */ + ssize_t readlink (const char *, char *, size_t); + ]]) + ], [gl_cv_decl_readlink_works=yes], [gl_cv_decl_readlink_works=no])]) + dnl Solaris 9 ignores trailing slash. dnl FreeBSD 7.2 dereferences only one level of links with trailing slash. AC_CACHE_CHECK([whether readlink handles trailing slash correctly], @@ -31,8 +35,11 @@ AC_DEFUN([gl_FUNC_READLINK], AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include -]], [[char buf[20]; - return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;]])], + ]], + [[char buf[20]; + return readlink ("conftest.lnk2/", buf, sizeof buf) != -1; + ]]) + ], [gl_cv_func_readlink_trailing_slash=yes], [gl_cv_func_readlink_trailing_slash=no], [case "$host_os" in @@ -71,8 +78,11 @@ AC_DEFUN([gl_FUNC_READLINK], AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include -]], [[char c; - return readlink ("conftest.link", &c, 1) != 1;]])], + ]], + [[char c; + return readlink ("conftest.link", &c, 1) != 1; + ]]) + ], [gl_cv_func_readlink_truncate=yes], [gl_cv_func_readlink_truncate=no], [case "$host_os" in @@ -103,6 +113,14 @@ AC_DEFUN([gl_FUNC_READLINK], REPLACE_READLINK=1 ;; esac + + dnl On Cygwin 3.3.6, readlink("/dev/null") returns "\\Device\\Null", which + dnl is unusable. + case "$host_os" in + cygwin*) + REPLACE_READLINK=1 + ;; + esac fi ]) diff --git a/m4/readlinkat.m4 b/m4/readlinkat.m4 index 8a33c169136..1f091e8b636 100644 --- a/m4/readlinkat.m4 +++ b/m4/readlinkat.m4 @@ -1,5 +1,5 @@ # readlinkat.m4 -# serial 8 +# serial 9 dnl Copyright (C) 2009-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -27,9 +27,12 @@ AC_DEFUN([gl_FUNC_READLINKAT], [AC_LANG_PROGRAM( [[#include /* Check whether original declaration has correct type. */ - ssize_t readlinkat (int, char const *, char *, size_t);]])], + ssize_t readlinkat (int, char const *, char *, size_t); + ]]) + ], [gl_cv_decl_readlinkat_works=yes], - [gl_cv_decl_readlinkat_works=no])]) + [gl_cv_decl_readlinkat_works=no]) + ]) # Assume readlinkat has the same bugs as readlink, # as is the case on OS X 10.10 with trailing slashes. case $gl_cv_decl_readlinkat_works,$gl_cv_func_readlink_trailing_slash,$gl_cv_func_readlink_truncate in @@ -39,5 +42,13 @@ AC_DEFUN([gl_FUNC_READLINKAT], REPLACE_READLINKAT=1 ;; esac + + dnl On Cygwin 3.3.6, readlinkat(AT_FDCWD,"/dev/null") returns + dnl "\\Device\\Null", which is unusable. + case "$host_os" in + cygwin*) + REPLACE_READLINKAT=1 + ;; + esac fi ]) diff --git a/m4/sys_cdefs_h.m4 b/m4/sys_cdefs_h.m4 new file mode 100644 index 00000000000..22fa6c3849e --- /dev/null +++ b/m4/sys_cdefs_h.m4 @@ -0,0 +1,25 @@ +# sys_cdefs_h.m4 - Is compatible enough with glibc? +# serial 2 +dnl Copyright 2024 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Written by Paul Eggert. + +AC_DEFUN_ONCE([gl_CHECK_HEADER_SYS_CDEFS_H], + [AC_CACHE_CHECK([for glibc-compatible sys/cdefs.h], + [gl_cv_header_sys_cdefs_h], + [AC_COMPILE_IFELSE( + [AC_LANG_DEFINES_PROVIDED + [#include + enum { foo = __GNUC_PREREQ (14, 1) } bar; + ]], + [gl_cv_header_sys_cdefs_h=yes], + [gl_cv_header_sys_cdefs_h=no])]) + if test "$gl_cv_header_sys_cdefs_h" = yes; then + HAVE_SYS_CDEFS_H=1 + else + HAVE_SYS_CDEFS_H=0 + fi + AC_SUBST([HAVE_SYS_CDEFS_H])]) diff --git a/m4/unistd_h.m4 b/m4/unistd_h.m4 index 81d1b9f6169..04fa79c9ca6 100644 --- a/m4/unistd_h.m4 +++ b/m4/unistd_h.m4 @@ -1,5 +1,5 @@ # unistd_h.m4 -# serial 95 +# serial 96 dnl Copyright (C) 2006-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -248,6 +248,7 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS], REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE]) REPLACE_GETPASS=0; AC_SUBST([REPLACE_GETPASS]) REPLACE_GETPASS_FOR_GETPASS_GNU=0; AC_SUBST([REPLACE_GETPASS_FOR_GETPASS_GNU]) + REPLACE_GETUSERSHELL=0; AC_SUBST([REPLACE_GETUSERSHELL]) REPLACE_ISATTY=0; AC_SUBST([REPLACE_ISATTY]) REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN]) REPLACE_LINK=0; AC_SUBST([REPLACE_LINK])