{-# OPTIONS_JHC -fffi #-} module System.Directory ( Permissions( Permissions, readable, writable, executable, searchable ), createDirectory, removeDirectory, removeFile, renameDirectory, renameFile, getDirectoryContents, getCurrentDirectory, setCurrentDirectory, doesFileExist, doesDirectoryExist, getPermissions, setPermissions, getModificationTime ) where import Foreign import Foreign.C import System.Time data Permissions = Permissions { readable, writable, executable, searchable :: !Bool } deriving (Eq,Ord,Read,Show) cPathMax :: CSize cPathMax = 1024 getCurrentDirectory :: IO FilePath getCurrentDirectory = allocaBytes (fromIntegral cPathMax) $ \cp -> do cp <- throwErrnoIfNull "getCurrentDirectory" (getcwd cp cPathMax) peekCString cp setCurrentDirectory :: FilePath -> IO () setCurrentDirectory fp = throwErrnoIfMinus1_ fp $ withCString fp chdir foreign import ccall unsafe chdir :: CString -> IO Int foreign import ccall unsafe getcwd :: Ptr CChar -> CSize -> IO (Ptr CChar) foreign import ccall unsafe mkdir :: CString -> Int -> IO Int foreign import ccall unsafe rmdir :: CString -> IO Int foreign import ccall unsafe unlink :: CString -> IO Int foreign import ccall unsafe rename :: CString -> CString -> IO Int createDirectory :: FilePath -> IO () createDirectory fp = throwErrnoIfMinus1_ fp $ withCString fp $ \cs -> mkdir cs (-1) removeDirectory :: FilePath -> IO () removeDirectory fp = throwErrnoIfMinus1_ fp $ withCString fp rmdir removeFile :: FilePath -> IO () removeFile fp = throwErrnoIfMinus1_ fp $ withCString fp unlink renameDirectory :: FilePath -> FilePath -> IO () renameDirectory fp1 fp2 = throwErrnoIfMinus1_ "rename" $ do withCString fp1 $ \fp1 -> do withCString fp2 $ \fp2 -> do rename fp1 fp2 renameFile :: FilePath -> FilePath -> IO () renameFile x y = renameDirectory x y getDirectoryContents :: FilePath -> IO [FilePath] getDirectoryContents = error "getDirectoryContents" doesFileExist :: FilePath -> IO Bool doesFileExist = error "doesFileExist" doesDirectoryExist :: FilePath -> IO Bool doesDirectoryExist = error "doesDirectoryExist" getPermissions :: FilePath -> IO Permissions getPermissions = error "getPermissions" setPermissions :: FilePath -> Permissions -> IO () setPermissions = error "setPermissions" getModificationTime :: FilePath -> IO ClockTime getModificationTime = error "getModificationTime"