ref: 5a6e20ca64a3a59cfef8d4bb9167e7c7532374e4
dir: /lib/System/IO/MD5.hs/
-- Copyright 2023 Lennart Augustsson
-- See LICENSE file for full license.
module System.IO.MD5(md5file) where
import Primitives(primUnsafeCoerce)
import Prelude
import Data.Word
import Foreign.C.String
import Foreign.Marshal.Alloc
import Foreign.Ptr
foreign import ccall "md5File" c_md5File :: Handle -> CString -> IO ()
md5Len :: Int
md5Len = 16 -- The MD5 checksum is 16 bytes, use one byte / word
md5file :: FilePath -> IO (Maybe [Word]) -- actually returns 16 bytes
md5file fn = do
mh <- openFileM fn ReadMode
case mh of
Nothing -> return Nothing
Just h -> do
buf <- mallocBytes md5Len
c_md5File h buf
md5 <- peekCAStringLen (buf, md5Len)
let
wmd5 :: [Word]
wmd5 = primUnsafeCoerce md5
free buf
hClose h
return (Just wmd5)