]> git.eshelyaron.com Git - emacs.git/commitdiff
Update from Gnulib by running admin/merge-gnulib
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 4 Jun 2024 04:57:53 +0000 (21:57 -0700)
committerEshel Yaron <me@eshelyaron.com>
Tue, 4 Jun 2024 09:06:58 +0000 (11:06 +0200)
* 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)

27 files changed:
lib/acl-internal.c
lib/attribute.h
lib/boot-time-aux.h
lib/boot-time.c
lib/endian.c [new file with mode: 0644]
lib/endian.in.h [new file with mode: 0644]
lib/euidaccess.c
lib/getopt.c
lib/gnulib.mk.in
lib/ieee754.in.h
lib/readlink.c
lib/readlinkat.c
lib/stdint.in.h
lib/stdlib.in.h
lib/strftime.c
lib/unistd.in.h
lib/utimens.c
lib/utimensat.c
lib/verify.h
m4/endian_h.m4 [new file with mode: 0644]
m4/getopt.m4
m4/gnulib-common.m4
m4/gnulib-comp.m4
m4/readlink.m4
m4/readlinkat.m4
m4/sys_cdefs_h.m4 [new file with mode: 0644]
m4/unistd_h.m4

index 68aead8de650e37a912ac7c145e533dc4d1105cc..9ebb6e544b0936bd41aef4779caddc152a38f83b 100644 (file)
 
 #include "acl-internal.h"
 
+#if defined __CYGWIN__
+# include <sys/types.h>
+# include <grp.h>
+# include <string.h>
+#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. <https://learn.microsoft.com/en-us/windows/win32/secauthz/well-known-sids>  */
+                    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;
 
index 710341ba417c042714c819b18fa69b67633b1970..604965a6d1821e999fdf3a4e167b290fe2e5fe58 100644 (file)
@@ -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
 /* 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'.  */
 
 /* 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 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2956.htm> and
+   <https://stackoverflow.com/questions/76847905/>.  */
+/* 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 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2956.htm> and
+   <https://stackoverflow.com/questions/76847905/>.  */
+/* 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
index 7f8c5405e4c09e03b0c926734c8439298014043c..8b98c4e57344213caac48d6a5414fc65e4cc9ed4 100644 (file)
@@ -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:
+   <https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-gettickcount64>.  */
+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
index c1171e8024db0f7bf3db7b2add88a71003ad46bf..71562dcf751af3ca05d903e319d75f997f7776ee 100644 (file)
 # include <OS.h>
 #endif
 
+#if defined _WIN32 && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# include <sysinfoapi.h>
+# include <sys/time.h>
+#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 (file)
index 0000000..3e7e56f
--- /dev/null
@@ -0,0 +1,23 @@
+/* Inline functions for <endian.h>.
+
+   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 <https://www.gnu.org/licenses/>.  */
+
+/* Written by Collin Funk.  */
+
+#include <config.h>
+
+#define _GL_ENDIAN_INLINE _GL_EXTERN_INLINE
+#include <endian.h>
diff --git a/lib/endian.in.h b/lib/endian.in.h
new file mode 100644 (file)
index 0000000..bd65ae8
--- /dev/null
@@ -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 <https://www.gnu.org/licenses/>.  */
+
+/* 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 <stdint.h>
+#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 <stdint.h>
+
+/* Byteswap functions.  */
+#include <byteswap.h>
+
+_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 */
index ad392dba19cd9adc7de4a180aeaa55de63a389f4..6229f2c0d068178fc289486e7d0aae254befc8e8 100644 (file)
@@ -29,9 +29,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
-#if defined _WIN32 && ! defined __CYGWIN__
-# include <io.h>
-#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 ();
index f66f119ec50ab3eb0f5810f4dec40ce008a3b338..ea2d1a529c48a46921d01b4d449da19867623954 100644 (file)
@@ -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).  */
index 358d58d5015a483d05b53d321dfddba698eb7464..832b245edc2fd6d9956add0f76846a965adfd1ba 100644 (file)
@@ -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 <endian.h> 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' \
index 805048ca9fc4c88d3ec8e6ebac802afb54c88bed..4dd0ff55d293b9f3e6c8cf561f718aec3bbd38a4 100644 (file)
    <https://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
 
 #ifndef _GL_GNULIB_HEADER
 /* Ordinary glibc usage.  */
 # include <features.h>
