summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2023-04-24 19:48:47 +0200
committerBruno Haible <bruno@clisp.org>2023-04-24 19:48:47 +0200
commitc254399aae1fb663ff9d3038aa4725213afc2cc3 (patch)
tree6acd0c1e4371284a5d8099bc8c93995bd618f6fe
parentca5545a273810bb759fb854f70b8d228b6094ff0 (diff)
downloadgnulib-c254399aae1fb663ff9d3038aa4725213afc2cc3.tar.gz
ftell, ftello: Fix recognition of pipes on native Windows.
* m4/lseek.m4 (gl_FUNC_LSEEK): Update comment. * m4/ftello.m4 (gl_FUNC_FTELLO): On native Windows, set REPLACE_FTELLO=1 always. * doc/posix-functions/ftello.texi: Mention the behaviour on pipes. * doc/posix-functions/ftell.texi: Likewise. * doc/posix-functions/fgetpos.texi: Likewise.
-rw-r--r--ChangeLog10
-rw-r--r--doc/posix-functions/fgetpos.texi3
-rw-r--r--doc/posix-functions/ftell.texi3
-rw-r--r--doc/posix-functions/ftello.texi3
-rw-r--r--m4/ftello.m415
-rw-r--r--m4/lseek.m410
6 files changed, 38 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 853e9085f6..0420fa8c9e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2023-04-24 Bruno Haible <bruno@clisp.org>
+ ftell, ftello: Fix recognition of pipes on native Windows.
+ * m4/lseek.m4 (gl_FUNC_LSEEK): Update comment.
+ * m4/ftello.m4 (gl_FUNC_FTELLO): On native Windows, set REPLACE_FTELLO=1
+ always.
+ * doc/posix-functions/ftello.texi: Mention the behaviour on pipes.
+ * doc/posix-functions/ftell.texi: Likewise.
+ * doc/posix-functions/fgetpos.texi: Likewise.
+
+2023-04-24 Bruno Haible <bruno@clisp.org>
+
lseek: Fix module dependencies (regression 2021-11-15).
* modules/lseek (Depends-on): Re-enable the msvc-nothrow dependency
also when WINDOWS_64_BIT_OFF_T is 0.
diff --git a/doc/posix-functions/fgetpos.texi b/doc/posix-functions/fgetpos.texi
index 89e3acd58f..4a0051ea23 100644
--- a/doc/posix-functions/fgetpos.texi
+++ b/doc/posix-functions/fgetpos.texi
@@ -19,4 +19,7 @@ Portability problems not fixed by Gnulib:
@code{fflush}, @code{ftell}, @code{ftello}, @code{fgetpos} behave incorrectly
on input streams that are opened in @code{O_TEXT} mode and whose contents
contains Unix line terminators (LF), on some platforms: mingw, MSVC 14.
+@item
+This function mistakenly succeeds on pipes on some platforms:
+mingw 10.
@end itemize
diff --git a/doc/posix-functions/ftell.texi b/doc/posix-functions/ftell.texi
index 5a15dee8ea..5d79f5576b 100644
--- a/doc/posix-functions/ftell.texi
+++ b/doc/posix-functions/ftell.texi
@@ -20,6 +20,9 @@ This function, when invoked after @code{ungetc}, throws away the @code{ungetc}
buffer, changes the stream's file position, and returns the wrong position on
some platforms:
macOS 10.15 and newer.
+@item
+This function mistakenly succeeds on pipes on some platforms:
+mingw 10.
@end itemize
Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/ftello.texi b/doc/posix-functions/ftello.texi
index ded1df0c11..4e9427015c 100644
--- a/doc/posix-functions/ftello.texi
+++ b/doc/posix-functions/ftello.texi
@@ -27,6 +27,9 @@ macOS 10.15 and newer.
@item
This function fails on seekable stdin, stdout, and stderr: cygwin <= 1.5.24.
@item
+This function mistakenly succeeds on pipes on some platforms:
+mingw 10.
+@item
On platforms where @code{off_t} is a 32-bit type, @code{ftello} does not work
correctly with files 2 GiB and larger. @xref{Large File Support}.
@end itemize
diff --git a/m4/ftello.m4 b/m4/ftello.m4
index 4901b16835..e13fcd93d2 100644
--- a/m4/ftello.m4
+++ b/m4/ftello.m4
@@ -1,4 +1,4 @@
-# ftello.m4 serial 14
+# ftello.m4 serial 15
dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -37,13 +37,24 @@ AC_DEFUN([gl_FUNC_FTELLO],
if test $gl_cv_var_stdin_large_offset = no; then
REPLACE_FTELLO=1
fi
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ if test $REPLACE_FTELLO = 0; then
+ dnl On native Windows, in some circumstances, ftell(), ftello(),
+ dnl fgetpos(), lseek(), _lseeki64() all succeed on devices of type
+ dnl FILE_TYPE_PIPE. However, to match POSIX behaviour, we want
+ dnl ftell(), ftello(), fgetpos(), lseek() to fail when the argument fd
+ dnl designates a pipe. See also
+ dnl https://github.com/python/cpython/issues/78961#issuecomment-1093800325
+ case "$host_os" in
+ mingw*) REPLACE_FTELLO=1 ;;
+ esac
+ fi
if test $REPLACE_FTELLO = 0; then
dnl Detect bug on Solaris.
dnl ftell and ftello produce incorrect results after putc that followed a
dnl getc call that reached EOF on Solaris. This is because the _IOREAD
dnl flag does not get cleared in this case, even though _IOWRT gets set,
dnl and ftell and ftello look whether the _IOREAD flag is set.
- AC_REQUIRE([AC_CANONICAL_HOST])
AC_CACHE_CHECK([whether ftello works],
[gl_cv_func_ftello_works],
[
diff --git a/m4/lseek.m4 b/m4/lseek.m4
index 6e1ab6ffaa..0da458804f 100644
--- a/m4/lseek.m4
+++ b/m4/lseek.m4
@@ -1,4 +1,4 @@
-# lseek.m4 serial 13
+# lseek.m4 serial 14
dnl Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -17,9 +17,11 @@ AC_DEFUN([gl_FUNC_LSEEK],
dnl Native Windows.
dnl The result of lseek (fd, (off_t)0, SEEK_CUR) or
dnl SetFilePointer(handle, 0, NULL, FILE_CURRENT)
- dnl for a pipe depends on the environment: In a Cygwin 1.5
- dnl environment it succeeds (wrong); in a Cygwin 1.7 environment
- dnl it fails with a wrong errno value.
+ dnl for a pipe depends on the environment:
+ dnl In a Cygwin 1.5 environment it succeeds (wrong);
+ dnl in a Cygwin 1.7 environment it fails with a wrong errno value;
+ dnl in a Cygwin 2.9.0 environment it fails correctly;
+ dnl in a Cygwin 3.4.6 environment it succeeds again (wrong).
gl_cv_func_lseek_pipe=no
;;
*)