Hi, I'd like to revert the fix for PR 45723 that was committed previously for the following reasons:
- Using stat("/path/to/file", ...) to infer something about an open file descriptor is racy. - As I argued in http://gcc.gnu.org/ml/fortran/2011-10/msg00133.html , I think the best approach is to do what the calling program asks as to do, and then return failure if that doesn't work rather than trying to fix stuff up in the library. - In the meantime, other changes to the library have caused whatever issue originally was behind the bug report to disappear [1]. Even so, I'd like to remove the testcase, because I can't find any text in POSIX which says that lseek(fd, 0, SEEK_END) for /dev/null must work, and IMHO it's not the task of libgfortran to impose the current Linux behavior on other systems. [1] I haven't checked, but I recall that at some point we tried to use buffered IO for more or less everything except terminals, and assumed that all special files were non-seekable. Then in the buffered IO path we returned an error if a seek on a buffered special file was attempted. Now, however, we use buffered IO only for regular files, for special files we do straight IO syscalls. Regtested on x86_64-unknown-linux-gnu, Ok for trunk? 2011-10-31 Janne Blomqvist <j...@gcc.gnu.org> PR libfortran/45723 * io/open.c (new_unit): Don't check file size before attempting seek. testsuite ChangeLog 2011-10-31 Janne Blomqvist <j...@gcc.gnu.org> PR libfortran/45723 * gfortran.dg/open_dev_null.F90: Remove testcase. diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c index 0102b9c..8f969ed 100644 --- a/libgfortran/io/open.c +++ b/libgfortran/io/open.c @@ -554,7 +554,7 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags) if (flags->position == POSITION_APPEND) { - if (file_size (opp->file, opp->file_len) > 0 && sseek (u->s, 0, SEEK_END) < 0) + if (sseek (u->s, 0, SEEK_END) < 0) generate_error (&opp->common, LIBERROR_OS, NULL); u->endfile = AT_ENDFILE; } -- Janne Blomqvist