-# include <endian.h>
+# include <bits/endian.h>
+# 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 <endian.h>
+# 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 */
index a5369fa977b8567c28122aed3f711bd3d5d0f5e9..f4af30ebc42b231125538140dbeb7402d027b6b4 100644 (file)
@@ -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;
 }
 
index faf85401ae6edbe86b23cdb7bb5667fe7516862f..f4d64c0d135299127bc4329071193eea867cccf3 100644 (file)
@@ -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;
 }
 
index fea7483b9cc5d463697d99fae9d87a6b2166e261..cd3fbdd9654c693f6500a7ae9a22c24f177dcb20 100644 (file)
@@ -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 <limits.h>
 
 /* Override WINT_MIN and WINT_MAX if gnulib's <wchar.h> or <wctype.h> 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
index ef9fde30eb2c1db472ec2228f75933b45d3fe2a9..cfc69d0a50629ef51033c861530b7591997d9100 100644 (file)
 
 #@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.  */
 
index 834f3a79f46d68bce57dfb74b6c9bd9a48c2ad21..5f1e76833f731ee3eefe6ac087c30532b4f17334 100644 (file)
@@ -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
index 7dbed38969b4a08e45a09a8d99c59d1b86a326ea..e01629af259dfc87892c230b30d78b30f13a34b8 100644 (file)
@@ -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
index 4bfb9c91a7bb786a8c2e4089d3b4d90569ab780c..6b9f62a53c18bdd41519b41257d03a032cfe6ce3 100644 (file)
@@ -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.  */
index 1321264269e1c710464e3fcd0065b4897aae6be4..b44207b4bec50063751236be4a4bfeed016a269b 100644 (file)
@@ -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
index 08268c2498f6d25948749dd742e7759d66b241f2..978926a4918a39293184eb5423f1101af1368bcd 100644 (file)
@@ -259,11 +259,22 @@ template <int w>
       && (!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 (file)
index 0000000..3149b49
--- /dev/null
@@ -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 <endian.h>, 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 <endian.h>
+            ]],
+            [[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 <endian.h>
+]],
+[[
+#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])
+])
index 297722eae441b323f82311e68a514abcf491eb04..53cab8bef93126239bff3427aeb86bbf961a5e75 100644 (file)
@@ -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.])
index cb730449507799d5743445b5f6b16d8c9de84ab8..b34b4534bfe6e79dfd3e3df49c16f4183a6639b3 100644 (file)
@@ -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 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2956.htm> and
+   <https://stackoverflow.com/questions/76847905/>.  */
+/* 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 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2956.htm> and
+   <https://stackoverflow.com/questions/76847905/>.  */
+/* 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)
index 4dd1e68d15c1cbc618e8a5d4c6b794c17999127a..9af4b3a9fc870faf757e60e1a731c4b9ab784e2f 100644 (file)
@@ -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
index bc9a5deb06e731d411800a2d18b142a319eb78c5..7ebdb6ca14f15e61560f920f25e927e43a60f669 100644 (file)
@@ -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 <unistd.h>
-      /* 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 <unistd.h>
-]], [[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 <unistd.h>
-]], [[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
 ])
 
index 8a33c1691362e2ec9ebb2762dda7809463496f36..1f091e8b636a5ac4e8d1f6329aafa41d493f265e 100644 (file)
@@ -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 <unistd.h>
              /* 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 (file)
index 0000000..22fa6c3
--- /dev/null
@@ -0,0 +1,25 @@
+# sys_cdefs_h.m4 - Is <sys/cdefs.h> 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 <sys/cdefs.h>
+          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])])
index 81d1b9f6169dd091531e57305187142457920baa..04fa79c9ca607712b181b7ea2f5fb50feabeded4 100644 (file)
@@ -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])