changeset 9153:f03082407073

Work around lseek bug on BeOS.
author Bruno Haible <bruno@clisp.org>
date Sun, 19 Aug 2007 09:08:05 +0000
parents 5c635afb24c8
children 0a3b6ec42c55
files ChangeLog doc/functions/lseek.texi lib/lseek.c m4/lseek.m4
diffstat 4 files changed, 32 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-08-18  Bruno Haible  <bruno@clisp.org>
+            Eric Blake  <ebb9@byu.net>
+
+	* lib/lseek.c: Include <sys/stat.h>.
+	(rpl_lseek): Add workaround code also for Unix platforms.
+	Needed for BeOS.
+	* m4/lseek.m4 (gl_FUNC_LSEEK): When cross-compiling, fail on BeOS.
+	* doc/functions/lseek.texi: Document BeOS definiency.
+
 2007-08-18  Bruno Haible  <bruno@clisp.org>
 
 	* modules/fstrcmp-tests: New file.
--- a/doc/functions/lseek.texi
+++ b/doc/functions/lseek.texi
@@ -9,7 +9,7 @@
 Portability problems fixed by Gnulib:
 @itemize
 @item
-This function mistakenly succeeds on pipes on some platforms: mingw.
+This function mistakenly succeeds on pipes on some platforms: mingw, BeOS.
 @end itemize
 
 Portability problems not fixed by Gnulib:
--- a/lib/lseek.c
+++ b/lib/lseek.c
@@ -20,9 +20,13 @@
 /* Specification.  */
 #include <unistd.h>
 
-/* Get GetFileType.  The replacement lseek is only used on mingw, so
-   this include can be unconditional.  */
-#include <windows.h>
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Windows platforms.  */
+/* Get GetFileType.  */
+# include <windows.h>
+#else
+# include <sys/stat.h>
+#endif
 #include <errno.h>
 
 #undef lseek
@@ -30,6 +34,7 @@
 off_t
 rpl_lseek (int fd, off_t offset, int whence)
 {
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
   /* mingw lseek mistakenly succeeds on pipes, sockets, and terminals.  */
   HANDLE h = (HANDLE) _get_osfhandle (fd);
   if (h == INVALID_HANDLE_VALUE)
@@ -42,5 +47,16 @@
       errno = ESPIPE;
       return -1;
     }
+#else
+  /* BeOS lseek mistakenly succeeds on pipes...  */
+  struct stat statbuf;
+  if (fstat (fd, &statbuf) < 0)
+    return -1;
+  if (!S_ISREG (statbuf.st_mode))
+    {
+      errno = ESPIPE;
+      return -1;
+    }
+#endif
   return lseek (fd, offset, whence);
 }
--- a/m4/lseek.m4
+++ b/m4/lseek.m4
@@ -1,4 +1,4 @@
-# lseek.m4 serial 3
+# lseek.m4 serial 4
 dnl Copyright (C) 2007 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -29,8 +29,8 @@
 	 [gl_cv_func_lseek_pipe=no])
      else
        AC_COMPILE_IFELSE([
-#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
-/* mingw mistakenly returns 0 when trying to seek on pipes.  */
+#if ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) || defined __BEOS__
+/* mingw and BeOS mistakenly return 0 when trying to seek on pipes.  */
   Choke me.
 #endif],
 	 [gl_cv_func_lseek_pipe=yes], [gl_cv_func_lseek_pipe=no])