| ! { dg-do run } |
| ! { dg-additional-sources read_dir-aux.c } |
| ! |
| ! PR67367 |
| |
| program bug |
| use iso_c_binding |
| implicit none |
| |
| interface |
| integer(c_int) function expect_open_to_fail () bind(C) |
| import |
| end |
| subroutine my_verify_not_exists(s) bind(C) |
| ! Aborts if the passed pathname (still) exists |
| import |
| character(len=1,kind=c_char) :: s(*) |
| end subroutine |
| subroutine my_mkdir(s) bind(C) |
| ! Call POSIX's mkdir - and ignore fails due to |
| ! existing directories but fail otherwise |
| import |
| character(len=1,kind=c_char) :: s(*) |
| end subroutine |
| subroutine my_rmdir(s) bind(C) |
| ! Call POSIX's rmdir - and ignore fails |
| import |
| character(len=1,kind=c_char) :: s(*) |
| end subroutine |
| end interface |
| |
| character(len=*), parameter :: sdir = "junko.dir" |
| character(len=*,kind=c_char), parameter :: c_sdir = sdir // c_null_char |
| |
| character(len=1) :: c |
| integer ios |
| |
| if (expect_open_to_fail () /= 0) then |
| ! Windows is documented to fail with EACCESS when trying to open a |
| ! directory. However, target macros such as __WIN32__ are not defined |
| ! in Fortran; hence, we use a detour via this C function. |
| ! Check for '.' which is a known-to-exist directory: |
| open(unit=10, file='.',iostat=ios,action='read',access='stream') |
| if (ios == 0) & |
| stop 3 ! Error: open to fail (EACCESS) |
| stop 0 ! OK |
| endif |
| |
| call my_mkdir(c_sdir) |
| open(unit=10, file=sdir,iostat=ios,action='read',access='stream') |
| |
| if (ios.ne.0) then |
| call my_rmdir(c_sdir) |
| STOP 1 |
| end if |
| read(10, iostat=ios) c |
| if (ios.ne.21.and.ios.ne.0) then ! EISDIR has often the value 21 |
| close(10, status='delete') |
| call my_verify_not_exists(c_sdir) |
| STOP 2 |
| end if |
| close(10, status='delete') |
| call my_verify_not_exists(c_sdir) |
| end program bug |