aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <Thomas.Koenig@online.de>2005-07-12 19:52:19 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2005-07-12 19:52:19 +0000
commit5133e4b923b5648cc7fc2f27bb03f02855dbbe94 (patch)
treeda374bb9ec1399b596949ba90944c887ee748ce6
parent04be5ce5ec84b1dab39372f89d59888988a3195e (diff)
downloadgcc-5133e4b923b5648cc7fc2f27bb03f02855dbbe94.zip
gcc-5133e4b923b5648cc7fc2f27bb03f02855dbbe94.tar.gz
gcc-5133e4b923b5648cc7fc2f27bb03f02855dbbe94.tar.bz2
io/unix.c: Add member special_file to type unix_stream.
2005-07-12 Thomas Koenig <Thomas.Koenig@online.de> 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 <Thomas.Koenig@online.de> gfortran.dg/dev_null.f90: Remove targets. From-SVN: r101937
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gfortran.dg/dev_null.f902
-rw-r--r--libgfortran/ChangeLog7
-rw-r--r--libgfortran/io/unix.c12
4 files changed, 20 insertions, 5 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 914f9a5..8cead7d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2005-07-11 Thomas Koenig <Thomas.Koenig@online.de>
+
+ gfortran.dg/dev_null.f90: Remove targets.
+
2005-07-12 Andrew Pinski <pinskia@physics.uc.edu>
PR tree-opt/22335
diff --git a/gcc/testsuite/gfortran.dg/dev_null.f90 b/gcc/testsuite/gfortran.dg/dev_null.f90
index f9703bc..c8db001 100644
--- a/gcc/testsuite/gfortran.dg/dev_null.f90
+++ b/gcc/testsuite/gfortran.dg/dev_null.f90
@@ -1,4 +1,4 @@
-! { dg-do run { target *-*-linux* *-*-solaris* } }
+! { dg-do run }
! This test currently only runs on systems where using ftruncate on
! /dev/null fails (errno set to EINVAL). See PR 21593 for details.
!
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 28ee7dc..e96c422 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,10 @@
+2005-07-12 Thomas Koenig <Thomas.Koenig@online.de>
+
+ 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-11 David Edelsohn <edelsohn@gnu.org>
PR libgfortran/22412
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)