 io.directories io.encodings.binary io.files.info.unix
 io.encodings.utf8 io.files io.pathnames io.files.types kernel
 math.bitwise sequences system unix unix.stat vocabs.loader
-classes.struct unix.ffi literals libc vocabs ;
+classes.struct unix.ffi literals libc vocabs io.files.info ;
 IN: io.directories.unix
 
 CONSTANT: file-mode 0o0666

    [ readdir_r 0 = [ errno 0 = [ (io-error) ] unless ] unless ] 2keep
    void* deref [ drop f ] unless ;

: dirent-type>file-type ( ch -- type )
    H{
        { $ DT_BLK  +block-device+ }
        { $ DT_CHR  +character-device+ }

        { $ DT_WHT  +whiteout+ }
    } at* [ drop +unknown+ ] unless ;

! An easy way to return +unknown+ is to mount a .iso on OSX and
! call directory-entries on the mount point.
: dirent>file-type ( dirent -- type )
    dup d_type>> dirent-type>file-type
    dup +unknown+ = [
        drop d_name>> utf8 alien>string file-info type>>
    ] [
        nip
    ] if ;

M: unix >directory-entry ( byte-array -- directory-entry )
    {
        [ d_name>> underlying>> utf8 alien>string ]
        [ dirent>file-type ]
    } cleave directory-entry boa ;

M: unix (directory-entries) ( path -- seq )
