Tests for module 'unicase/u16-is-uppercase'.
[gnulib.git] / lib / lseek.c
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);
 }