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 4d7c0dc1ff5166dc974da8e7742e0093cccf1057..d863bebb6bde8b1ba5591bf0b17d2f3291ac043d 100644 (file)
--- 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.
index e39ad01a76cb169f835145a70c17afb76c2e2a89..1f214d18c42b515b82f905ebc81f3db8c3c0c3ae 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 03830a9acdf9cbf9a4e3353ec06ecf51a4c960a6..db8dbfb3e96392d4e194870959b29e1e61efeedf 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 69e9ea755c1952395b4e5fa58b3ab77232fe41b0..f336990709c2636072aacfd763a764da1d12db4a 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])