Figure out whether a file is seekable with lseek()
authorJanne Blomqvist <jb@gcc.gnu.org>
Sat, 11 Jun 2011 10:19:49 +0000 (13:19 +0300)
committerJanne Blomqvist <jb@gcc.gnu.org>
Sat, 11 Jun 2011 10:19:49 +0000 (13:19 +0300)
From-SVN: r174946

libgfortran/ChangeLog
libgfortran/io/unix.c

index bcd62f52c320773fbae9725a466a37eb373014c7..d54878b189fb59a7d6328f353c813b6ac5fad63e 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-11  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       * io/unix.c (fd_to_stream): Figure out if a fd is seekable by
+       trying lseek().
+
 2011-06-10  Daniel Carrera  <dcarrera@gmail.com>
 
        * caf/mpi.c (_gfortran_caf_sync_all,
index c257766d653db4bb5d323ca86709b3f1a5f65f49..e3ae607229031f843bbaa23e476b4aa4e0b6b37a 100644 (file)
@@ -952,15 +952,15 @@ fd_to_stream (int fd)
 
   if (S_ISREG (statbuf.st_mode))
     s->file_length = statbuf.st_size;
-  else if (S_ISBLK (statbuf.st_mode))
+  else
     {
-      /* Hopefully more portable than ioctl(fd, BLKGETSIZE64, &size)?  */
-      gfc_offset cur = lseek (fd, 0, SEEK_CUR);
+      /* Some character special files are seekable but most are not,
+        so figure it out by trying to seek.  On Linux, /dev/null is
+        an example of such a special file.  */
       s->file_length = lseek (fd, 0, SEEK_END);
-      lseek (fd, cur, SEEK_SET);
+      if (s->file_length > 0)
+       lseek (fd, 0, SEEK_SET);
     }
-  else
-    s->file_length = -1;
 
   if (!(S_ISREG (statbuf.st_mode) || S_ISBLK (statbuf.st_mode))
       || options.all_unbuffered