1 /* Copyright (C) 2002-2017 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
3 F2003 I/O support contributed by Jerry DeLisle
5 This file is part of the GNU Fortran runtime library (libgfortran).
7 Libgfortran is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 Libgfortran is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 Under Section 7 of GPL version 3, you are granted additional
18 permissions described in the GCC Runtime Library Exception, version
19 3.1, as published by the Free Software Foundation.
21 You should have received a copy of the GNU General Public License and
22 a copy of the GCC Runtime Library Exception along with this program;
23 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 <http://www.gnu.org/licenses/>. */
26 /* Unix stream I/O module */
43 /* For mingw, we don't identify files by their inode number, but by a
44 64-bit identifier created from a BY_HANDLE_FILE_INFORMATION. */
47 #define WIN32_LEAN_AND_MEAN
50 #if !defined(_FILE_OFFSET_BITS) || _FILE_OFFSET_BITS != 64
52 #define lseek _lseeki64
54 #define fstat _fstati64
59 #ifndef HAVE_WORKING_STAT
61 id_from_handle (HANDLE hFile
)
63 BY_HANDLE_FILE_INFORMATION FileInformation
;
65 if (hFile
== INVALID_HANDLE_VALUE
)
68 memset (&FileInformation
, 0, sizeof(FileInformation
));
69 if (!GetFileInformationByHandle (hFile
, &FileInformation
))
72 return ((uint64_t) FileInformation
.nFileIndexLow
)
73 | (((uint64_t) FileInformation
.nFileIndexHigh
) << 32);
78 id_from_path (const char *path
)
83 if (!path
|| !*path
|| access (path
, F_OK
))
86 hFile
= CreateFile (path
, 0, 0, NULL
, OPEN_EXISTING
,
87 FILE_FLAG_BACKUP_SEMANTICS
| FILE_ATTRIBUTE_READONLY
,
89 res
= id_from_handle (hFile
);
96 id_from_fd (const int fd
)
98 return id_from_handle ((HANDLE
) _get_osfhandle (fd
));
101 #endif /* HAVE_WORKING_STAT */
104 /* On mingw, we don't use umask in tempfile_open(), because it
105 doesn't support the user/group/other-based permissions. */
108 #endif /* __MINGW32__ */
111 /* These flags aren't defined on all targets (mingw32), so provide them
144 /* Fallback implementation of access() on systems that don't have it.
145 Only modes R_OK, W_OK and F_OK are used in this file. */
148 fallback_access (const char *path
, int mode
)
152 if ((mode
& R_OK
) && (fd
= open (path
, O_RDONLY
)) < 0)
156 if ((mode
& W_OK
) && (fd
= open (path
, O_WRONLY
)) < 0)
163 return stat (path
, &st
);
170 #define access fallback_access
174 /* Fallback directory for creating temporary files. P_tmpdir is
175 defined on many POSIX platforms. */
178 #define P_tmpdir _P_tmpdir /* MinGW */
180 #define P_tmpdir "/tmp"
185 /* Unix and internal stream I/O module */
187 static const int BUFFER_SIZE
= 8192;
193 gfc_offset buffer_offset
; /* File offset of the start of the buffer */
194 gfc_offset physical_offset
; /* Current physical file offset */
195 gfc_offset logical_offset
; /* Current logical file offset */
196 gfc_offset file_length
; /* Length of the file. */
198 char *buffer
; /* Pointer to the buffer. */
199 int fd
; /* The POSIX file descriptor. */
201 int active
; /* Length of valid bytes in the buffer */
203 int ndirty
; /* Dirty bytes starting at buffer_offset */
205 /* Cached stat(2) values. */
209 bool unbuffered
; /* Buffer should be flushed after each I/O statement. */
214 /* fix_fd()-- Given a file descriptor, make sure it is not one of the
215 standard descriptors, returning a non-standard descriptor. If the
216 user specifies that system errors should go to standard output,
217 then closes standard output, we don't want the system errors to a
218 file that has been given file descriptor 1 or 0. We want to send
219 the error to the invalid descriptor. */
225 int input
, output
, error
;
227 input
= output
= error
= 0;
229 /* Unix allocates the lowest descriptors first, so a loop is not
230 required, but this order is. */
231 if (fd
== STDIN_FILENO
)
236 if (fd
== STDOUT_FILENO
)
241 if (fd
== STDERR_FILENO
)
248 close (STDIN_FILENO
);
250 close (STDOUT_FILENO
);
252 close (STDERR_FILENO
);
259 /* If the stream corresponds to a preconnected unit, we flush the
260 corresponding C stream. This is bugware for mixed C-Fortran codes
261 where the C code doesn't flush I/O before returning. */
263 flush_if_preconnected (stream
*s
)
267 fd
= ((unix_stream
*) s
)->fd
;
268 if (fd
== STDIN_FILENO
)
270 else if (fd
== STDOUT_FILENO
)
272 else if (fd
== STDERR_FILENO
)
277 /********************************************************************
278 Raw I/O functions (read, write, seek, tell, truncate, close).
280 These functions wrap the basic POSIX I/O syscalls. Any deviation in
281 semantics is a bug, except the following: write restarts in case
282 of being interrupted by a signal, and as the first argument the
283 functions take the unix_stream struct rather than an integer file
284 descriptor. Also, for POSIX read() and write() a nbyte argument larger
285 than SSIZE_MAX is undefined; here the type of nbyte is ssize_t rather
286 than size_t as for POSIX read/write.
287 *********************************************************************/
290 raw_flush (unix_stream
*s
__attribute__ ((unused
)))
296 raw_read (unix_stream
*s
, void *buf
, ssize_t nbyte
)
298 /* For read we can't do I/O in a loop like raw_write does, because
299 that will break applications that wait for interactive I/O. We
300 still can loop around EINTR, though. */
303 ssize_t trans
= read (s
->fd
, buf
, nbyte
);
304 if (trans
== -1 && errno
== EINTR
)
311 raw_write (unix_stream
*s
, const void *buf
, ssize_t nbyte
)
313 ssize_t trans
, bytes_left
;
317 buf_st
= (char *) buf
;
319 /* We must write in a loop since some systems don't restart system
320 calls in case of a signal. */
321 while (bytes_left
> 0)
323 trans
= write (s
->fd
, buf_st
, bytes_left
);
335 return nbyte
- bytes_left
;
339 raw_seek (unix_stream
*s
, gfc_offset offset
, int whence
)
343 gfc_offset off
= lseek (s
->fd
, offset
, whence
);
344 if (off
== (gfc_offset
) -1 && errno
== EINTR
)
351 raw_tell (unix_stream
*s
)
355 gfc_offset off
= lseek (s
->fd
, 0, SEEK_CUR
);
356 if (off
== (gfc_offset
) -1 && errno
== EINTR
)
363 raw_size (unix_stream
*s
)
366 if (TEMP_FAILURE_RETRY (fstat (s
->fd
, &statbuf
)) == -1)
368 if (S_ISREG (statbuf
.st_mode
))
369 return statbuf
.st_size
;
375 raw_truncate (unix_stream
*s
, gfc_offset length
)
386 h
= (HANDLE
) _get_osfhandle (s
->fd
);
387 if (h
== INVALID_HANDLE_VALUE
)
392 cur
= lseek (s
->fd
, 0, SEEK_CUR
);
395 if (lseek (s
->fd
, length
, SEEK_SET
) == -1)
397 if (!SetEndOfFile (h
))
402 if (lseek (s
->fd
, cur
, SEEK_SET
) == -1)
406 lseek (s
->fd
, cur
, SEEK_SET
);
408 #elif defined HAVE_FTRUNCATE
409 if (TEMP_FAILURE_RETRY (ftruncate (s
->fd
, length
)) == -1)
412 #elif defined HAVE_CHSIZE
413 return chsize (s
->fd
, length
);
415 runtime_error ("required ftruncate or chsize support not present");
421 raw_close (unix_stream
*s
)
427 else if (s
->fd
!= STDOUT_FILENO
428 && s
->fd
!= STDERR_FILENO
429 && s
->fd
!= STDIN_FILENO
)
431 retval
= close (s
->fd
);
432 /* close() and EINTR is special, as the file descriptor is
433 deallocated before doing anything that might cause the
434 operation to be interrupted. Thus if we get EINTR the best we
435 can do is ignore it and continue (otherwise if we try again
436 the file descriptor may have been allocated again to some
438 if (retval
== -1 && errno
== EINTR
)
448 raw_markeor (unix_stream
*s
__attribute__ ((unused
)))
453 static const struct stream_vtable raw_vtable
= {
454 .read
= (void *) raw_read
,
455 .write
= (void *) raw_write
,
456 .seek
= (void *) raw_seek
,
457 .tell
= (void *) raw_tell
,
458 .size
= (void *) raw_size
,
459 .trunc
= (void *) raw_truncate
,
460 .close
= (void *) raw_close
,
461 .flush
= (void *) raw_flush
,
462 .markeor
= (void *) raw_markeor
466 raw_init (unix_stream
*s
)
468 s
->st
.vptr
= &raw_vtable
;
475 /*********************************************************************
476 Buffered I/O functions. These functions have the same semantics as the
477 raw I/O functions above, except that they are buffered in order to
478 improve performance. The buffer must be flushed when switching from
479 reading to writing and vice versa.
480 *********************************************************************/
483 buf_flush (unix_stream
*s
)
487 /* Flushing in read mode means discarding read bytes. */
493 if (s
->physical_offset
!= s
->buffer_offset
494 && raw_seek (s
, s
->buffer_offset
, SEEK_SET
) < 0)
497 writelen
= raw_write (s
, s
->buffer
, s
->ndirty
);
499 s
->physical_offset
= s
->buffer_offset
+ writelen
;
501 if (s
->physical_offset
> s
->file_length
)
502 s
->file_length
= s
->physical_offset
;
504 s
->ndirty
-= writelen
;
512 buf_read (unix_stream
*s
, void *buf
, ssize_t nbyte
)
515 s
->buffer_offset
= s
->logical_offset
;
517 /* Is the data we want in the buffer? */
518 if (s
->logical_offset
+ nbyte
<= s
->buffer_offset
+ s
->active
519 && s
->buffer_offset
<= s
->logical_offset
)
521 /* When nbyte == 0, buf can be NULL which would lead to undefined
522 behavior if we called memcpy(). */
524 memcpy (buf
, s
->buffer
+ (s
->logical_offset
- s
->buffer_offset
),
529 /* First copy the active bytes if applicable, then read the rest
530 either directly or filling the buffer. */
533 ssize_t to_read
, did_read
;
534 gfc_offset new_logical
;
537 if (s
->logical_offset
>= s
->buffer_offset
538 && s
->buffer_offset
+ s
->active
>= s
->logical_offset
)
540 nread
= s
->active
- (s
->logical_offset
- s
->buffer_offset
);
541 memcpy (buf
, s
->buffer
+ (s
->logical_offset
- s
->buffer_offset
),
545 /* At this point we consider all bytes in the buffer discarded. */
546 to_read
= nbyte
- nread
;
547 new_logical
= s
->logical_offset
+ nread
;
548 if (s
->physical_offset
!= new_logical
549 && raw_seek (s
, new_logical
, SEEK_SET
) < 0)
551 s
->buffer_offset
= s
->physical_offset
= new_logical
;
552 if (to_read
<= BUFFER_SIZE
/2)
554 did_read
= raw_read (s
, s
->buffer
, BUFFER_SIZE
);
555 if (likely (did_read
>= 0))
557 s
->physical_offset
+= did_read
;
558 s
->active
= did_read
;
559 did_read
= (did_read
> to_read
) ? to_read
: did_read
;
560 memcpy (p
, s
->buffer
, did_read
);
567 did_read
= raw_read (s
, p
, to_read
);
568 if (likely (did_read
>= 0))
570 s
->physical_offset
+= did_read
;
576 nbyte
= did_read
+ nread
;
578 s
->logical_offset
+= nbyte
;
583 buf_write (unix_stream
*s
, const void *buf
, ssize_t nbyte
)
589 s
->buffer_offset
= s
->logical_offset
;
591 /* Does the data fit into the buffer? As a special case, if the
592 buffer is empty and the request is bigger than BUFFER_SIZE/2,
593 write directly. This avoids the case where the buffer would have
594 to be flushed at every write. */
595 if (!(s
->ndirty
== 0 && nbyte
> BUFFER_SIZE
/2)
596 && s
->logical_offset
+ nbyte
<= s
->buffer_offset
+ BUFFER_SIZE
597 && s
->buffer_offset
<= s
->logical_offset
598 && s
->buffer_offset
+ s
->ndirty
>= s
->logical_offset
)
600 memcpy (s
->buffer
+ (s
->logical_offset
- s
->buffer_offset
), buf
, nbyte
);
601 int nd
= (s
->logical_offset
- s
->buffer_offset
) + nbyte
;
607 /* Flush, and either fill the buffer with the new data, or if
608 the request is bigger than the buffer size, write directly
609 bypassing the buffer. */
611 if (nbyte
<= BUFFER_SIZE
/2)
613 memcpy (s
->buffer
, buf
, nbyte
);
614 s
->buffer_offset
= s
->logical_offset
;
619 if (s
->physical_offset
!= s
->logical_offset
)
621 if (raw_seek (s
, s
->logical_offset
, SEEK_SET
) < 0)
623 s
->physical_offset
= s
->logical_offset
;
626 nbyte
= raw_write (s
, buf
, nbyte
);
627 s
->physical_offset
+= nbyte
;
630 s
->logical_offset
+= nbyte
;
631 if (s
->logical_offset
> s
->file_length
)
632 s
->file_length
= s
->logical_offset
;
637 /* "Unbuffered" really means I/O statement buffering. For formatted
638 I/O, the fbuf manages this, and then uses raw I/O. For unformatted
639 I/O, buffered I/O is used, and the buffer is flushed at the end of
640 each I/O statement, where this function is called. Alternatively,
641 the buffer is flushed at the end of the record if the buffer is
642 more than half full; this prevents needless seeking back and forth
643 when writing sequential unformatted. */
646 buf_markeor (unix_stream
*s
)
648 if (s
->unbuffered
|| s
->ndirty
>= BUFFER_SIZE
/ 2)
649 return buf_flush (s
);
654 buf_seek (unix_stream
*s
, gfc_offset offset
, int whence
)
661 offset
+= s
->logical_offset
;
664 offset
+= s
->file_length
;
674 s
->logical_offset
= offset
;
679 buf_tell (unix_stream
*s
)
681 return buf_seek (s
, 0, SEEK_CUR
);
685 buf_size (unix_stream
*s
)
687 return s
->file_length
;
691 buf_truncate (unix_stream
*s
, gfc_offset length
)
695 if (buf_flush (s
) != 0)
697 r
= raw_truncate (s
, length
);
699 s
->file_length
= length
;
704 buf_close (unix_stream
*s
)
706 if (buf_flush (s
) != 0)
709 return raw_close (s
);
712 static const struct stream_vtable buf_vtable
= {
713 .read
= (void *) buf_read
,
714 .write
= (void *) buf_write
,
715 .seek
= (void *) buf_seek
,
716 .tell
= (void *) buf_tell
,
717 .size
= (void *) buf_size
,
718 .trunc
= (void *) buf_truncate
,
719 .close
= (void *) buf_close
,
720 .flush
= (void *) buf_flush
,
721 .markeor
= (void *) buf_markeor
725 buf_init (unix_stream
*s
)
727 s
->st
.vptr
= &buf_vtable
;
729 s
->buffer
= xmalloc (BUFFER_SIZE
);
734 /*********************************************************************
735 memory stream functions - These are used for internal files
737 The idea here is that a single stream structure is created and all
738 requests must be satisfied from it. The location and size of the
739 buffer is the character variable supplied to the READ or WRITE
742 *********************************************************************/
745 mem_alloc_r (stream
*strm
, int *len
)
747 unix_stream
*s
= (unix_stream
*) strm
;
749 gfc_offset where
= s
->logical_offset
;
751 if (where
< s
->buffer_offset
|| where
> s
->buffer_offset
+ s
->active
)
754 n
= s
->buffer_offset
+ s
->active
- where
;
758 s
->logical_offset
= where
+ *len
;
760 return s
->buffer
+ (where
- s
->buffer_offset
);
765 mem_alloc_r4 (stream
*strm
, int *len
)
767 unix_stream
*s
= (unix_stream
*) strm
;
769 gfc_offset where
= s
->logical_offset
;
771 if (where
< s
->buffer_offset
|| where
> s
->buffer_offset
+ s
->active
)
774 n
= s
->buffer_offset
+ s
->active
- where
;
778 s
->logical_offset
= where
+ *len
;
780 return s
->buffer
+ (where
- s
->buffer_offset
) * 4;
785 mem_alloc_w (stream
*strm
, int *len
)
787 unix_stream
*s
= (unix_stream
*)strm
;
789 gfc_offset where
= s
->logical_offset
;
793 if (where
< s
->buffer_offset
)
796 if (m
> s
->file_length
)
799 s
->logical_offset
= m
;
801 return s
->buffer
+ (where
- s
->buffer_offset
);
806 mem_alloc_w4 (stream
*strm
, int *len
)
808 unix_stream
*s
= (unix_stream
*)strm
;
810 gfc_offset where
= s
->logical_offset
;
811 gfc_char4_t
*result
= (gfc_char4_t
*) s
->buffer
;
815 if (where
< s
->buffer_offset
)
818 if (m
> s
->file_length
)
821 s
->logical_offset
= m
;
822 return &result
[where
- s
->buffer_offset
];
826 /* Stream read function for character(kind=1) internal units. */
829 mem_read (stream
*s
, void *buf
, ssize_t nbytes
)
834 p
= mem_alloc_r (s
, &nb
);
845 /* Stream read function for chracter(kind=4) internal units. */
848 mem_read4 (stream
*s
, void *buf
, ssize_t nbytes
)
853 p
= mem_alloc_r4 (s
, &nb
);
856 memcpy (buf
, p
, nb
* 4);
864 /* Stream write function for character(kind=1) internal units. */
867 mem_write (stream
*s
, const void *buf
, ssize_t nbytes
)
872 p
= mem_alloc_w (s
, &nb
);
883 /* Stream write function for character(kind=4) internal units. */
886 mem_write4 (stream
*s
, const void *buf
, ssize_t nwords
)
891 p
= mem_alloc_w4 (s
, &nw
);
895 *p
++ = (gfc_char4_t
) *((char *) buf
);
904 mem_seek (stream
*strm
, gfc_offset offset
, int whence
)
906 unix_stream
*s
= (unix_stream
*)strm
;
912 offset
+= s
->logical_offset
;
915 offset
+= s
->file_length
;
921 /* Note that for internal array I/O it's actually possible to have a
922 negative offset, so don't check for that. */
923 if (offset
> s
->file_length
)
929 s
->logical_offset
= offset
;
931 /* Returning < 0 is the error indicator for sseek(), so return 0 if
932 offset is negative. Thus if the return value is 0, the caller
933 has to use stell() to get the real value of logical_offset. */
943 return ((unix_stream
*)s
)->logical_offset
;
948 mem_truncate (unix_stream
*s
__attribute__ ((unused
)),
949 gfc_offset length
__attribute__ ((unused
)))
956 mem_flush (unix_stream
*s
__attribute__ ((unused
)))
963 mem_close (unix_stream
*s
)
970 static const struct stream_vtable mem_vtable
= {
971 .read
= (void *) mem_read
,
972 .write
= (void *) mem_write
,
973 .seek
= (void *) mem_seek
,
974 .tell
= (void *) mem_tell
,
975 /* buf_size is not a typo, we just reuse an identical
977 .size
= (void *) buf_size
,
978 .trunc
= (void *) mem_truncate
,
979 .close
= (void *) mem_close
,
980 .flush
= (void *) mem_flush
,
981 .markeor
= (void *) raw_markeor
984 static const struct stream_vtable mem4_vtable
= {
985 .read
= (void *) mem_read4
,
986 .write
= (void *) mem_write4
,
987 .seek
= (void *) mem_seek
,
988 .tell
= (void *) mem_tell
,
989 /* buf_size is not a typo, we just reuse an identical
991 .size
= (void *) buf_size
,
992 .trunc
= (void *) mem_truncate
,
993 .close
= (void *) mem_close
,
994 .flush
= (void *) mem_flush
,
995 .markeor
= (void *) raw_markeor
998 /*********************************************************************
999 Public functions -- A reimplementation of this module needs to
1000 define functional equivalents of the following.
1001 *********************************************************************/
1003 /* open_internal()-- Returns a stream structure from a character(kind=1)
1007 open_internal (char *base
, int length
, gfc_offset offset
)
1011 s
= xcalloc (1, sizeof (unix_stream
));
1014 s
->buffer_offset
= offset
;
1016 s
->active
= s
->file_length
= length
;
1018 s
->st
.vptr
= &mem_vtable
;
1020 return (stream
*) s
;
1023 /* open_internal4()-- Returns a stream structure from a character(kind=4)
1027 open_internal4 (char *base
, int length
, gfc_offset offset
)
1031 s
= xcalloc (1, sizeof (unix_stream
));
1034 s
->buffer_offset
= offset
;
1036 s
->active
= s
->file_length
= length
* sizeof (gfc_char4_t
);
1038 s
->st
.vptr
= &mem4_vtable
;
1044 /* fd_to_stream()-- Given an open file descriptor, build a stream
1048 fd_to_stream (int fd
, bool unformatted
)
1050 struct stat statbuf
;
1053 s
= xcalloc (1, sizeof (unix_stream
));
1057 /* Get the current length of the file. */
1059 if (TEMP_FAILURE_RETRY (fstat (fd
, &statbuf
)) == -1)
1061 s
->st_dev
= s
->st_ino
= -1;
1066 return (stream
*) s
;
1069 s
->st_dev
= statbuf
.st_dev
;
1070 s
->st_ino
= statbuf
.st_ino
;
1071 s
->file_length
= statbuf
.st_size
;
1073 /* Only use buffered IO for regular files. */
1074 if (S_ISREG (statbuf
.st_mode
)
1075 && !options
.all_unbuffered
1076 && !(options
.unbuffered_preconnected
&&
1077 (s
->fd
== STDIN_FILENO
1078 || s
->fd
== STDOUT_FILENO
1079 || s
->fd
== STDERR_FILENO
)))
1085 s
->unbuffered
= true;
1092 return (stream
*) s
;
1096 /* Given the Fortran unit number, convert it to a C file descriptor. */
1099 unit_to_fd (int unit
)
1104 us
= find_unit (unit
);
1108 fd
= ((unix_stream
*) us
->s
)->fd
;
1114 /* Set the close-on-exec flag for an existing fd, if the system
1117 static void __attribute__ ((unused
))
1118 set_close_on_exec (int fd
__attribute__ ((unused
)))
1120 /* Mingw does not define F_SETFD. */
1121 #if defined(HAVE_FCNTL) && defined(F_SETFD) && defined(FD_CLOEXEC)
1123 fcntl(fd
, F_SETFD
, FD_CLOEXEC
);
1128 /* Helper function for tempfile(). Tries to open a temporary file in
1129 the directory specified by tempdir. If successful, the file name is
1130 stored in fname and the descriptor returned. Returns -1 on
1134 tempfile_open (const char *tempdir
, char **fname
)
1137 const char *slash
= "/";
1138 #if defined(HAVE_UMASK) && defined(HAVE_MKSTEMP)
1145 /* Check for the special case that tempdir ends with a slash or
1147 size_t tempdirlen
= strlen (tempdir
);
1148 if (*tempdir
== 0 || tempdir
[tempdirlen
- 1] == '/'
1150 || tempdir
[tempdirlen
- 1] == '\\'
1155 /* Take care that the template is longer in the mktemp() branch. */
1156 char *template = xmalloc (tempdirlen
+ 23);
1159 snprintf (template, tempdirlen
+ 23, "%s%sgfortrantmpXXXXXX",
1163 /* Temporarily set the umask such that the file has 0600 permissions. */
1164 mode_mask
= umask (S_IXUSR
| S_IRWXG
| S_IRWXO
);
1167 #if defined(HAVE_MKOSTEMP) && defined(O_CLOEXEC)
1168 TEMP_FAILURE_RETRY (fd
= mkostemp (template, O_CLOEXEC
));
1170 TEMP_FAILURE_RETRY (fd
= mkstemp (template));
1171 set_close_on_exec (fd
);
1175 (void) umask (mode_mask
);
1178 #else /* HAVE_MKSTEMP */
1181 size_t slashlen
= strlen (slash
);
1182 int flags
= O_RDWR
| O_CREAT
| O_EXCL
;
1183 #if defined(HAVE_CRLF) && defined(O_BINARY)
1191 snprintf (template, tempdirlen
+ 23, "%s%sgfortrantmpaaaXXXXXX",
1196 template[tempdirlen
+ slashlen
+ 13] = 'a' + (c
% 26);
1198 template[tempdirlen
+ slashlen
+ 12] = 'a' + (c
% 26);
1200 template[tempdirlen
+ slashlen
+ 11] = 'a' + (c
% 26);
1205 if (!mktemp (template))
1212 TEMP_FAILURE_RETRY (fd
= open (template, flags
, S_IRUSR
| S_IWUSR
));
1214 while (fd
== -1 && errno
== EEXIST
);
1216 set_close_on_exec (fd
);
1218 #endif /* HAVE_MKSTEMP */
1225 /* tempfile()-- Generate a temporary filename for a scratch file and
1226 open it. mkstemp() opens the file for reading and writing, but the
1227 library mode prevents anything that is not allowed. The descriptor
1228 is returned, which is -1 on error. The template is pointed to by
1229 opp->file, which is copied into the unit structure
1233 tempfile (st_parameter_open
*opp
)
1235 const char *tempdir
;
1239 tempdir
= secure_getenv ("TMPDIR");
1240 fd
= tempfile_open (tempdir
, &fname
);
1244 char buffer
[MAX_PATH
+ 1];
1246 ret
= GetTempPath (MAX_PATH
, buffer
);
1247 /* If we are not able to get a temp-directory, we use
1248 current directory. */
1249 if (ret
> MAX_PATH
|| !ret
)
1253 tempdir
= strdup (buffer
);
1254 fd
= tempfile_open (tempdir
, &fname
);
1256 #elif defined(__CYGWIN__)
1259 tempdir
= secure_getenv ("TMP");
1260 fd
= tempfile_open (tempdir
, &fname
);
1264 tempdir
= secure_getenv ("TEMP");
1265 fd
= tempfile_open (tempdir
, &fname
);
1269 fd
= tempfile_open (P_tmpdir
, &fname
);
1272 opp
->file_len
= strlen (fname
); /* Don't include trailing nul */
1278 /* regular_file2()-- Open a regular file.
1279 Change flags->action if it is ACTION_UNSPECIFIED on entry,
1280 unless an error occurs.
1281 Returns the descriptor, which is less than zero on error. */
1284 regular_file2 (const char *path
, st_parameter_open
*opp
, unit_flags
*flags
)
1288 int crflag
, crflag2
;
1292 if (opp
->file_len
== 7)
1294 if (strncmp (path
, "CONOUT$", 7) == 0
1295 || strncmp (path
, "CONERR$", 7) == 0)
1297 fd
= open ("/dev/conout", O_WRONLY
);
1298 flags
->action
= ACTION_WRITE
;
1303 if (opp
->file_len
== 6 && strncmp (path
, "CONIN$", 6) == 0)
1305 fd
= open ("/dev/conin", O_RDONLY
);
1306 flags
->action
= ACTION_READ
;
1313 if (opp
->file_len
== 7)
1315 if (strncmp (path
, "CONOUT$", 7) == 0
1316 || strncmp (path
, "CONERR$", 7) == 0)
1318 fd
= open ("CONOUT$", O_WRONLY
);
1319 flags
->action
= ACTION_WRITE
;
1324 if (opp
->file_len
== 6 && strncmp (path
, "CONIN$", 6) == 0)
1326 fd
= open ("CONIN$", O_RDONLY
);
1327 flags
->action
= ACTION_READ
;
1332 switch (flags
->action
)
1342 case ACTION_READWRITE
:
1343 case ACTION_UNSPECIFIED
:
1348 internal_error (&opp
->common
, "regular_file(): Bad action");
1351 switch (flags
->status
)
1354 crflag
= O_CREAT
| O_EXCL
;
1357 case STATUS_OLD
: /* open will fail if the file does not exist*/
1361 case STATUS_UNKNOWN
:
1362 if (rwflag
== O_RDONLY
)
1368 case STATUS_REPLACE
:
1369 crflag
= O_CREAT
| O_TRUNC
;
1373 /* Note: STATUS_SCRATCH is handled by tempfile () and should
1374 never be seen here. */
1375 internal_error (&opp
->common
, "regular_file(): Bad status");
1378 /* rwflag |= O_LARGEFILE; */
1380 #if defined(HAVE_CRLF) && defined(O_BINARY)
1385 crflag
|= O_CLOEXEC
;
1388 mode
= S_IRUSR
| S_IWUSR
| S_IRGRP
| S_IWGRP
| S_IROTH
| S_IWOTH
;
1389 TEMP_FAILURE_RETRY (fd
= open (path
, rwflag
| crflag
, mode
));
1390 if (flags
->action
!= ACTION_UNSPECIFIED
)
1395 flags
->action
= ACTION_READWRITE
;
1398 if (errno
!= EACCES
&& errno
!= EPERM
&& errno
!= EROFS
)
1401 /* retry for read-only access */
1403 if (flags
->status
== STATUS_UNKNOWN
)
1404 crflag2
= crflag
& ~(O_CREAT
);
1407 TEMP_FAILURE_RETRY (fd
= open (path
, rwflag
| crflag2
, mode
));
1410 flags
->action
= ACTION_READ
;
1411 return fd
; /* success */
1414 if (errno
!= EACCES
&& errno
!= EPERM
&& errno
!= ENOENT
)
1415 return fd
; /* failure */
1417 /* retry for write-only access */
1419 TEMP_FAILURE_RETRY (fd
= open (path
, rwflag
| crflag
, mode
));
1422 flags
->action
= ACTION_WRITE
;
1423 return fd
; /* success */
1425 return fd
; /* failure */
1429 /* Lock the file, if necessary, based on SHARE flags. */
1431 #if defined(HAVE_FCNTL) && defined(F_SETLK) && defined(F_UNLCK)
1433 open_share (st_parameter_open
*opp
, int fd
, unit_flags
*flags
)
1437 if (fd
== STDOUT_FILENO
|| fd
== STDERR_FILENO
|| fd
== STDIN_FILENO
)
1442 f
.l_whence
= SEEK_SET
;
1444 switch (flags
->share
)
1446 case SHARE_DENYNONE
:
1448 r
= fcntl (fd
, F_SETLK
, &f
);
1451 /* Must be writable to hold write lock. */
1452 if (flags
->action
== ACTION_READ
)
1454 generate_error (&opp
->common
, LIBERROR_BAD_ACTION
,
1455 "Cannot set write lock on file opened for READ");
1459 r
= fcntl (fd
, F_SETLK
, &f
);
1461 case SHARE_UNSPECIFIED
:
1470 open_share (st_parameter_open
*opp
__attribute__ ((unused
)),
1471 int fd
__attribute__ ((unused
)),
1472 unit_flags
*flags
__attribute__ ((unused
)))
1476 #endif /* defined(HAVE_FCNTL) ... */
1479 /* Wrapper around regular_file2, to make sure we free the path after
1483 regular_file (st_parameter_open
*opp
, unit_flags
*flags
)
1485 char *path
= fc_strdup (opp
->file
, opp
->file_len
);
1486 int fd
= regular_file2 (path
, opp
, flags
);
1491 /* open_external()-- Open an external file, unix specific version.
1492 Change flags->action if it is ACTION_UNSPECIFIED on entry.
1493 Returns NULL on operating system error. */
1496 open_external (st_parameter_open
*opp
, unit_flags
*flags
)
1500 if (flags
->status
== STATUS_SCRATCH
)
1502 fd
= tempfile (opp
);
1503 if (flags
->action
== ACTION_UNSPECIFIED
)
1504 flags
->action
= flags
->readonly
? ACTION_READ
: ACTION_READWRITE
;
1506 #if HAVE_UNLINK_OPEN_FILE
1507 /* We can unlink scratch files now and it will go away when closed. */
1514 /* regular_file resets flags->action if it is ACTION_UNSPECIFIED and
1516 fd
= regular_file (opp
, flags
);
1518 set_close_on_exec (fd
);
1526 if (open_share (opp
, fd
, flags
) < 0)
1529 return fd_to_stream (fd
, flags
->form
== FORM_UNFORMATTED
);
1533 /* input_stream()-- Return a stream pointer to the default input stream.
1534 Called on initialization. */
1539 return fd_to_stream (STDIN_FILENO
, false);
1543 /* output_stream()-- Return a stream pointer to the default output stream.
1544 Called on initialization. */
1547 output_stream (void)
1551 #if defined(HAVE_CRLF) && defined(HAVE_SETMODE)
1552 setmode (STDOUT_FILENO
, O_BINARY
);
1555 s
= fd_to_stream (STDOUT_FILENO
, false);
1560 /* error_stream()-- Return a stream pointer to the default error stream.
1561 Called on initialization. */
1568 #if defined(HAVE_CRLF) && defined(HAVE_SETMODE)
1569 setmode (STDERR_FILENO
, O_BINARY
);
1572 s
= fd_to_stream (STDERR_FILENO
, false);
1577 /* compare_file_filename()-- Given an open stream and a fortran string
1578 that is a filename, figure out if the file is the same as the
1582 compare_file_filename (gfc_unit
*u
, const char *name
, int len
)
1586 #ifdef HAVE_WORKING_STAT
1594 char *path
= fc_strdup (name
, len
);
1596 /* If the filename doesn't exist, then there is no match with the
1599 if (TEMP_FAILURE_RETRY (stat (path
, &st
)) < 0)
1605 #ifdef HAVE_WORKING_STAT
1606 s
= (unix_stream
*) (u
->s
);
1607 ret
= (st
.st_dev
== s
->st_dev
) && (st
.st_ino
== s
->st_ino
);
1612 /* We try to match files by a unique ID. On some filesystems (network
1613 fs and FAT), we can't generate this unique ID, and will simply compare
1615 id1
= id_from_path (path
);
1616 id2
= id_from_fd (((unix_stream
*) (u
->s
))->fd
);
1624 ret
= (strcmp(path
, u
->filename
) == 0);
1634 #ifdef HAVE_WORKING_STAT
1635 # define FIND_FILE0_DECL struct stat *st
1636 # define FIND_FILE0_ARGS st
1638 # define FIND_FILE0_DECL uint64_t id, const char *path
1639 # define FIND_FILE0_ARGS id, path
1642 /* find_file0()-- Recursive work function for find_file() */
1645 find_file0 (gfc_unit
*u
, FIND_FILE0_DECL
)
1648 #if defined(__MINGW32__) && !HAVE_WORKING_STAT
1655 #ifdef HAVE_WORKING_STAT
1658 unix_stream
*s
= (unix_stream
*) (u
->s
);
1659 if (st
[0].st_dev
== s
->st_dev
&& st
[0].st_ino
== s
->st_ino
)
1664 if (u
->s
&& ((id1
= id_from_fd (((unix_stream
*) u
->s
)->fd
)) || id1
))
1671 if (u
->filename
&& strcmp (u
->filename
, path
) == 0)
1675 v
= find_file0 (u
->left
, FIND_FILE0_ARGS
);
1679 v
= find_file0 (u
->right
, FIND_FILE0_ARGS
);
1687 /* find_file()-- Take the current filename and see if there is a unit
1688 that has the file already open. Returns a pointer to the unit if so. */
1691 find_file (const char *file
, gfc_charlen_type file_len
)
1695 #if defined(__MINGW32__) && !HAVE_WORKING_STAT
1699 char *path
= fc_strdup (file
, file_len
);
1701 if (TEMP_FAILURE_RETRY (stat (path
, &st
[0])) < 0)
1707 #if defined(__MINGW32__) && !HAVE_WORKING_STAT
1708 id
= id_from_path (path
);
1711 __gthread_mutex_lock (&unit_lock
);
1713 u
= find_file0 (unit_root
, FIND_FILE0_ARGS
);
1717 if (! __gthread_mutex_trylock (&u
->lock
))
1719 /* assert (u->closed == 0); */
1720 __gthread_mutex_unlock (&unit_lock
);
1724 inc_waiting_locked (u
);
1726 __gthread_mutex_unlock (&unit_lock
);
1729 __gthread_mutex_lock (&u
->lock
);
1732 __gthread_mutex_lock (&unit_lock
);
1733 __gthread_mutex_unlock (&u
->lock
);
1734 if (predec_waiting_locked (u
) == 0)
1739 dec_waiting_unlocked (u
);
1747 flush_all_units_1 (gfc_unit
*u
, int min_unit
)
1751 if (u
->unit_number
> min_unit
)
1753 gfc_unit
*r
= flush_all_units_1 (u
->left
, min_unit
);
1757 if (u
->unit_number
>= min_unit
)
1759 if (__gthread_mutex_trylock (&u
->lock
))
1763 __gthread_mutex_unlock (&u
->lock
);
1771 flush_all_units (void)
1776 __gthread_mutex_lock (&unit_lock
);
1779 u
= flush_all_units_1 (unit_root
, min_unit
);
1781 inc_waiting_locked (u
);
1782 __gthread_mutex_unlock (&unit_lock
);
1786 __gthread_mutex_lock (&u
->lock
);
1788 min_unit
= u
->unit_number
+ 1;
1793 __gthread_mutex_lock (&unit_lock
);
1794 __gthread_mutex_unlock (&u
->lock
);
1795 (void) predec_waiting_locked (u
);
1799 __gthread_mutex_lock (&unit_lock
);
1800 __gthread_mutex_unlock (&u
->lock
);
1801 if (predec_waiting_locked (u
) == 0)
1809 /* Unlock the unit if necessary, based on SHARE flags. */
1812 close_share (gfc_unit
*u
__attribute__ ((unused
)))
1815 #if defined(HAVE_FCNTL) && defined(F_SETLK) && defined(F_UNLCK)
1816 unix_stream
*s
= (unix_stream
*) u
->s
;
1820 switch (u
->flags
.share
)
1823 case SHARE_DENYNONE
:
1824 if (fd
!= STDOUT_FILENO
&& fd
!= STDERR_FILENO
&& fd
!= STDIN_FILENO
)
1828 f
.l_whence
= SEEK_SET
;
1830 r
= fcntl (fd
, F_SETLK
, &f
);
1833 case SHARE_UNSPECIFIED
:
1843 /* file_exists()-- Returns nonzero if the current filename exists on
1847 file_exists (const char *file
, gfc_charlen_type file_len
)
1849 char *path
= fc_strdup (file
, file_len
);
1850 int res
= !(access (path
, F_OK
));
1856 /* file_size()-- Returns the size of the file. */
1859 file_size (const char *file
, gfc_charlen_type file_len
)
1861 char *path
= fc_strdup (file
, file_len
);
1862 struct stat statbuf
;
1864 TEMP_FAILURE_RETRY (err
= stat (path
, &statbuf
));
1868 return (GFC_IO_INT
) statbuf
.st_size
;
1871 static const char yes
[] = "YES", no
[] = "NO", unknown
[] = "UNKNOWN";
1873 /* inquire_sequential()-- Given a fortran string, determine if the
1874 file is suitable for sequential access. Returns a C-style
1878 inquire_sequential (const char *string
, int len
)
1880 struct stat statbuf
;
1885 char *path
= fc_strdup (string
, len
);
1887 TEMP_FAILURE_RETRY (err
= stat (path
, &statbuf
));
1892 if (S_ISREG (statbuf
.st_mode
) ||
1893 S_ISCHR (statbuf
.st_mode
) || S_ISFIFO (statbuf
.st_mode
))
1896 if (S_ISDIR (statbuf
.st_mode
) || S_ISBLK (statbuf
.st_mode
))
1903 /* inquire_direct()-- Given a fortran string, determine if the file is
1904 suitable for direct access. Returns a C-style string. */
1907 inquire_direct (const char *string
, int len
)
1909 struct stat statbuf
;
1914 char *path
= fc_strdup (string
, len
);
1916 TEMP_FAILURE_RETRY (err
= stat (path
, &statbuf
));
1921 if (S_ISREG (statbuf
.st_mode
) || S_ISBLK (statbuf
.st_mode
))
1924 if (S_ISDIR (statbuf
.st_mode
) ||
1925 S_ISCHR (statbuf
.st_mode
) || S_ISFIFO (statbuf
.st_mode
))
1932 /* inquire_formatted()-- Given a fortran string, determine if the file
1933 is suitable for formatted form. Returns a C-style string. */
1936 inquire_formatted (const char *string
, int len
)
1938 struct stat statbuf
;
1943 char *path
= fc_strdup (string
, len
);
1945 TEMP_FAILURE_RETRY (err
= stat (path
, &statbuf
));
1950 if (S_ISREG (statbuf
.st_mode
) ||
1951 S_ISBLK (statbuf
.st_mode
) ||
1952 S_ISCHR (statbuf
.st_mode
) || S_ISFIFO (statbuf
.st_mode
))
1955 if (S_ISDIR (statbuf
.st_mode
))
1962 /* inquire_unformatted()-- Given a fortran string, determine if the file
1963 is suitable for unformatted form. Returns a C-style string. */
1966 inquire_unformatted (const char *string
, int len
)
1968 return inquire_formatted (string
, len
);
1972 /* inquire_access()-- Given a fortran string, determine if the file is
1973 suitable for access. */
1976 inquire_access (const char *string
, int len
, int mode
)
1980 char *path
= fc_strdup (string
, len
);
1981 int res
= access (path
, mode
);
1990 /* inquire_read()-- Given a fortran string, determine if the file is
1991 suitable for READ access. */
1994 inquire_read (const char *string
, int len
)
1996 return inquire_access (string
, len
, R_OK
);
2000 /* inquire_write()-- Given a fortran string, determine if the file is
2001 suitable for READ access. */
2004 inquire_write (const char *string
, int len
)
2006 return inquire_access (string
, len
, W_OK
);
2010 /* inquire_readwrite()-- Given a fortran string, determine if the file is
2011 suitable for read and write access. */
2014 inquire_readwrite (const char *string
, int len
)
2016 return inquire_access (string
, len
, R_OK
| W_OK
);
2021 stream_isatty (stream
*s
)
2023 return isatty (((unix_stream
*) s
)->fd
);
2027 stream_ttyname (stream
*s
__attribute__ ((unused
)),
2028 char *buf
__attribute__ ((unused
)),
2029 size_t buflen
__attribute__ ((unused
)))
2031 #ifdef HAVE_TTYNAME_R
2032 return ttyname_r (((unix_stream
*)s
)->fd
, buf
, buflen
);
2033 #elif defined HAVE_TTYNAME
2036 p
= ttyname (((unix_stream
*)s
)->fd
);
2042 memcpy (buf
, p
, plen
);
2052 /* How files are stored: This is an operating-system specific issue,
2053 and therefore belongs here. There are three cases to consider.
2056 Records are written as block of bytes corresponding to the record
2057 length of the file. This goes for both formatted and unformatted
2058 records. Positioning is done explicitly for each data transfer,
2059 so positioning is not much of an issue.
2061 Sequential Formatted:
2062 Records are separated by newline characters. The newline character
2063 is prohibited from appearing in a string. If it does, this will be
2064 messed up on the next read. End of file is also the end of a record.
2066 Sequential Unformatted:
2067 In this case, we are merely copying bytes to and from main storage,
2068 yet we need to keep track of varying record lengths. We adopt
2069 the solution used by f2c. Each record contains a pair of length
2072 Length of record n in bytes
2074 Length of record n in bytes
2076 Length of record n+1 in bytes
2078 Length of record n+1 in bytes
2080 The length is stored at the end of a record to allow backspacing to the
2081 previous record. Between data transfer statements, the file pointer
2082 is left pointing to the first length of the current record.
2084 ENDFILE records are never explicitly stored.