Merged r157653 through r157895 into branch.
[official-gcc.git] / libgfortran / io / unix.c
blobea3b8bc4b400c9d836217f015c49768fb91c19d2
1 /* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
2 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
4 F2003 I/O support contributed by Jerry DeLisle
6 This file is part of the GNU Fortran 95 runtime library (libgfortran).
8 Libgfortran is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 Libgfortran is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 Under Section 7 of GPL version 3, you are granted additional
19 permissions described in the GCC Runtime Library Exception, version
20 3.1, as published by the Free Software Foundation.
22 You should have received a copy of the GNU General Public License and
23 a copy of the GCC Runtime Library Exception along with this program;
24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25 <http://www.gnu.org/licenses/>. */
27 /* Unix stream I/O module */
29 #include "io.h"
30 #include "unix.h"
31 #include <stdlib.h>
32 #include <limits.h>
34 #include <unistd.h>
35 #include <sys/stat.h>
36 #include <fcntl.h>
37 #include <assert.h>
39 #include <string.h>
40 #include <errno.h>
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. */
45 #ifdef __MINGW32__
47 #define WIN32_LEAN_AND_MEAN
48 #include <windows.h>
50 #define lseek _lseeki64
51 #define fstat _fstati64
52 #define stat _stati64
53 typedef struct _stati64 gfstat_t;
55 #ifndef HAVE_WORKING_STAT
56 static uint64_t
57 id_from_handle (HANDLE hFile)
59 BY_HANDLE_FILE_INFORMATION FileInformation;
61 if (hFile == INVALID_HANDLE_VALUE)
62 return 0;
64 memset (&FileInformation, 0, sizeof(FileInformation));
65 if (!GetFileInformationByHandle (hFile, &FileInformation))
66 return 0;
68 return ((uint64_t) FileInformation.nFileIndexLow)
69 | (((uint64_t) FileInformation.nFileIndexHigh) << 32);
73 static uint64_t
74 id_from_path (const char *path)
76 HANDLE hFile;
77 uint64_t res;
79 if (!path || !*path || access (path, F_OK))
80 return (uint64_t) -1;
82 hFile = CreateFile (path, 0, 0, NULL, OPEN_EXISTING,
83 FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_READONLY,
84 NULL);
85 res = id_from_handle (hFile);
86 CloseHandle (hFile);
87 return res;
91 static uint64_t
92 id_from_fd (const int fd)
94 return id_from_handle ((HANDLE) _get_osfhandle (fd));
97 #endif
99 #else
100 typedef struct stat gfstat_t;
101 #endif
103 #ifndef PATH_MAX
104 #define PATH_MAX 1024
105 #endif
107 #ifndef PROT_READ
108 #define PROT_READ 1
109 #endif
111 #ifndef PROT_WRITE
112 #define PROT_WRITE 2
113 #endif
115 /* These flags aren't defined on all targets (mingw32), so provide them
116 here. */
117 #ifndef S_IRGRP
118 #define S_IRGRP 0
119 #endif
121 #ifndef S_IWGRP
122 #define S_IWGRP 0
123 #endif
125 #ifndef S_IROTH
126 #define S_IROTH 0
127 #endif
129 #ifndef S_IWOTH
130 #define S_IWOTH 0
131 #endif
134 /* Unix and internal stream I/O module */
136 static const int BUFFER_SIZE = 8192;
138 typedef struct
140 stream st;
142 gfc_offset buffer_offset; /* File offset of the start of the buffer */
143 gfc_offset physical_offset; /* Current physical file offset */
144 gfc_offset logical_offset; /* Current logical file offset */
145 gfc_offset file_length; /* Length of the file, -1 if not seekable. */
147 char *buffer; /* Pointer to the buffer. */
148 int fd; /* The POSIX file descriptor. */
150 int active; /* Length of valid bytes in the buffer */
152 int prot;
153 int ndirty; /* Dirty bytes starting at buffer_offset */
155 int special_file; /* =1 if the fd refers to a special file */
157 unix_stream;
160 /* fix_fd()-- Given a file descriptor, make sure it is not one of the
161 * standard descriptors, returning a non-standard descriptor. If the
162 * user specifies that system errors should go to standard output,
163 * then closes standard output, we don't want the system errors to a
164 * file that has been given file descriptor 1 or 0. We want to send
165 * the error to the invalid descriptor. */
167 static int
168 fix_fd (int fd)
170 #ifdef HAVE_DUP
171 int input, output, error;
173 input = output = error = 0;
175 /* Unix allocates the lowest descriptors first, so a loop is not
176 required, but this order is. */
177 if (fd == STDIN_FILENO)
179 fd = dup (fd);
180 input = 1;
182 if (fd == STDOUT_FILENO)
184 fd = dup (fd);
185 output = 1;
187 if (fd == STDERR_FILENO)
189 fd = dup (fd);
190 error = 1;
193 if (input)
194 close (STDIN_FILENO);
195 if (output)
196 close (STDOUT_FILENO);
197 if (error)
198 close (STDERR_FILENO);
199 #endif
201 return fd;
205 /* If the stream corresponds to a preconnected unit, we flush the
206 corresponding C stream. This is bugware for mixed C-Fortran codes
207 where the C code doesn't flush I/O before returning. */
208 void
209 flush_if_preconnected (stream * s)
211 int fd;
213 fd = ((unix_stream *) s)->fd;
214 if (fd == STDIN_FILENO)
215 fflush (stdin);
216 else if (fd == STDOUT_FILENO)
217 fflush (stdout);
218 else if (fd == STDERR_FILENO)
219 fflush (stderr);
223 /* get_oserror()-- Get the most recent operating system error. For
224 * unix, this is errno. */
226 const char *
227 get_oserror (void)
229 return strerror (errno);
233 /********************************************************************
234 Raw I/O functions (read, write, seek, tell, truncate, close).
236 These functions wrap the basic POSIX I/O syscalls. Any deviation in
237 semantics is a bug, except the following: write restarts in case
238 of being interrupted by a signal, and as the first argument the
239 functions take the unix_stream struct rather than an integer file
240 descriptor. Also, for POSIX read() and write() a nbyte argument larger
241 than SSIZE_MAX is undefined; here the type of nbyte is ssize_t rather
242 than size_t as for POSIX read/write.
243 *********************************************************************/
245 static int
246 raw_flush (unix_stream * s __attribute__ ((unused)))
248 return 0;
251 static ssize_t
252 raw_read (unix_stream * s, void * buf, ssize_t nbyte)
254 /* For read we can't do I/O in a loop like raw_write does, because
255 that will break applications that wait for interactive I/O. */
256 return read (s->fd, buf, nbyte);
259 static ssize_t
260 raw_write (unix_stream * s, const void * buf, ssize_t nbyte)
262 ssize_t trans, bytes_left;
263 char *buf_st;
265 bytes_left = nbyte;
266 buf_st = (char *) buf;
268 /* We must write in a loop since some systems don't restart system
269 calls in case of a signal. */
270 while (bytes_left > 0)
272 trans = write (s->fd, buf_st, bytes_left);
273 if (trans < 0)
275 if (errno == EINTR)
276 continue;
277 else
278 return trans;
280 buf_st += trans;
281 bytes_left -= trans;
284 return nbyte - bytes_left;
287 static gfc_offset
288 raw_seek (unix_stream * s, gfc_offset offset, int whence)
290 return lseek (s->fd, offset, whence);
293 static gfc_offset
294 raw_tell (unix_stream * s)
296 return lseek (s->fd, 0, SEEK_CUR);
299 static int
300 raw_truncate (unix_stream * s, gfc_offset length)
302 #ifdef __MINGW32__
303 HANDLE h;
304 gfc_offset cur;
306 if (isatty (s->fd))
308 errno = EBADF;
309 return -1;
311 h = _get_osfhandle (s->fd);
312 if (h == INVALID_HANDLE_VALUE)
314 errno = EBADF;
315 return -1;
317 cur = lseek (s->fd, 0, SEEK_CUR);
318 if (cur == -1)
319 return -1;
320 if (lseek (s->fd, length, SEEK_SET) == -1)
321 goto error;
322 if (!SetEndOfFile (h))
324 errno = EBADF;
325 goto error;
327 if (lseek (s->fd, cur, SEEK_SET) == -1)
328 return -1;
329 return 0;
330 error:
331 lseek (s->fd, cur, SEEK_SET);
332 return -1;
333 #elif defined HAVE_FTRUNCATE
334 return ftruncate (s->fd, length);
335 #elif defined HAVE_CHSIZE
336 return chsize (s->fd, length);
337 #else
338 runtime_error ("required ftruncate or chsize support not present");
339 return -1;
340 #endif
343 static int
344 raw_close (unix_stream * s)
346 int retval;
348 if (s->fd != STDOUT_FILENO
349 && s->fd != STDERR_FILENO
350 && s->fd != STDIN_FILENO)
351 retval = close (s->fd);
352 else
353 retval = 0;
354 free_mem (s);
355 return retval;
358 static int
359 raw_init (unix_stream * s)
361 s->st.read = (void *) raw_read;
362 s->st.write = (void *) raw_write;
363 s->st.seek = (void *) raw_seek;
364 s->st.tell = (void *) raw_tell;
365 s->st.trunc = (void *) raw_truncate;
366 s->st.close = (void *) raw_close;
367 s->st.flush = (void *) raw_flush;
369 s->buffer = NULL;
370 return 0;
374 /*********************************************************************
375 Buffered I/O functions. These functions have the same semantics as the
376 raw I/O functions above, except that they are buffered in order to
377 improve performance. The buffer must be flushed when switching from
378 reading to writing and vice versa.
379 *********************************************************************/
381 static int
382 buf_flush (unix_stream * s)
384 int writelen;
386 /* Flushing in read mode means discarding read bytes. */
387 s->active = 0;
389 if (s->ndirty == 0)
390 return 0;
392 if (s->file_length != -1 && s->physical_offset != s->buffer_offset
393 && lseek (s->fd, s->buffer_offset, SEEK_SET) < 0)
394 return -1;
396 writelen = raw_write (s, s->buffer, s->ndirty);
398 s->physical_offset = s->buffer_offset + writelen;
400 /* Don't increment file_length if the file is non-seekable. */
401 if (s->file_length != -1 && s->physical_offset > s->file_length)
402 s->file_length = s->physical_offset;
404 s->ndirty -= writelen;
405 if (s->ndirty != 0)
406 return -1;
408 return 0;
411 static ssize_t
412 buf_read (unix_stream * s, void * buf, ssize_t nbyte)
414 if (s->active == 0)
415 s->buffer_offset = s->logical_offset;
417 /* Is the data we want in the buffer? */
418 if (s->logical_offset + nbyte <= s->buffer_offset + s->active
419 && s->buffer_offset <= s->logical_offset)
420 memcpy (buf, s->buffer + (s->logical_offset - s->buffer_offset), nbyte);
421 else
423 /* First copy the active bytes if applicable, then read the rest
424 either directly or filling the buffer. */
425 char *p;
426 int nread = 0;
427 ssize_t to_read, did_read;
428 gfc_offset new_logical;
430 p = (char *) buf;
431 if (s->logical_offset >= s->buffer_offset
432 && s->buffer_offset + s->active >= s->logical_offset)
434 nread = s->active - (s->logical_offset - s->buffer_offset);
435 memcpy (buf, s->buffer + (s->logical_offset - s->buffer_offset),
436 nread);
437 p += nread;
439 /* At this point we consider all bytes in the buffer discarded. */
440 to_read = nbyte - nread;
441 new_logical = s->logical_offset + nread;
442 if (s->file_length != -1 && s->physical_offset != new_logical
443 && lseek (s->fd, new_logical, SEEK_SET) < 0)
444 return -1;
445 s->buffer_offset = s->physical_offset = new_logical;
446 if (to_read <= BUFFER_SIZE/2)
448 did_read = raw_read (s, s->buffer, BUFFER_SIZE);
449 s->physical_offset += did_read;
450 s->active = did_read;
451 did_read = (did_read > to_read) ? to_read : did_read;
452 memcpy (p, s->buffer, did_read);
454 else
456 did_read = raw_read (s, p, to_read);
457 s->physical_offset += did_read;
458 s->active = 0;
460 nbyte = did_read + nread;
462 s->logical_offset += nbyte;
463 return nbyte;
466 static ssize_t
467 buf_write (unix_stream * s, const void * buf, ssize_t nbyte)
469 if (s->ndirty == 0)
470 s->buffer_offset = s->logical_offset;
472 /* Does the data fit into the buffer? As a special case, if the
473 buffer is empty and the request is bigger than BUFFER_SIZE/2,
474 write directly. This avoids the case where the buffer would have
475 to be flushed at every write. */
476 if (!(s->ndirty == 0 && nbyte > BUFFER_SIZE/2)
477 && s->logical_offset + nbyte <= s->buffer_offset + BUFFER_SIZE
478 && s->buffer_offset <= s->logical_offset
479 && s->buffer_offset + s->ndirty >= s->logical_offset)
481 memcpy (s->buffer + (s->logical_offset - s->buffer_offset), buf, nbyte);
482 int nd = (s->logical_offset - s->buffer_offset) + nbyte;
483 if (nd > s->ndirty)
484 s->ndirty = nd;
486 else
488 /* Flush, and either fill the buffer with the new data, or if
489 the request is bigger than the buffer size, write directly
490 bypassing the buffer. */
491 buf_flush (s);
492 if (nbyte <= BUFFER_SIZE/2)
494 memcpy (s->buffer, buf, nbyte);
495 s->buffer_offset = s->logical_offset;
496 s->ndirty += nbyte;
498 else
500 if (s->file_length != -1 && s->physical_offset != s->logical_offset)
502 if (lseek (s->fd, s->logical_offset, SEEK_SET) < 0)
503 return -1;
504 s->physical_offset = s->logical_offset;
507 nbyte = raw_write (s, buf, nbyte);
508 s->physical_offset += nbyte;
511 s->logical_offset += nbyte;
512 /* Don't increment file_length if the file is non-seekable. */
513 if (s->file_length != -1 && s->logical_offset > s->file_length)
514 s->file_length = s->logical_offset;
515 return nbyte;
518 static gfc_offset
519 buf_seek (unix_stream * s, gfc_offset offset, int whence)
521 switch (whence)
523 case SEEK_SET:
524 break;
525 case SEEK_CUR:
526 offset += s->logical_offset;
527 break;
528 case SEEK_END:
529 offset += s->file_length;
530 break;
531 default:
532 return -1;
534 if (offset < 0)
536 errno = EINVAL;
537 return -1;
539 s->logical_offset = offset;
540 return offset;
543 static gfc_offset
544 buf_tell (unix_stream * s)
546 return s->logical_offset;
549 static int
550 buf_truncate (unix_stream * s, gfc_offset length)
552 int r;
554 if (buf_flush (s) != 0)
555 return -1;
556 r = raw_truncate (s, length);
557 if (r == 0)
558 s->file_length = length;
559 return r;
562 static int
563 buf_close (unix_stream * s)
565 if (buf_flush (s) != 0)
566 return -1;
567 free_mem (s->buffer);
568 return raw_close (s);
571 static int
572 buf_init (unix_stream * s)
574 s->st.read = (void *) buf_read;
575 s->st.write = (void *) buf_write;
576 s->st.seek = (void *) buf_seek;
577 s->st.tell = (void *) buf_tell;
578 s->st.trunc = (void *) buf_truncate;
579 s->st.close = (void *) buf_close;
580 s->st.flush = (void *) buf_flush;
582 s->buffer = get_mem (BUFFER_SIZE);
583 return 0;
587 /*********************************************************************
588 memory stream functions - These are used for internal files
590 The idea here is that a single stream structure is created and all
591 requests must be satisfied from it. The location and size of the
592 buffer is the character variable supplied to the READ or WRITE
593 statement.
595 *********************************************************************/
598 char *
599 mem_alloc_r (stream * strm, int * len)
601 unix_stream * s = (unix_stream *) strm;
602 gfc_offset n;
603 gfc_offset where = s->logical_offset;
605 if (where < s->buffer_offset || where > s->buffer_offset + s->active)
606 return NULL;
608 n = s->buffer_offset + s->active - where;
609 if (*len > n)
610 *len = n;
612 s->logical_offset = where + *len;
614 return s->buffer + (where - s->buffer_offset);
618 char *
619 mem_alloc_w (stream * strm, int * len)
621 unix_stream * s = (unix_stream *) strm;
622 gfc_offset m;
623 gfc_offset where = s->logical_offset;
625 m = where + *len;
627 if (where < s->buffer_offset)
628 return NULL;
630 if (m > s->file_length)
631 return NULL;
633 s->logical_offset = m;
635 return s->buffer + (where - s->buffer_offset);
639 /* Stream read function for internal units. */
641 static ssize_t
642 mem_read (stream * s, void * buf, ssize_t nbytes)
644 void *p;
645 int nb = nbytes;
647 p = mem_alloc_r (s, &nb);
648 if (p)
650 memcpy (buf, p, nb);
651 return (ssize_t) nb;
653 else
654 return 0;
658 /* Stream write function for internal units. This is not actually used
659 at the moment, as all internal IO is formatted and the formatted IO
660 routines use mem_alloc_w_at. */
662 static ssize_t
663 mem_write (stream * s, const void * buf, ssize_t nbytes)
665 void *p;
666 int nb = nbytes;
668 p = mem_alloc_w (s, &nb);
669 if (p)
671 memcpy (p, buf, nb);
672 return (ssize_t) nb;
674 else
675 return 0;
679 static gfc_offset
680 mem_seek (stream * strm, gfc_offset offset, int whence)
682 unix_stream * s = (unix_stream *) strm;
683 switch (whence)
685 case SEEK_SET:
686 break;
687 case SEEK_CUR:
688 offset += s->logical_offset;
689 break;
690 case SEEK_END:
691 offset += s->file_length;
692 break;
693 default:
694 return -1;
697 /* Note that for internal array I/O it's actually possible to have a
698 negative offset, so don't check for that. */
699 if (offset > s->file_length)
701 errno = EINVAL;
702 return -1;
705 s->logical_offset = offset;
707 /* Returning < 0 is the error indicator for sseek(), so return 0 if
708 offset is negative. Thus if the return value is 0, the caller
709 has to use stell() to get the real value of logical_offset. */
710 if (offset >= 0)
711 return offset;
712 return 0;
716 static gfc_offset
717 mem_tell (stream * s)
719 return ((unix_stream *)s)->logical_offset;
723 static int
724 mem_truncate (unix_stream * s __attribute__ ((unused)),
725 gfc_offset length __attribute__ ((unused)))
727 return 0;
731 static int
732 mem_flush (unix_stream * s __attribute__ ((unused)))
734 return 0;
738 static int
739 mem_close (unix_stream * s)
741 if (s != NULL)
742 free_mem (s);
744 return 0;
748 /*********************************************************************
749 Public functions -- A reimplementation of this module needs to
750 define functional equivalents of the following.
751 *********************************************************************/
753 /* empty_internal_buffer()-- Zero the buffer of Internal file */
755 void
756 empty_internal_buffer(stream *strm)
758 unix_stream * s = (unix_stream *) strm;
759 memset(s->buffer, ' ', s->file_length);
762 /* open_internal()-- Returns a stream structure from an internal file */
764 stream *
765 open_internal (char *base, int length, gfc_offset offset)
767 unix_stream *s;
769 s = get_mem (sizeof (unix_stream));
770 memset (s, '\0', sizeof (unix_stream));
772 s->buffer = base;
773 s->buffer_offset = offset;
775 s->logical_offset = 0;
776 s->active = s->file_length = length;
778 s->st.close = (void *) mem_close;
779 s->st.seek = (void *) mem_seek;
780 s->st.tell = (void *) mem_tell;
781 s->st.trunc = (void *) mem_truncate;
782 s->st.read = (void *) mem_read;
783 s->st.write = (void *) mem_write;
784 s->st.flush = (void *) mem_flush;
786 return (stream *) s;
790 /* fd_to_stream()-- Given an open file descriptor, build a stream
791 * around it. */
793 static stream *
794 fd_to_stream (int fd, int prot)
796 gfstat_t statbuf;
797 unix_stream *s;
799 s = get_mem (sizeof (unix_stream));
800 memset (s, '\0', sizeof (unix_stream));
802 s->fd = fd;
803 s->buffer_offset = 0;
804 s->physical_offset = 0;
805 s->logical_offset = 0;
806 s->prot = prot;
808 /* Get the current length of the file. */
810 fstat (fd, &statbuf);
812 if (lseek (fd, 0, SEEK_CUR) == (gfc_offset) -1)
813 s->file_length = -1;
814 else
815 s->file_length = S_ISREG (statbuf.st_mode) ? statbuf.st_size : -1;
817 s->special_file = !S_ISREG (statbuf.st_mode);
819 if (isatty (s->fd) || options.all_unbuffered
820 ||(options.unbuffered_preconnected &&
821 (s->fd == STDIN_FILENO
822 || s->fd == STDOUT_FILENO
823 || s->fd == STDERR_FILENO)))
824 raw_init (s);
825 else
826 buf_init (s);
828 return (stream *) s;
832 /* Given the Fortran unit number, convert it to a C file descriptor. */
835 unit_to_fd (int unit)
837 gfc_unit *us;
838 int fd;
840 us = find_unit (unit);
841 if (us == NULL)
842 return -1;
844 fd = ((unix_stream *) us->s)->fd;
845 unlock_unit (us);
846 return fd;
850 /* unpack_filename()-- Given a fortran string and a pointer to a
851 * buffer that is PATH_MAX characters, convert the fortran string to a
852 * C string in the buffer. Returns nonzero if this is not possible. */
855 unpack_filename (char *cstring, const char *fstring, int len)
857 len = fstrlen (fstring, len);
858 if (len >= PATH_MAX)
859 return 1;
861 memmove (cstring, fstring, len);
862 cstring[len] = '\0';
864 return 0;
868 /* tempfile()-- Generate a temporary filename for a scratch file and
869 * open it. mkstemp() opens the file for reading and writing, but the
870 * library mode prevents anything that is not allowed. The descriptor
871 * is returned, which is -1 on error. The template is pointed to by
872 * opp->file, which is copied into the unit structure
873 * and freed later. */
875 static int
876 tempfile (st_parameter_open *opp)
878 const char *tempdir;
879 char *template;
880 int fd;
882 tempdir = getenv ("GFORTRAN_TMPDIR");
883 if (tempdir == NULL)
884 tempdir = getenv ("TMP");
885 if (tempdir == NULL)
886 tempdir = getenv ("TEMP");
887 if (tempdir == NULL)
888 tempdir = DEFAULT_TEMPDIR;
890 template = get_mem (strlen (tempdir) + 20);
892 sprintf (template, "%s/gfortrantmpXXXXXX", tempdir);
894 #ifdef HAVE_MKSTEMP
896 fd = mkstemp (template);
898 #else /* HAVE_MKSTEMP */
900 if (mktemp (template))
902 #if defined(HAVE_CRLF) && defined(O_BINARY)
903 fd = open (template, O_RDWR | O_CREAT | O_EXCL | O_BINARY,
904 S_IREAD | S_IWRITE);
905 #else
906 fd = open (template, O_RDWR | O_CREAT | O_EXCL, S_IREAD | S_IWRITE);
907 #endif
908 while (!(fd == -1 && errno == EEXIST) && mktemp (template));
909 else
910 fd = -1;
912 #endif /* HAVE_MKSTEMP */
914 if (fd < 0)
915 free_mem (template);
916 else
918 opp->file = template;
919 opp->file_len = strlen (template); /* Don't include trailing nul */
922 return fd;
926 /* regular_file()-- Open a regular file.
927 * Change flags->action if it is ACTION_UNSPECIFIED on entry,
928 * unless an error occurs.
929 * Returns the descriptor, which is less than zero on error. */
931 static int
932 regular_file (st_parameter_open *opp, unit_flags *flags)
934 char path[PATH_MAX + 1];
935 int mode;
936 int rwflag;
937 int crflag;
938 int fd;
940 if (unpack_filename (path, opp->file, opp->file_len))
942 errno = ENOENT; /* Fake an OS error */
943 return -1;
946 #ifdef __CYGWIN__
947 if (opp->file_len == 7)
949 if (strncmp (path, "CONOUT$", 7) == 0
950 || strncmp (path, "CONERR$", 7) == 0)
952 fd = open ("/dev/conout", O_WRONLY);
953 flags->action = ACTION_WRITE;
954 return fd;
958 if (opp->file_len == 6 && strncmp (path, "CONIN$", 6) == 0)
960 fd = open ("/dev/conin", O_RDONLY);
961 flags->action = ACTION_READ;
962 return fd;
964 #endif
967 #ifdef __MINGW32__
968 if (opp->file_len == 7)
970 if (strncmp (path, "CONOUT$", 7) == 0
971 || strncmp (path, "CONERR$", 7) == 0)
973 fd = open ("CONOUT$", O_WRONLY);
974 flags->action = ACTION_WRITE;
975 return fd;
979 if (opp->file_len == 6 && strncmp (path, "CONIN$", 6) == 0)
981 fd = open ("CONIN$", O_RDONLY);
982 flags->action = ACTION_READ;
983 return fd;
985 #endif
987 rwflag = 0;
989 switch (flags->action)
991 case ACTION_READ:
992 rwflag = O_RDONLY;
993 break;
995 case ACTION_WRITE:
996 rwflag = O_WRONLY;
997 break;
999 case ACTION_READWRITE:
1000 case ACTION_UNSPECIFIED:
1001 rwflag = O_RDWR;
1002 break;
1004 default:
1005 internal_error (&opp->common, "regular_file(): Bad action");
1008 switch (flags->status)
1010 case STATUS_NEW:
1011 crflag = O_CREAT | O_EXCL;
1012 break;
1014 case STATUS_OLD: /* open will fail if the file does not exist*/
1015 crflag = 0;
1016 break;
1018 case STATUS_UNKNOWN:
1019 case STATUS_SCRATCH:
1020 crflag = O_CREAT;
1021 break;
1023 case STATUS_REPLACE:
1024 crflag = O_CREAT | O_TRUNC;
1025 break;
1027 default:
1028 internal_error (&opp->common, "regular_file(): Bad status");
1031 /* rwflag |= O_LARGEFILE; */
1033 #if defined(HAVE_CRLF) && defined(O_BINARY)
1034 crflag |= O_BINARY;
1035 #endif
1037 mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
1038 fd = open (path, rwflag | crflag, mode);
1039 if (flags->action != ACTION_UNSPECIFIED)
1040 return fd;
1042 if (fd >= 0)
1044 flags->action = ACTION_READWRITE;
1045 return fd;
1047 if (errno != EACCES && errno != EROFS)
1048 return fd;
1050 /* retry for read-only access */
1051 rwflag = O_RDONLY;
1052 fd = open (path, rwflag | crflag, mode);
1053 if (fd >=0)
1055 flags->action = ACTION_READ;
1056 return fd; /* success */
1059 if (errno != EACCES)
1060 return fd; /* failure */
1062 /* retry for write-only access */
1063 rwflag = O_WRONLY;
1064 fd = open (path, rwflag | crflag, mode);
1065 if (fd >=0)
1067 flags->action = ACTION_WRITE;
1068 return fd; /* success */
1070 return fd; /* failure */
1074 /* open_external()-- Open an external file, unix specific version.
1075 * Change flags->action if it is ACTION_UNSPECIFIED on entry.
1076 * Returns NULL on operating system error. */
1078 stream *
1079 open_external (st_parameter_open *opp, unit_flags *flags)
1081 int fd, prot;
1083 if (flags->status == STATUS_SCRATCH)
1085 fd = tempfile (opp);
1086 if (flags->action == ACTION_UNSPECIFIED)
1087 flags->action = ACTION_READWRITE;
1089 #if HAVE_UNLINK_OPEN_FILE
1090 /* We can unlink scratch files now and it will go away when closed. */
1091 if (fd >= 0)
1092 unlink (opp->file);
1093 #endif
1095 else
1097 /* regular_file resets flags->action if it is ACTION_UNSPECIFIED and
1098 * if it succeeds */
1099 fd = regular_file (opp, flags);
1102 if (fd < 0)
1103 return NULL;
1104 fd = fix_fd (fd);
1106 switch (flags->action)
1108 case ACTION_READ:
1109 prot = PROT_READ;
1110 break;
1112 case ACTION_WRITE:
1113 prot = PROT_WRITE;
1114 break;
1116 case ACTION_READWRITE:
1117 prot = PROT_READ | PROT_WRITE;
1118 break;
1120 default:
1121 internal_error (&opp->common, "open_external(): Bad action");
1124 return fd_to_stream (fd, prot);
1128 /* input_stream()-- Return a stream pointer to the default input stream.
1129 * Called on initialization. */
1131 stream *
1132 input_stream (void)
1134 return fd_to_stream (STDIN_FILENO, PROT_READ);
1138 /* output_stream()-- Return a stream pointer to the default output stream.
1139 * Called on initialization. */
1141 stream *
1142 output_stream (void)
1144 stream * s;
1146 #if defined(HAVE_CRLF) && defined(HAVE_SETMODE)
1147 setmode (STDOUT_FILENO, O_BINARY);
1148 #endif
1150 s = fd_to_stream (STDOUT_FILENO, PROT_WRITE);
1151 return s;
1155 /* error_stream()-- Return a stream pointer to the default error stream.
1156 * Called on initialization. */
1158 stream *
1159 error_stream (void)
1161 stream * s;
1163 #if defined(HAVE_CRLF) && defined(HAVE_SETMODE)
1164 setmode (STDERR_FILENO, O_BINARY);
1165 #endif
1167 s = fd_to_stream (STDERR_FILENO, PROT_WRITE);
1168 return s;
1172 /* st_vprintf()-- vprintf function for error output. To avoid buffer
1173 overruns, we limit the length of the buffer to ST_VPRINTF_SIZE. 2k
1174 is big enough to completely fill a 80x25 terminal, so it shuld be
1175 OK. We use a direct write() because it is simpler and least likely
1176 to be clobbered by memory corruption. Writing an error message
1177 longer than that is an error. */
1179 #define ST_VPRINTF_SIZE 2048
1182 st_vprintf (const char *format, va_list ap)
1184 static char buffer[ST_VPRINTF_SIZE];
1185 int written;
1186 int fd;
1188 fd = options.use_stderr ? STDERR_FILENO : STDOUT_FILENO;
1189 #ifdef HAVE_VSNPRINTF
1190 written = vsnprintf(buffer, ST_VPRINTF_SIZE, format, ap);
1191 #else
1192 written = vsprintf(buffer, format, ap);
1194 if (written >= ST_VPRINTF_SIZE-1)
1196 /* The error message was longer than our buffer. Ouch. Because
1197 we may have messed up things badly, report the error and
1198 quit. */
1199 #define ERROR_MESSAGE "Internal error: buffer overrun in st_vprintf()\n"
1200 write (fd, buffer, ST_VPRINTF_SIZE-1);
1201 write (fd, ERROR_MESSAGE, strlen(ERROR_MESSAGE));
1202 sys_exit(2);
1203 #undef ERROR_MESSAGE
1206 #endif
1208 written = write (fd, buffer, written);
1209 return written;
1212 /* st_printf()-- printf() function for error output. This just calls
1213 st_vprintf() to do the actual work. */
1216 st_printf (const char *format, ...)
1218 int written;
1219 va_list ap;
1220 va_start (ap, format);
1221 written = st_vprintf(format, ap);
1222 va_end (ap);
1223 return written;
1227 /* compare_file_filename()-- Given an open stream and a fortran string
1228 * that is a filename, figure out if the file is the same as the
1229 * filename. */
1232 compare_file_filename (gfc_unit *u, const char *name, int len)
1234 char path[PATH_MAX + 1];
1235 gfstat_t st1;
1236 #ifdef HAVE_WORKING_STAT
1237 gfstat_t st2;
1238 #else
1239 # ifdef __MINGW32__
1240 uint64_t id1, id2;
1241 # endif
1242 #endif
1244 if (unpack_filename (path, name, len))
1245 return 0; /* Can't be the same */
1247 /* If the filename doesn't exist, then there is no match with the
1248 * existing file. */
1250 if (stat (path, &st1) < 0)
1251 return 0;
1253 #ifdef HAVE_WORKING_STAT
1254 fstat (((unix_stream *) (u->s))->fd, &st2);
1255 return (st1.st_dev == st2.st_dev) && (st1.st_ino == st2.st_ino);
1256 #else
1258 # ifdef __MINGW32__
1259 /* We try to match files by a unique ID. On some filesystems (network
1260 fs and FAT), we can't generate this unique ID, and will simply compare
1261 filenames. */
1262 id1 = id_from_path (path);
1263 id2 = id_from_fd (((unix_stream *) (u->s))->fd);
1264 if (id1 || id2)
1265 return (id1 == id2);
1266 # endif
1268 if (len != u->file_len)
1269 return 0;
1270 return (memcmp(path, u->file, len) == 0);
1271 #endif
1275 #ifdef HAVE_WORKING_STAT
1276 # define FIND_FILE0_DECL gfstat_t *st
1277 # define FIND_FILE0_ARGS st
1278 #else
1279 # define FIND_FILE0_DECL uint64_t id, const char *file, gfc_charlen_type file_len
1280 # define FIND_FILE0_ARGS id, file, file_len
1281 #endif
1283 /* find_file0()-- Recursive work function for find_file() */
1285 static gfc_unit *
1286 find_file0 (gfc_unit *u, FIND_FILE0_DECL)
1288 gfc_unit *v;
1289 #if defined(__MINGW32__) && !HAVE_WORKING_STAT
1290 uint64_t id1;
1291 #endif
1293 if (u == NULL)
1294 return NULL;
1296 #ifdef HAVE_WORKING_STAT
1297 if (u->s != NULL
1298 && fstat (((unix_stream *) u->s)->fd, &st[1]) >= 0 &&
1299 st[0].st_dev == st[1].st_dev && st[0].st_ino == st[1].st_ino)
1300 return u;
1301 #else
1302 # ifdef __MINGW32__
1303 if (u->s && ((id1 = id_from_fd (((unix_stream *) u->s)->fd)) || id1))
1305 if (id == id1)
1306 return u;
1308 else
1309 # endif
1310 if (compare_string (u->file_len, u->file, file_len, file) == 0)
1311 return u;
1312 #endif
1314 v = find_file0 (u->left, FIND_FILE0_ARGS);
1315 if (v != NULL)
1316 return v;
1318 v = find_file0 (u->right, FIND_FILE0_ARGS);
1319 if (v != NULL)
1320 return v;
1322 return NULL;
1326 /* find_file()-- Take the current filename and see if there is a unit
1327 * that has the file already open. Returns a pointer to the unit if so. */
1329 gfc_unit *
1330 find_file (const char *file, gfc_charlen_type file_len)
1332 char path[PATH_MAX + 1];
1333 gfstat_t st[2];
1334 gfc_unit *u;
1335 #if defined(__MINGW32__) && !HAVE_WORKING_STAT
1336 uint64_t id = 0ULL;
1337 #endif
1339 if (unpack_filename (path, file, file_len))
1340 return NULL;
1342 if (stat (path, &st[0]) < 0)
1343 return NULL;
1345 #if defined(__MINGW32__) && !HAVE_WORKING_STAT
1346 id = id_from_path (path);
1347 #endif
1349 __gthread_mutex_lock (&unit_lock);
1350 retry:
1351 u = find_file0 (unit_root, FIND_FILE0_ARGS);
1352 if (u != NULL)
1354 /* Fast path. */
1355 if (! __gthread_mutex_trylock (&u->lock))
1357 /* assert (u->closed == 0); */
1358 __gthread_mutex_unlock (&unit_lock);
1359 return u;
1362 inc_waiting_locked (u);
1364 __gthread_mutex_unlock (&unit_lock);
1365 if (u != NULL)
1367 __gthread_mutex_lock (&u->lock);
1368 if (u->closed)
1370 __gthread_mutex_lock (&unit_lock);
1371 __gthread_mutex_unlock (&u->lock);
1372 if (predec_waiting_locked (u) == 0)
1373 free_mem (u);
1374 goto retry;
1377 dec_waiting_unlocked (u);
1379 return u;
1382 static gfc_unit *
1383 flush_all_units_1 (gfc_unit *u, int min_unit)
1385 while (u != NULL)
1387 if (u->unit_number > min_unit)
1389 gfc_unit *r = flush_all_units_1 (u->left, min_unit);
1390 if (r != NULL)
1391 return r;
1393 if (u->unit_number >= min_unit)
1395 if (__gthread_mutex_trylock (&u->lock))
1396 return u;
1397 if (u->s)
1398 sflush (u->s);
1399 __gthread_mutex_unlock (&u->lock);
1401 u = u->right;
1403 return NULL;
1406 void
1407 flush_all_units (void)
1409 gfc_unit *u;
1410 int min_unit = 0;
1412 __gthread_mutex_lock (&unit_lock);
1415 u = flush_all_units_1 (unit_root, min_unit);
1416 if (u != NULL)
1417 inc_waiting_locked (u);
1418 __gthread_mutex_unlock (&unit_lock);
1419 if (u == NULL)
1420 return;
1422 __gthread_mutex_lock (&u->lock);
1424 min_unit = u->unit_number + 1;
1426 if (u->closed == 0)
1428 sflush (u->s);
1429 __gthread_mutex_lock (&unit_lock);
1430 __gthread_mutex_unlock (&u->lock);
1431 (void) predec_waiting_locked (u);
1433 else
1435 __gthread_mutex_lock (&unit_lock);
1436 __gthread_mutex_unlock (&u->lock);
1437 if (predec_waiting_locked (u) == 0)
1438 free_mem (u);
1441 while (1);
1445 /* delete_file()-- Given a unit structure, delete the file associated
1446 * with the unit. Returns nonzero if something went wrong. */
1449 delete_file (gfc_unit * u)
1451 char path[PATH_MAX + 1];
1453 if (unpack_filename (path, u->file, u->file_len))
1454 { /* Shouldn't be possible */
1455 errno = ENOENT;
1456 return 1;
1459 return unlink (path);
1463 /* file_exists()-- Returns nonzero if the current filename exists on
1464 * the system */
1467 file_exists (const char *file, gfc_charlen_type file_len)
1469 char path[PATH_MAX + 1];
1470 gfstat_t statbuf;
1472 if (unpack_filename (path, file, file_len))
1473 return 0;
1475 if (stat (path, &statbuf) < 0)
1476 return 0;
1478 return 1;
1482 /* file_size()-- Returns the size of the file. */
1484 GFC_IO_INT
1485 file_size (const char *file, gfc_charlen_type file_len)
1487 char path[PATH_MAX + 1];
1488 gfstat_t statbuf;
1490 if (unpack_filename (path, file, file_len))
1491 return -1;
1493 if (stat (path, &statbuf) < 0)
1494 return -1;
1496 return (GFC_IO_INT) statbuf.st_size;
1499 static const char yes[] = "YES", no[] = "NO", unknown[] = "UNKNOWN";
1501 /* inquire_sequential()-- Given a fortran string, determine if the
1502 * file is suitable for sequential access. Returns a C-style
1503 * string. */
1505 const char *
1506 inquire_sequential (const char *string, int len)
1508 char path[PATH_MAX + 1];
1509 gfstat_t statbuf;
1511 if (string == NULL ||
1512 unpack_filename (path, string, len) || stat (path, &statbuf) < 0)
1513 return unknown;
1515 if (S_ISREG (statbuf.st_mode) ||
1516 S_ISCHR (statbuf.st_mode) || S_ISFIFO (statbuf.st_mode))
1517 return unknown;
1519 if (S_ISDIR (statbuf.st_mode) || S_ISBLK (statbuf.st_mode))
1520 return no;
1522 return unknown;
1526 /* inquire_direct()-- Given a fortran string, determine if the file is
1527 * suitable for direct access. Returns a C-style string. */
1529 const char *
1530 inquire_direct (const char *string, int len)
1532 char path[PATH_MAX + 1];
1533 gfstat_t statbuf;
1535 if (string == NULL ||
1536 unpack_filename (path, string, len) || stat (path, &statbuf) < 0)
1537 return unknown;
1539 if (S_ISREG (statbuf.st_mode) || S_ISBLK (statbuf.st_mode))
1540 return unknown;
1542 if (S_ISDIR (statbuf.st_mode) ||
1543 S_ISCHR (statbuf.st_mode) || S_ISFIFO (statbuf.st_mode))
1544 return no;
1546 return unknown;
1550 /* inquire_formatted()-- Given a fortran string, determine if the file
1551 * is suitable for formatted form. Returns a C-style string. */
1553 const char *
1554 inquire_formatted (const char *string, int len)
1556 char path[PATH_MAX + 1];
1557 gfstat_t statbuf;
1559 if (string == NULL ||
1560 unpack_filename (path, string, len) || stat (path, &statbuf) < 0)
1561 return unknown;
1563 if (S_ISREG (statbuf.st_mode) ||
1564 S_ISBLK (statbuf.st_mode) ||
1565 S_ISCHR (statbuf.st_mode) || S_ISFIFO (statbuf.st_mode))
1566 return unknown;
1568 if (S_ISDIR (statbuf.st_mode))
1569 return no;
1571 return unknown;
1575 /* inquire_unformatted()-- Given a fortran string, determine if the file
1576 * is suitable for unformatted form. Returns a C-style string. */
1578 const char *
1579 inquire_unformatted (const char *string, int len)
1581 return inquire_formatted (string, len);
1585 #ifndef HAVE_ACCESS
1587 #ifndef W_OK
1588 #define W_OK 2
1589 #endif
1591 #ifndef R_OK
1592 #define R_OK 4
1593 #endif
1595 /* Fallback implementation of access() on systems that don't have it.
1596 Only modes R_OK and W_OK are used in this file. */
1598 static int
1599 fallback_access (const char *path, int mode)
1601 if ((mode & R_OK) && open (path, O_RDONLY) < 0)
1602 return -1;
1604 if ((mode & W_OK) && open (path, O_WRONLY) < 0)
1605 return -1;
1607 return 0;
1610 #undef access
1611 #define access fallback_access
1612 #endif
1615 /* inquire_access()-- Given a fortran string, determine if the file is
1616 * suitable for access. */
1618 static const char *
1619 inquire_access (const char *string, int len, int mode)
1621 char path[PATH_MAX + 1];
1623 if (string == NULL || unpack_filename (path, string, len) ||
1624 access (path, mode) < 0)
1625 return no;
1627 return yes;
1631 /* inquire_read()-- Given a fortran string, determine if the file is
1632 * suitable for READ access. */
1634 const char *
1635 inquire_read (const char *string, int len)
1637 return inquire_access (string, len, R_OK);
1641 /* inquire_write()-- Given a fortran string, determine if the file is
1642 * suitable for READ access. */
1644 const char *
1645 inquire_write (const char *string, int len)
1647 return inquire_access (string, len, W_OK);
1651 /* inquire_readwrite()-- Given a fortran string, determine if the file is
1652 * suitable for read and write access. */
1654 const char *
1655 inquire_readwrite (const char *string, int len)
1657 return inquire_access (string, len, R_OK | W_OK);
1661 /* file_length()-- Return the file length in bytes, -1 if unknown */
1663 gfc_offset
1664 file_length (stream * s)
1666 gfc_offset curr, end;
1667 if (!is_seekable (s))
1668 return -1;
1669 curr = stell (s);
1670 if (curr == -1)
1671 return curr;
1672 end = sseek (s, 0, SEEK_END);
1673 sseek (s, curr, SEEK_SET);
1674 return end;
1678 /* is_seekable()-- Return nonzero if the stream is seekable, zero if
1679 * it is not */
1682 is_seekable (stream *s)
1684 /* By convention, if file_length == -1, the file is not
1685 seekable. */
1686 return ((unix_stream *) s)->file_length!=-1;
1690 /* is_special()-- Return nonzero if the stream is not a regular file. */
1693 is_special (stream *s)
1695 return ((unix_stream *) s)->special_file;
1700 stream_isatty (stream *s)
1702 return isatty (((unix_stream *) s)->fd);
1705 char *
1706 stream_ttyname (stream *s __attribute__ ((unused)))
1708 #ifdef HAVE_TTYNAME
1709 return ttyname (((unix_stream *) s)->fd);
1710 #else
1711 return NULL;
1712 #endif
1716 /* How files are stored: This is an operating-system specific issue,
1717 and therefore belongs here. There are three cases to consider.
1719 Direct Access:
1720 Records are written as block of bytes corresponding to the record
1721 length of the file. This goes for both formatted and unformatted
1722 records. Positioning is done explicitly for each data transfer,
1723 so positioning is not much of an issue.
1725 Sequential Formatted:
1726 Records are separated by newline characters. The newline character
1727 is prohibited from appearing in a string. If it does, this will be
1728 messed up on the next read. End of file is also the end of a record.
1730 Sequential Unformatted:
1731 In this case, we are merely copying bytes to and from main storage,
1732 yet we need to keep track of varying record lengths. We adopt
1733 the solution used by f2c. Each record contains a pair of length
1734 markers:
1736 Length of record n in bytes
1737 Data of record n
1738 Length of record n in bytes
1740 Length of record n+1 in bytes
1741 Data of record n+1
1742 Length of record n+1 in bytes
1744 The length is stored at the end of a record to allow backspacing to the
1745 previous record. Between data transfer statements, the file pointer
1746 is left pointing to the first length of the current record.
1748 ENDFILE records are never explicitly stored.