On Wed, Sep 2, 2015 at 6:03 PM, Steve Kargl wrote: > On Wed, Sep 02, 2015 at 11:30:07AM +0300, Janne Blomqvist wrote: >> On Wed, Sep 2, 2015 at 1:28 AM, Jerry DeLisle wrote: >> > On 09/01/2015 11:18 AM, Steve Kargl wrote: >> >> On Tue, Sep 01, 2015 at 11:16:27AM -0700, Steve Kargl wrote: >> >>> open(unit=10, file='junko.dir',iostat=ios,action='read',access='stream') >> >>> if (ios.ne.0) call abort >> >>> read(10, iostat=ios) c >> >>> - if (ios.ne.21) call abort >> >>> + if (ios.ne.21) then >> >>> + close(10) >> >> >> >> I forgot to mention that 'close(10, status="delete')' does not >> >> work on a directory. Should it? >> >> >> >>> + call system('rmdir junko.dir') >> >>> + call abort >> >>> + end if >> >>> + close(10) >> >>> call system('rmdir junko.dir') >> >> >> > >> > Thanks for the touch up Steve. I suspect other OS's will not work either. I >> > assumed close with Status="delete" would not work on a directory. >> >> That's because libgfortran uses unlink(2), which only works for files, >> not directories. One could change that to use remove(3), which works >> for both. > > I suspect people who create directories and then > want to delete them will use SYSTEM or the > standard conforming equivalent. Probably. Anyway, it's no big deal to fix it and shouldn't have any negative side effects, so I committed the attached patch as obvious. testsuite: 2015-09-04 Janne Blomqvist * gfortran.dg/read_dir.f90: Delete empty directory when closing rather than calling rmdir, cleanup if open fails. libgfortran: 2015-09-04 Janne Blomqvist * io/unix.h (delete_file): Remove prototype. * io/unix.c (delete_file): Remove function. * io/close.c (st_close): Replace delete_file and unlink with remove. * io/open.c (already_open): Replace unlink with remove. >> Also, I suspect the reason why it fails on freebsd is that errno >> EISDIR is not 21 there. Perhaps one should just check for ios /= 0? > > I checked. FreeBSD's EISDIR is 21; howevr, ios == 0 in this > case. I haven't looked too deep. FreeBSD is probably > adhering to the unix philosophy of "everything is a file". Hmm, Ok. Reading the POSIX spec for read() http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html it seems it's allowed, but not required for an implementation to return data when reading from a directory fd. The portable would be to use readdir(). -- Janne Blomqvist