diff options
author | jb <jb@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-03-11 21:34:22 +0000 |
---|---|---|
committer | jb <jb@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-03-11 21:34:22 +0000 |
commit | 771e2b1c3ccaa6fd2cc05a07a47eafa252f7286a (patch) | |
tree | 675691d7e2fb5c94061765a40741e081281af137 /libgfortran/io | |
parent | fd2e7f43dbcd5f3d5e885a72fe70955166498d8a (diff) | |
download | gcc-771e2b1c3ccaa6fd2cc05a07a47eafa252f7286a.tar.gz |
PR 65200 Handle EPERM in addition to EACCES.
gcc/fortran ChangeLog:
2015-03-11 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/65200
* gfortran.texi: Document behavior when opening files without
explicit ACTION= specifier.
libgfortran ChangeLog:
2015-03-11 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/65200
* io/open.c (new_unit): Use gf_strerror rather than hardcoding
error messages for different errno values.
* io/unix.c (regular_file2): Handle EPERM in addition to EACCES.
gcc/testsuite ChangeLog:
2015-03-11 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/65200
* gfortran.dg/open_errors.f90: Update checks for iomsg string.
* gfortran.dg/open_new_segv.f90: Fix error message pattern.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221361 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran/io')
-rw-r--r-- | libgfortran/io/open.c | 30 | ||||
-rw-r--r-- | libgfortran/io/unix.c | 4 |
2 files changed, 6 insertions, 28 deletions
diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c index 0a2fda9d476..4654de27bd1 100644 --- a/libgfortran/io/open.c +++ b/libgfortran/io/open.c @@ -502,34 +502,12 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags) s = open_external (opp, flags); if (s == NULL) { + char errbuf[256]; char *path = fc_strdup (opp->file, opp->file_len); - size_t msglen = opp->file_len + 51; + size_t msglen = opp->file_len + 22 + sizeof (errbuf); char *msg = xmalloc (msglen); - - switch (errno) - { - case ENOENT: - snprintf (msg, msglen, "File '%s' does not exist", path); - break; - - case EEXIST: - snprintf (msg, msglen, "File '%s' already exists", path); - break; - - case EACCES: - snprintf (msg, msglen, - "Permission denied trying to open file '%s'", path); - break; - - case EISDIR: - snprintf (msg, msglen, "'%s' is a directory", path); - break; - - default: - free (msg); - msg = NULL; - } - + snprintf (msg, msglen, "Cannot open file '%s': %s", path, + gf_strerror (errno, errbuf, sizeof (errbuf))); generate_error (&opp->common, LIBERROR_OS, msg); free (msg); free (path); diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index 912364b56db..e5fc6e19818 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -1353,7 +1353,7 @@ regular_file2 (const char *path, st_parameter_open *opp, unit_flags *flags) flags->action = ACTION_READWRITE; return fd; } - if (errno != EACCES && errno != EROFS) + if (errno != EACCES && errno != EPERM && errno != EROFS) return fd; /* retry for read-only access */ @@ -1369,7 +1369,7 @@ regular_file2 (const char *path, st_parameter_open *opp, unit_flags *flags) return fd; /* success */ } - if (errno != EACCES && errno != ENOENT) + if (errno != EACCES && errno != EPERM && errno != ENOENT) return fd; /* failure */ /* retry for write-only access */ |