From 5133e4b923b5648cc7fc2f27bb03f02855dbbe94 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Tue, 12 Jul 2005 19:52:19 +0000 Subject: io/unix.c: Add member special_file to type unix_stream. 2005-07-12 Thomas Koenig io/unix.c: Add member special_file to type unix_stream. (fd_truncate): Don't call ftruncate or chsize if s refers to a special file. (fd_to_stream): initialize s->special_file. 2005-07-12 Thomas Koenig gfortran.dg/dev_null.f90: Remove targets. From-SVN: r101937 --- libgfortran/io/unix.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'libgfortran/io/unix.c') diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index 1158458..b35182d 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -138,6 +138,8 @@ typedef struct int prot; int ndirty; /* Dirty bytes starting at dirty_offset */ + int special_file; /* =1 if the fd refers to a special file */ + unsigned unbuffered:1, mmaped:1; char small_buffer[BUFFER_SIZE]; @@ -509,13 +511,14 @@ fd_truncate (unix_stream * s) return FAILURE; /* non-seekable files, like terminals and fifo's fail the lseek. - the fd is a regular file at this point */ - + Using ftruncate on a seekable special file (like /dev/null) + is undefined, so we treat it as if the ftruncate failed. + */ #ifdef HAVE_FTRUNCATE - if (ftruncate (s->fd, s->logical_offset)) + if (s->special_file || ftruncate (s->fd, s->logical_offset)) #else #ifdef HAVE_CHSIZE - if (chsize (s->fd, s->logical_offset)) + if (s->special_file || chsize (s->fd, s->logical_offset)) #endif #endif { @@ -915,6 +918,7 @@ fd_to_stream (int fd, int prot, int avoid_mmap) fstat (fd, &statbuf); s->file_length = S_ISREG (statbuf.st_mode) ? statbuf.st_size : -1; + s->special_file = !S_ISREG (statbuf.st_mode); #if HAVE_MMAP if (avoid_mmap) -- cgit v1.1