On BSD implementations, when we call lseek(), we must also update or disable
[pspp] / lib / fseeko.c
index de44802b6f726efc02033f49e9359d6334b70535..e7a7f74952fd1542fa64022e280f9af2cc4d0368 100644 (file)
@@ -66,7 +66,24 @@ rpl_fseeko (FILE *fp, off_t offset, int whence)
 #else
   #error "Please port gnulib fseeko.c to your platform! Look at the code in fpurge.c, then report this to bug-gnulib."
 #endif
-    return (lseek (fileno (fp), offset, whence) == (off_t)(-1) ? -1 : 0);
+    {
+      off_t pos = lseek (fileno (fp), offset, whence);
+      if (pos == -1)
+       {
+#if defined __sferror               /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
+         fp->_flags &= ~__SOFF;
+#endif
+         return -1;
+       }
+      else
+       {
+#if defined __sferror               /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
+         fp->_offset = pos;
+         fp->_flags |= __SOFF;
+#endif
+         return 0;
+       }
+    }
   else
     return fseeko (fp, offset, whence);
 }