OSDN Git Service

Figure out whether a file is seekable with lseek()
authorjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 11 Jun 2011 10:19:49 +0000 (10:19 +0000)
committerjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 11 Jun 2011 10:19:49 +0000 (10:19 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174946 138bc75d-0d04-0410-961f-82ee72b054a4

libgfortran/ChangeLog
libgfortran/io/unix.c

index bcd62f5..d54878b 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 c257766..e3ae607 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