module Codec.Archive
(
unpackToDir
, unpackArchive
, entriesToFile
, entriesToFileZip
, entriesToFile7Zip
, entriesToBS
, entriesToBS7zip
, entriesToBSzip
, readArchiveFile
, readArchiveBS
, Entry (..)
, EntryContent (..)
, Ownership (..)
, Permissions
, ModTime
, Id
, standardPermissions
, executablePermissions
) where
import Codec.Archive.Foreign
import Codec.Archive.Pack
import Codec.Archive.Types
import Codec.Archive.Unpack
import Control.Monad (void, (<=<))
import Data.ByteString (useAsCStringLen)
import qualified Data.ByteString as BS
import Foreign.C.String
import Foreign.Ptr (Ptr)
import System.IO.Unsafe (unsafePerformIO)
actFree :: (Ptr Archive -> IO a) -> Ptr Archive -> IO a
actFree fact a = fact a <* archive_read_free a
readArchiveFile :: FilePath -> IO [Entry]
readArchiveFile = actFree hsEntries <=< archiveFile
readArchiveBS :: BS.ByteString -> [Entry]
readArchiveBS = unsafePerformIO . (actFree hsEntries <=< bsToArchive)
{-# NOINLINE readArchiveBS #-}
archiveFile :: FilePath -> IO (Ptr Archive)
archiveFile fp = withCString fp $ \cpath -> do
a <- archive_read_new
void $ archive_read_support_format_all a
void $ archive_read_open_filename a cpath 10240
pure a
unpackArchive :: FilePath
-> FilePath
-> IO ()
unpackArchive tarFp dirFp = do
a <- archiveFile tarFp
unpackEntriesFp a dirFp
void $ archive_read_free a
bsToArchive :: BS.ByteString -> IO (Ptr Archive)
bsToArchive bs = do
a <- archive_read_new
void $ archive_read_support_format_all a
useAsCStringLen bs $
\(charPtr, sz) ->
void $ archive_read_open_memory a charPtr (fromIntegral sz)
pure a
unpackToDir :: FilePath
-> BS.ByteString
-> IO ()
unpackToDir fp bs = do
a <- bsToArchive bs
unpackEntriesFp a fp
void $ archive_read_free a