Work around lseek bug on BeOS.
authorBruno Haible <bruno@clisp.org>
Sun, 19 Aug 2007 09:08:05 +0000 (09:08 +0000)
committerBruno Haible <bruno@clisp.org>
Sun, 19 Aug 2007 09:08:05 +0000 (09:08 +0000)
ChangeLog
doc/functions/lseek.texi
lib/lseek.c
m4/lseek.m4

index 4d7c0dc..d863beb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,13 @@
 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.
        * tests/test-fstrcmp.c: New file.
index e39ad01..1f214d1 100644 (file)
@@ -9,7 +9,7 @@ Gnulib module: lseek
 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:
index 03830a9..db8dbfb 100644 (file)
 /* 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 @@ rpl_lseek (int fd, off_t offset, int whence)
       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);
 }
index 69e9ea7..f336990 100644 (file)
@@ -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 @@ int main ()
         [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])