diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 9252a90f46d..25581552e5e 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,14 @@ +2010-07-28 Jerry DeLisle + + PR libfortran/44931 + * io/inquire.c (inquire_via_unit): Use ttyname to return actual device + file name for stdin, stdout, and stderr. If ttyname does not succeed + fall back to default names for these units. Include string.h to allow + using strlen function. + * unix.c: Remove typedef of unix_stream structure, move to unix.h. + * unix.h: Add typedef of unix_stream structure so that it is + accessible to inquire.c. + 2010-07-19 Jerry DeLisle PR libfortran/44953 diff --git a/libgfortran/io/inquire.c b/libgfortran/io/inquire.c index f908cde0ccf..1189c544b35 100644 --- a/libgfortran/io/inquire.c +++ b/libgfortran/io/inquire.c @@ -26,6 +26,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see /* Implement the non-IOLENGTH variant of the INQUIRY statement */ +#include #include "io.h" #include "unix.h" @@ -66,7 +67,25 @@ inquire_via_unit (st_parameter_inquire *iqp, gfc_unit * u) if ((cf & IOPARM_INQUIRE_HAS_NAME) != 0 && u != NULL && u->flags.status != STATUS_SCRATCH) - fstrcpy (iqp->name, iqp->name_len, u->file, u->file_len); + { +#ifdef HAVE_TTYNAME + if (u->unit_number == options.stdin_unit + || u->unit_number == options.stdout_unit + || u->unit_number == options.stderr_unit) + { + char * tmp = ttyname (((unix_stream *) u->s)->fd); + if (tmp != NULL) + { + int tmplen = strlen (tmp); + fstrcpy (iqp->name, iqp->name_len, tmp, tmplen); + } + else /* If ttyname does not work, go with the default. */ + fstrcpy (iqp->name, iqp->name_len, u->file, u->file_len); + } + else +#endif + fstrcpy (iqp->name, iqp->name_len, u->file, u->file_len); + } if ((cf & IOPARM_INQUIRE_HAS_ACCESS) != 0) { diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index 3a795aef536..eea03ba7f81 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -135,28 +135,6 @@ typedef struct stat gfstat_t; static const int BUFFER_SIZE = 8192; -typedef struct -{ - stream st; - - gfc_offset buffer_offset; /* File offset of the start of the buffer */ - gfc_offset physical_offset; /* Current physical file offset */ - gfc_offset logical_offset; /* Current logical file offset */ - gfc_offset file_length; /* Length of the file, -1 if not seekable. */ - - char *buffer; /* Pointer to the buffer. */ - int fd; /* The POSIX file descriptor. */ - - int active; /* Length of valid bytes in the buffer */ - - int prot; - int ndirty; /* Dirty bytes starting at buffer_offset */ - - int special_file; /* =1 if the fd refers to a special file */ -} -unix_stream; - - /* fix_fd()-- Given a file descriptor, make sure it is not one of the * standard descriptors, returning a non-standard descriptor. If the * user specifies that system errors should go to standard output, diff --git a/libgfortran/io/unix.h b/libgfortran/io/unix.h index 3229d502547..dc433d75a8a 100644 --- a/libgfortran/io/unix.h +++ b/libgfortran/io/unix.h @@ -41,6 +41,29 @@ struct stream int (*close) (struct stream *); }; + +typedef struct +{ + stream st; + + gfc_offset buffer_offset; /* File offset of the start of the buffer */ + gfc_offset physical_offset; /* Current physical file offset */ + gfc_offset logical_offset; /* Current logical file offset */ + gfc_offset file_length; /* Length of the file, -1 if not seekable. */ + + char *buffer; /* Pointer to the buffer. */ + int fd; /* The POSIX file descriptor. */ + + int active; /* Length of valid bytes in the buffer */ + + int prot; + int ndirty; /* Dirty bytes starting at buffer_offset */ + + int special_file; /* =1 if the fd refers to a special file */ +} +unix_stream; + + /* Inline functions for doing file I/O given a stream. */ static inline ssize_t sread (stream * s, void * buf, ssize_t nbyte)