aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorJanne Blomqvist <jb@gcc.gnu.org>2011-06-11 13:19:49 +0300
committerJanne Blomqvist <jb@gcc.gnu.org>2011-06-11 13:19:49 +0300
commit5ea0705af7ff3e31d669808cc1c39b673b7122f8 (patch)
treef8dc4399ed8813242826269d056cc2f2039b1304 /libgfortran
parentba94c7af45cf628c815208b4a961138ef279fe1a (diff)
downloadgcc-5ea0705af7ff3e31d669808cc1c39b673b7122f8.zip
gcc-5ea0705af7ff3e31d669808cc1c39b673b7122f8.tar.gz
gcc-5ea0705af7ff3e31d669808cc1c39b673b7122f8.tar.bz2
Figure out whether a file is seekable with lseek()
From-SVN: r174946
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog5
-rw-r--r--libgfortran/io/unix.c12
2 files changed, 11 insertions, 6 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index bcd62f5..d54878b 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -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,
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index c257766..e3ae607 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -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