diff --git a/hpath-posix/cbits/dirutils.c b/hpath-posix/cbits/dirutils.c index 660607d..2ba92ab 100644 --- a/hpath-posix/cbits/dirutils.c +++ b/hpath-posix/cbits/dirutils.c @@ -1,7 +1,7 @@ #include "dirutils.h" + unsigned int __posixdir_d_type(struct dirent* d) { return(d -> d_type); } - diff --git a/hpath-posix/cbits/dirutils.h b/hpath-posix/cbits/dirutils.h index fd93b2e..e2d7498 100644 --- a/hpath-posix/cbits/dirutils.h +++ b/hpath-posix/cbits/dirutils.h @@ -7,7 +7,9 @@ #include #include + extern unsigned int __posixdir_d_type(struct dirent* d) ; + #endif diff --git a/hpath-posix/src/System/Posix/RawFilePath/Directory/Traversals.hs b/hpath-posix/src/System/Posix/RawFilePath/Directory/Traversals.hs index 229c071..bdb3ece 100644 --- a/hpath-posix/src/System/Posix/RawFilePath/Directory/Traversals.hs +++ b/hpath-posix/src/System/Posix/RawFilePath/Directory/Traversals.hs @@ -10,6 +10,7 @@ -- Traversal and read operations on directories. +{-# LANGUAGE CApiFFI #-} {-# LANGUAGE CPP #-} {-# LANGUAGE ForeignFunctionInterface #-} {-# LANGUAGE OverloadedStrings #-} @@ -173,11 +174,15 @@ foreign import ccall unsafe "__hscore_d_name" foreign import ccall unsafe "__posixdir_d_type" c_type :: Ptr CDirent -> IO DirType -foreign import ccall "realpath" +foreign import capi "stdlib.h realpath" c_realpath :: CString -> CString -> IO CString -foreign import ccall unsafe "fdopendir" - c_fdopendir :: Posix.Fd -> IO (Ptr ()) +-- Using normal 'ccall' here lead to memory bugs, crashes +-- and corrupted d_name entries. It appears there are two fdopendirs: +-- https://opensource.apple.com/source/Libc/Libc-1244.1.7/include/dirent.h.auto.html +-- The capi call picks the correct one. +foreign import capi unsafe "dirent.h fdopendir" + c_fdopendir :: Posix.Fd -> IO (Ptr CDir) ---------------------------------------------------------- -- less dodgy but still lower-level