diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
 # libarchive
 
+## 1.0.4.0
+
+  * Add `noOpenCallback`
+  * Add various facilities for lazy/streaming archives, viz. `unpackToDirLazy`,
+    `bslToArchive`, and `readArchiveBSL`.
+  * Remove `unsafe` stuff everywhere
+
 ## 1.0.3.0
 
   * Fix types for `archive_set_read_callback` and
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -10,4 +10,4 @@
 formats.
 
 It has a high-level Haskell API for creating and unpacking archives in addition
-to the C API.
+to the C API. Like the `tar` package, it can stream from lazy `ByteString`s.
diff --git a/libarchive.cabal b/libarchive.cabal
--- a/libarchive.cabal
+++ b/libarchive.cabal
@@ -1,6 +1,6 @@
 cabal-version: 1.18
 name: libarchive
-version: 1.0.3.0
+version: 1.0.4.0
 license: BSD3
 license-file: LICENSE
 copyright: Copyright: (c) 2018-2019 Vanessa McHale
@@ -10,7 +10,7 @@
 bug-reports: https://github.com/vmchale/libarchive/issues
 synopsis: Haskell interface to libarchive
 description:
-    Haskell bindings for [libarchive](https://www.libarchive.org/). Provides the ability to unpack archives.
+    Haskell bindings for [libarchive](https://www.libarchive.org/). Provides the ability to unpack archives, including the ability to unpack archives lazily.
 category: Codec
 build-type: Simple
 extra-source-files:
@@ -33,20 +33,19 @@
     hs-source-dirs: src
     other-modules:
         Codec.Archive.Pack
+        Codec.Archive.Unpack.Lazy
         Codec.Archive.Unpack
         Codec.Archive.Foreign.Common
         Codec.Archive.Types
+        Codec.Archive.Common
     default-language: Haskell2010
-    ghc-options: -Wall
+    ghc-options: -Wall -Wincomplete-uni-patterns
+                 -Wincomplete-record-updates -Wredundant-constraints
     build-depends:
         base >=4.9 && <5,
         bytestring -any,
         filepath -any,
         composition-prelude -any
-
-    if impl(ghc >=8.0)
-        ghc-options: -Wincomplete-uni-patterns -Wincomplete-record-updates
-                     -Wredundant-constraints -Widentities
 
     if impl(ghc >=8.4)
         ghc-options: -Wmissing-export-lists
diff --git a/src/Codec/Archive.hs b/src/Codec/Archive.hs
--- a/src/Codec/Archive.hs
+++ b/src/Codec/Archive.hs
@@ -4,6 +4,7 @@
 module Codec.Archive
     ( -- * High-level functionality
       unpackToDir
+    , unpackToDirLazy
     , unpackArchive
     , entriesToFile
     , entriesToFileZip
@@ -13,6 +14,7 @@
     , entriesToBSzip
     , readArchiveFile
     , readArchiveBS
+    , readArchiveBSL
     -- * Concrete (Haskell) types
     , Entry (..)
     , EntryContent (..)
@@ -25,65 +27,7 @@
     , 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)
-
--- | Read from an 'Archive' and then free it
-actFree :: (Ptr Archive -> IO a) -> Ptr Archive -> IO a
-actFree fact a = fact a <* archive_read_free a
-
--- | Read an archive from a file. The format of the archive is automatically
--- detected.
-readArchiveFile :: FilePath -> IO [Entry]
-readArchiveFile = actFree hsEntries <=< archiveFile
-
--- | Read an archive contained in a 'BS.ByteString'. The format of the archive is
--- automatically detected.
-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
-
--- | This is more efficient than
---
--- @
--- unpackToDir "llvm" =<< BS.readFile "llvm.tar"
--- @
-unpackArchive :: FilePath -- ^ Filepath pointing to archive
-              -> FilePath -- ^ Dirctory to unpack in
-              -> 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 -- ^ Directory to unpack in
-            -> BS.ByteString -- ^ 'BS.ByteString' containing archive
-            -> IO ()
-unpackToDir fp bs = do
-    a <- bsToArchive bs
-    unpackEntriesFp a fp
-    void $ archive_read_free a
+import           Codec.Archive.Unpack.Lazy
diff --git a/src/Codec/Archive/Common.hs b/src/Codec/Archive/Common.hs
new file mode 100644
--- /dev/null
+++ b/src/Codec/Archive/Common.hs
@@ -0,0 +1,14 @@
+module Codec.Archive.Common ( actFree
+                            , actFreeCallback
+                            ) where
+
+import           Codec.Archive.Foreign
+import           Foreign.Marshal.Alloc (free)
+import           Foreign.Ptr
+
+-- | Read from an 'Archive' and then free it
+actFree :: (Ptr Archive -> IO a) -> Ptr Archive -> IO a
+actFree fact a = fact a <* archive_free a
+
+actFreeCallback :: (Ptr Archive -> IO a) -> (Ptr Archive, IO ()) -> IO a
+actFreeCallback fact (a, freeAct) = fact a <* archive_free a <* freeAct
diff --git a/src/Codec/Archive/Foreign/Archive.chs b/src/Codec/Archive/Foreign/Archive.chs
--- a/src/Codec/Archive/Foreign/Archive.chs
+++ b/src/Codec/Archive/Foreign/Archive.chs
@@ -323,6 +323,7 @@
                                      , ArchiveSwitchCallback
                                      , ArchivePassphraseCallback
                                      -- * Callback constructors
+                                     , noOpenCallback
                                      , mkReadCallback
                                      , mkSkipCallback
                                      , mkSeekCallback
@@ -345,7 +346,7 @@
 import Codec.Archive.Types
 import Foreign.C.String
 import Foreign.C.Types
-import Foreign.Ptr (FunPtr, Ptr)
+import Foreign.Ptr
 import System.Posix.Types (Fd (..))
 
 -- Miscellaneous
@@ -364,6 +365,10 @@
 foreign import ccall "wrapper" mkSwitchCallback :: ArchiveSwitchCallback a b -> IO (FunPtr (ArchiveSwitchCallback a b))
 foreign import ccall "wrapper" mkPassphraseCallback :: ArchivePassphraseCallback a -> IO (FunPtr (ArchivePassphraseCallback a))
 
+-- | Don't use an open callback. This is the recommended argument to 'archive_open_reada
+noOpenCallback :: FunPtr (ArchiveOpenCallback a)
+noOpenCallback = castPtrToFunPtr nullPtr
+
 foreign import ccall "wrapper" mkWriteLookup :: (Ptr a -> CString -> Int64 -> IO Int64) -> IO (FunPtr (Ptr a -> CString -> Int64 -> IO Int64))
 foreign import ccall "wrapper" mkReadLookup :: (Ptr a -> Int64 -> IO CString) -> IO (FunPtr (Ptr a -> Int64 -> IO CString))
 foreign import ccall "wrapper" mkCleanup :: (Ptr a -> IO ()) -> IO (FunPtr (Ptr a -> IO ()))
@@ -388,250 +393,250 @@
 type ArchivePassphraseCallback a = Ptr Archive -> Ptr a -> IO CString
 
 -- Archive read
-foreign import ccall unsafe archive_read_new :: IO (Ptr Archive)
-foreign import ccall unsafe archive_read_support_filter_all :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_bzip2 :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_compress :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_gzip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_grzip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_lrzip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_lz4 :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_lzip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_lzma :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_lzop :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_none :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_program :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_program_signature :: Ptr Archive -> CString -> CString -> CSize -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_rpm :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_uu :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_filter_xz :: Ptr Archive -> IO ArchiveError
--- foreign import ccall unsafe archive_read_support_filter_zstd :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_new :: IO (Ptr Archive)
+foreign import ccall archive_read_support_filter_all :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_bzip2 :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_compress :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_gzip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_grzip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_lrzip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_lz4 :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_lzip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_lzma :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_lzop :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_none :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_program :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_read_support_filter_program_signature :: Ptr Archive -> CString -> CString -> CSize -> IO ArchiveError
+foreign import ccall archive_read_support_filter_rpm :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_uu :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_filter_xz :: Ptr Archive -> IO ArchiveError
+-- foreign import ccall archive_read_support_filter_zstd :: Ptr Archive -> IO ArchiveError
 
-foreign import ccall unsafe archive_read_support_format_7zip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_all :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_ar :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_by_code :: Ptr Archive -> CInt -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_cab :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_cpio :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_empty :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_gnutar :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_iso9660 :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_lha :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_mtree :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_rar :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_raw :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_tar :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_warc :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_xar :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_zip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_zip_streamable :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_support_format_zip_seekable :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_format :: Ptr Archive -> ArchiveFormat -> IO ArchiveError
-foreign import ccall unsafe archive_read_append_filter :: Ptr Archive -> ArchiveFilter -> IO ArchiveError
-foreign import ccall unsafe archive_read_append_filter_program :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_read_append_filter_program_signature :: Ptr Archive -> CString -> Ptr a -> CSize -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_open_callback :: Ptr Archive -> FunPtr (ArchiveOpenCallback a) -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_read_callback :: Ptr Archive -> FunPtr (ArchiveReadCallback a b) -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_seek_callback :: Ptr Archive -> FunPtr (ArchiveSeekCallback a) -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_skip_callback :: Ptr Archive -> FunPtr (ArchiveSkipCallback a) -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_close_callback :: Ptr Archive -> FunPtr (ArchiveCloseCallback a) -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_switch_callback :: Ptr Archive -> FunPtr (ArchiveSwitchCallback a b) -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_callback_data :: Ptr Archive -> Ptr a -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_callback_data2 :: Ptr Archive -> Ptr a -> CUInt -> IO ArchiveError
-foreign import ccall unsafe archive_read_add_callback_data :: Ptr Archive -> Ptr a -> CUInt -> IO ArchiveError
-foreign import ccall unsafe archive_read_append_callback_data :: Ptr Archive -> Ptr a -> IO ArchiveError
-foreign import ccall unsafe archive_read_prepend_callback_data :: Ptr Archive -> Ptr a -> IO ArchiveError
-foreign import ccall unsafe archive_read_open1 :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_open :: Ptr Archive -> Ptr a -> FunPtr (ArchiveOpenCallback a) -> FunPtr (ArchiveReadCallback a b) -> FunPtr (ArchiveCloseCallback a) -> IO ArchiveError
-foreign import ccall unsafe archive_read_open2 :: Ptr Archive -> Ptr a -> FunPtr (ArchiveOpenCallback a) -> FunPtr (ArchiveReadCallback a b) -> FunPtr (ArchiveSkipCallback a) -> FunPtr (ArchiveCloseCallback a) -> IO ArchiveError
-foreign import ccall unsafe archive_read_open_filename :: Ptr Archive -> CString -> CSize -> IO ArchiveError
-foreign import ccall unsafe archive_read_open_filenames :: Ptr Archive -> Ptr CString -> CSize -> IO ArchiveError
-foreign import ccall unsafe archive_read_open_filename_w :: Ptr Archive -> CWString -> CSize -> IO ArchiveError
-foreign import ccall unsafe archive_read_open_memory :: Ptr Archive -> Ptr CChar -> CSize -> IO ArchiveError
-foreign import ccall unsafe archive_read_open_memory2 :: Ptr Archive -> Ptr a -> CSize -> CSize -> IO ArchiveError
-foreign import ccall unsafe archive_read_open_fd :: Ptr Archive -> Fd -> CSize -> IO ArchiveError
--- foreign import ccall unsafe archive_read_open_FILE 
-foreign import ccall unsafe archive_read_next_header :: Ptr Archive -> Ptr (Ptr ArchiveEntry) -> IO ArchiveError
-foreign import ccall unsafe archive_read_next_header2 :: Ptr Archive -> Ptr ArchiveEntry -> IO ArchiveError
-foreign import ccall unsafe archive_read_header_position :: Ptr Archive -> IO Int64
-foreign import ccall unsafe archive_read_has_encrypted_entries :: Ptr Archive -> IO CInt
-foreign import ccall unsafe archive_read_format_capabilities :: Ptr Archive -> IO ArchiveCapabilities
+foreign import ccall archive_read_support_format_7zip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_all :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_ar :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_by_code :: Ptr Archive -> CInt -> IO ArchiveError
+foreign import ccall archive_read_support_format_cab :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_cpio :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_empty :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_gnutar :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_iso9660 :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_lha :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_mtree :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_rar :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_raw :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_tar :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_warc :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_xar :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_zip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_zip_streamable :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_support_format_zip_seekable :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_set_format :: Ptr Archive -> ArchiveFormat -> IO ArchiveError
+foreign import ccall archive_read_append_filter :: Ptr Archive -> ArchiveFilter -> IO ArchiveError
+foreign import ccall archive_read_append_filter_program :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_read_append_filter_program_signature :: Ptr Archive -> CString -> Ptr a -> CSize -> IO ArchiveError
+foreign import ccall archive_read_set_open_callback :: Ptr Archive -> FunPtr (ArchiveOpenCallback a) -> IO ArchiveError
+foreign import ccall archive_read_set_read_callback :: Ptr Archive -> FunPtr (ArchiveReadCallback a b) -> IO ArchiveError
+foreign import ccall archive_read_set_seek_callback :: Ptr Archive -> FunPtr (ArchiveSeekCallback a) -> IO ArchiveError
+foreign import ccall archive_read_set_skip_callback :: Ptr Archive -> FunPtr (ArchiveSkipCallback a) -> IO ArchiveError
+foreign import ccall archive_read_set_close_callback :: Ptr Archive -> FunPtr (ArchiveCloseCallback a) -> IO ArchiveError
+foreign import ccall archive_read_set_switch_callback :: Ptr Archive -> FunPtr (ArchiveSwitchCallback a b) -> IO ArchiveError
+foreign import ccall archive_read_set_callback_data :: Ptr Archive -> Ptr a -> IO ArchiveError
+foreign import ccall archive_read_set_callback_data2 :: Ptr Archive -> Ptr a -> CUInt -> IO ArchiveError
+foreign import ccall archive_read_add_callback_data :: Ptr Archive -> Ptr a -> CUInt -> IO ArchiveError
+foreign import ccall archive_read_append_callback_data :: Ptr Archive -> Ptr a -> IO ArchiveError
+foreign import ccall archive_read_prepend_callback_data :: Ptr Archive -> Ptr a -> IO ArchiveError
+foreign import ccall archive_read_open1 :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_open :: Ptr Archive -> Ptr a -> FunPtr (ArchiveOpenCallback a) -> FunPtr (ArchiveReadCallback a b) -> FunPtr (ArchiveCloseCallback a) -> IO ArchiveError
+foreign import ccall archive_read_open2 :: Ptr Archive -> Ptr a -> FunPtr (ArchiveOpenCallback a) -> FunPtr (ArchiveReadCallback a b) -> FunPtr (ArchiveSkipCallback a) -> FunPtr (ArchiveCloseCallback a) -> IO ArchiveError
+foreign import ccall archive_read_open_filename :: Ptr Archive -> CString -> CSize -> IO ArchiveError
+foreign import ccall archive_read_open_filenames :: Ptr Archive -> Ptr CString -> CSize -> IO ArchiveError
+foreign import ccall archive_read_open_filename_w :: Ptr Archive -> CWString -> CSize -> IO ArchiveError
+foreign import ccall archive_read_open_memory :: Ptr Archive -> Ptr CChar -> CSize -> IO ArchiveError
+foreign import ccall archive_read_open_memory2 :: Ptr Archive -> Ptr a -> CSize -> CSize -> IO ArchiveError
+foreign import ccall archive_read_open_fd :: Ptr Archive -> Fd -> CSize -> IO ArchiveError
+-- foreign import ccall archive_read_open_FILE 
+foreign import ccall archive_read_next_header :: Ptr Archive -> Ptr (Ptr ArchiveEntry) -> IO ArchiveError
+foreign import ccall archive_read_next_header2 :: Ptr Archive -> Ptr ArchiveEntry -> IO ArchiveError
+foreign import ccall archive_read_header_position :: Ptr Archive -> IO Int64
+foreign import ccall archive_read_has_encrypted_entries :: Ptr Archive -> IO CInt
+foreign import ccall archive_read_format_capabilities :: Ptr Archive -> IO ArchiveCapabilities
 
-foreign import ccall unsafe archive_read_data :: Ptr Archive -> Ptr a -> CSize -> IO CSize
-foreign import ccall unsafe archive_seek_data :: Ptr Archive -> Int64 -> CInt -> IO Int64
-foreign import ccall unsafe archive_read_data_block :: Ptr Archive -> Ptr (Ptr a) -> Ptr CSize -> Ptr Int64 -> IO ArchiveError
-foreign import ccall unsafe archive_read_data_skip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_data_into_fd :: Ptr Archive -> Fd -> IO ArchiveError
+foreign import ccall archive_read_data :: Ptr Archive -> Ptr a -> CSize -> IO CSize
+foreign import ccall archive_seek_data :: Ptr Archive -> Int64 -> CInt -> IO Int64
+foreign import ccall archive_read_data_block :: Ptr Archive -> Ptr (Ptr a) -> Ptr CSize -> Ptr Int64 -> IO ArchiveError
+foreign import ccall archive_read_data_skip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_data_into_fd :: Ptr Archive -> Fd -> IO ArchiveError
 
-foreign import ccall unsafe archive_read_set_format_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_filter_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_options :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_read_set_format_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
+foreign import ccall archive_read_set_filter_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
+foreign import ccall archive_read_set_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
+foreign import ccall archive_read_set_options :: Ptr Archive -> CString -> IO ArchiveError
 
-foreign import ccall unsafe archive_read_add_passphrase :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_read_set_passphrase_callback :: Ptr Archive -> Ptr a -> FunPtr (ArchivePassphraseCallback a) -> IO ArchiveError
+foreign import ccall archive_read_add_passphrase :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_read_set_passphrase_callback :: Ptr Archive -> Ptr a -> FunPtr (ArchivePassphraseCallback a) -> IO ArchiveError
 
-foreign import ccall unsafe archive_read_extract :: Ptr Archive -> Ptr ArchiveEntry -> Flags -> IO ArchiveError
-foreign import ccall unsafe archive_read_extract2 :: Ptr Archive -> Ptr ArchiveEntry -> Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_extract_set_progress_callback :: Ptr Archive -> (FunPtr (Ptr a -> IO ())) -> Ptr a -> IO ()
-foreign import ccall unsafe archive_read_extract_set_skip_file :: Ptr Archive -> Int64 -> Int64 -> IO ()
+foreign import ccall archive_read_extract :: Ptr Archive -> Ptr ArchiveEntry -> Flags -> IO ArchiveError
+foreign import ccall archive_read_extract2 :: Ptr Archive -> Ptr ArchiveEntry -> Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_extract_set_progress_callback :: Ptr Archive -> (FunPtr (Ptr a -> IO ())) -> Ptr a -> IO ()
+foreign import ccall archive_read_extract_set_skip_file :: Ptr Archive -> Int64 -> Int64 -> IO ()
 
-foreign import ccall unsafe archive_read_close :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_free :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_close :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_free :: Ptr Archive -> IO ArchiveError
 
 -- Archive write
-foreign import ccall unsafe archive_write_new :: IO (Ptr Archive)
-foreign import ccall unsafe archive_write_set_bytes_per_block :: Ptr Archive -> CInt -> IO ArchiveError
-foreign import ccall unsafe archive_write_get_bytes_per_block :: Ptr Archive -> IO CInt
-foreign import ccall unsafe archive_write_set_bytes_in_last_block :: Ptr Archive -> CInt -> IO ArchiveError
-foreign import ccall unsafe archive_write_get_bytes_in_last_block :: Ptr Archive -> IO CInt
-foreign import ccall unsafe archive_write_set_skip_file :: Ptr Archive -> Int64 -> Int64 -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter :: Ptr Archive -> ArchiveFilter -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_by_name :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_b64encode :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_bzip2 :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_compress :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_grzip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_gzip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_lrzip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_lz4 :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_lzip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_lzma :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_lzop :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_none :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_program :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_uuencode :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_add_filter_xz :: Ptr Archive -> IO ArchiveError
--- foreign import ccall unsafe archive_write_add_filter_zstd :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_new :: IO (Ptr Archive)
+foreign import ccall archive_write_set_bytes_per_block :: Ptr Archive -> CInt -> IO ArchiveError
+foreign import ccall archive_write_get_bytes_per_block :: Ptr Archive -> IO CInt
+foreign import ccall archive_write_set_bytes_in_last_block :: Ptr Archive -> CInt -> IO ArchiveError
+foreign import ccall archive_write_get_bytes_in_last_block :: Ptr Archive -> IO CInt
+foreign import ccall archive_write_set_skip_file :: Ptr Archive -> Int64 -> Int64 -> IO ArchiveError
+foreign import ccall archive_write_add_filter :: Ptr Archive -> ArchiveFilter -> IO ArchiveError
+foreign import ccall archive_write_add_filter_by_name :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_write_add_filter_b64encode :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_bzip2 :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_compress :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_grzip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_gzip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_lrzip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_lz4 :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_lzip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_lzma :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_lzop :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_none :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_program :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_write_add_filter_uuencode :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_add_filter_xz :: Ptr Archive -> IO ArchiveError
+-- foreign import ccall archive_write_add_filter_zstd :: Ptr Archive -> IO ArchiveError
 
-foreign import ccall unsafe archive_write_set_format :: Ptr Archive -> ArchiveFormat -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_by_name :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_7zip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_ar_bsd :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_ar_svr4 :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_cpio :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_cpio_newc :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_gnutar :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_iso9660 :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_mtree :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_mtree_classic :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_pax :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_pax_restricted :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_raw :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_shar :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_shar_dump :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_ustar :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_v7tar :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_warc :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_xar :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_zip :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_filter_by_ext :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_format_filter_by_ext_def :: Ptr Archive -> CString -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_write_zip_set_compression_deflate :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_zip_set_compression_store :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_open :: Ptr Archive -> Ptr a -> FunPtr (ArchiveOpenCallback a) -> FunPtr (ArchiveWriteCallback a b) -> FunPtr (ArchiveCloseCallback a) -> IO ArchiveError
-foreign import ccall unsafe archive_write_open_fd :: Ptr Archive -> Fd -> IO ArchiveError
-foreign import ccall unsafe archive_write_open_filename :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_write_open_filename_w :: Ptr Archive -> CWString -> IO ArchiveError
--- foreign import ccall unsafe archive_write_open_FILE
-foreign import ccall unsafe archive_write_open_memory :: Ptr Archive -> Ptr a -> CSize -> Ptr CSize -> IO ArchiveError
+foreign import ccall archive_write_set_format :: Ptr Archive -> ArchiveFormat -> IO ArchiveError
+foreign import ccall archive_write_set_format_by_name :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_write_set_format_7zip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_ar_bsd :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_ar_svr4 :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_cpio :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_cpio_newc :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_gnutar :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_iso9660 :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_mtree :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_mtree_classic :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_pax :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_pax_restricted :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_raw :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_shar :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_shar_dump :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_ustar :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_v7tar :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_warc :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_xar :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_zip :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_set_format_filter_by_ext :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_write_set_format_filter_by_ext_def :: Ptr Archive -> CString -> CString -> IO ArchiveError
+foreign import ccall archive_write_zip_set_compression_deflate :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_zip_set_compression_store :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_open :: Ptr Archive -> Ptr a -> FunPtr (ArchiveOpenCallback a) -> FunPtr (ArchiveWriteCallback a b) -> FunPtr (ArchiveCloseCallback a) -> IO ArchiveError
+foreign import ccall archive_write_open_fd :: Ptr Archive -> Fd -> IO ArchiveError
+foreign import ccall archive_write_open_filename :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_write_open_filename_w :: Ptr Archive -> CWString -> IO ArchiveError
+-- foreign import ccall archive_write_open_FILE
+foreign import ccall archive_write_open_memory :: Ptr Archive -> Ptr a -> CSize -> Ptr CSize -> IO ArchiveError
 
-foreign import ccall unsafe archive_write_header :: Ptr Archive -> Ptr ArchiveEntry -> IO ArchiveError
-foreign import ccall unsafe archive_write_data :: Ptr Archive -> Ptr a -> CSize -> IO CSize
+foreign import ccall archive_write_header :: Ptr Archive -> Ptr ArchiveEntry -> IO ArchiveError
+foreign import ccall archive_write_data :: Ptr Archive -> Ptr a -> CSize -> IO CSize
 
-foreign import ccall unsafe archive_write_data_block :: Ptr Archive -> Ptr a -> CSize -> Int64 -> IO ArchiveError
+foreign import ccall archive_write_data_block :: Ptr Archive -> Ptr a -> CSize -> Int64 -> IO ArchiveError
 
-foreign import ccall unsafe archive_write_finish_entry :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_close :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_fail :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_free :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_finish_entry :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_close :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_fail :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_free :: Ptr Archive -> IO ArchiveError
 
-foreign import ccall unsafe archive_write_set_format_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_filter_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_options :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_write_set_format_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
+foreign import ccall archive_write_set_filter_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
+foreign import ccall archive_write_set_option :: Ptr Archive -> CString -> CString -> CString -> IO ArchiveError
+foreign import ccall archive_write_set_options :: Ptr Archive -> CString -> IO ArchiveError
 
-foreign import ccall unsafe archive_write_set_passphrase :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_write_set_passphrase_callback :: Ptr Archive -> Ptr a -> FunPtr (ArchivePassphraseCallback a) -> IO ArchiveError
+foreign import ccall archive_write_set_passphrase :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_write_set_passphrase_callback :: Ptr Archive -> Ptr a -> FunPtr (ArchivePassphraseCallback a) -> IO ArchiveError
 
-foreign import ccall unsafe archive_write_disk_new :: IO (Ptr Archive)
-foreign import ccall unsafe archive_write_disk_set_skip_file :: Ptr Archive -> Int64 -> Int64 -> IO ArchiveError
-foreign import ccall unsafe archive_write_disk_set_options :: Ptr Archive -> Flags -> IO ArchiveError
+foreign import ccall archive_write_disk_new :: IO (Ptr Archive)
+foreign import ccall archive_write_disk_set_skip_file :: Ptr Archive -> Int64 -> Int64 -> IO ArchiveError
+foreign import ccall archive_write_disk_set_options :: Ptr Archive -> Flags -> IO ArchiveError
 
-foreign import ccall unsafe archive_write_disk_set_standard_lookup :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_write_disk_set_group_lookup :: Ptr Archive -> Ptr a -> FunPtr (Ptr a -> CString -> Int64 -> IO Int64) -> FunPtr (Ptr a -> IO ()) -> IO ArchiveError
-foreign import ccall unsafe archive_write_disk_set_user_lookup :: Ptr Archive -> Ptr a -> FunPtr (Ptr a -> CString -> Int64 -> IO Int64) -> FunPtr (Ptr a -> IO ()) -> IO ArchiveError
-foreign import ccall unsafe archive_write_disk_gid :: Ptr Archive -> CString -> Int64 -> IO Int64
-foreign import ccall unsafe archive_write_disk_uid :: Ptr Archive -> CString -> Int64 -> IO Int64
+foreign import ccall archive_write_disk_set_standard_lookup :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_write_disk_set_group_lookup :: Ptr Archive -> Ptr a -> FunPtr (Ptr a -> CString -> Int64 -> IO Int64) -> FunPtr (Ptr a -> IO ()) -> IO ArchiveError
+foreign import ccall archive_write_disk_set_user_lookup :: Ptr Archive -> Ptr a -> FunPtr (Ptr a -> CString -> Int64 -> IO Int64) -> FunPtr (Ptr a -> IO ()) -> IO ArchiveError
+foreign import ccall archive_write_disk_gid :: Ptr Archive -> CString -> Int64 -> IO Int64
+foreign import ccall archive_write_disk_uid :: Ptr Archive -> CString -> Int64 -> IO Int64
 
-foreign import ccall unsafe archive_read_disk_new :: IO (Ptr Archive)
-foreign import ccall unsafe archive_read_disk_set_symlink_logical :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_set_symlink_physical :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_set_symlink_hybrid :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_entry_from_file :: Ptr Archive -> Ptr ArchiveEntry -> Fd -> Ptr Stat -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_gname :: Ptr Archive -> Int64 -> IO CString
-foreign import ccall unsafe archive_read_disk_uname :: Ptr Archive -> Int64 -> IO CString
-foreign import ccall unsafe archive_read_disk_set_standard_lookup :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_set_gname_lookup :: Ptr Archive -> Ptr a -> FunPtr (Ptr a -> Int64 -> IO CString) -> FunPtr (Ptr a -> IO ()) -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_set_uname_lookup :: Ptr Archive -> Ptr a -> FunPtr (Ptr a -> Int64 -> IO CString) -> FunPtr (Ptr a -> IO ()) -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_open :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_open_w :: Ptr Archive -> CWString -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_descend :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_can_descend :: Ptr Archive -> IO CInt
-foreign import ccall unsafe archive_read_disk_current_filesystem :: Ptr Archive -> IO CInt
-foreign import ccall unsafe archive_read_disk_current_filesystem_is_synthetic :: Ptr Archive -> IO CInt
-foreign import ccall unsafe archive_read_disk_current_filesystem_is_remote :: Ptr Archive -> IO CInt
-foreign import ccall unsafe archive_read_disk_set_atime_restored :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_set_behavior :: Ptr Archive -> ReadDiskFlags -> IO ArchiveError
+foreign import ccall archive_read_disk_new :: IO (Ptr Archive)
+foreign import ccall archive_read_disk_set_symlink_logical :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_disk_set_symlink_physical :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_disk_set_symlink_hybrid :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_disk_entry_from_file :: Ptr Archive -> Ptr ArchiveEntry -> Fd -> Ptr Stat -> IO ArchiveError
+foreign import ccall archive_read_disk_gname :: Ptr Archive -> Int64 -> IO CString
+foreign import ccall archive_read_disk_uname :: Ptr Archive -> Int64 -> IO CString
+foreign import ccall archive_read_disk_set_standard_lookup :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_disk_set_gname_lookup :: Ptr Archive -> Ptr a -> FunPtr (Ptr a -> Int64 -> IO CString) -> FunPtr (Ptr a -> IO ()) -> IO ArchiveError
+foreign import ccall archive_read_disk_set_uname_lookup :: Ptr Archive -> Ptr a -> FunPtr (Ptr a -> Int64 -> IO CString) -> FunPtr (Ptr a -> IO ()) -> IO ArchiveError
+foreign import ccall archive_read_disk_open :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_read_disk_open_w :: Ptr Archive -> CWString -> IO ArchiveError
+foreign import ccall archive_read_disk_descend :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_disk_can_descend :: Ptr Archive -> IO CInt
+foreign import ccall archive_read_disk_current_filesystem :: Ptr Archive -> IO CInt
+foreign import ccall archive_read_disk_current_filesystem_is_synthetic :: Ptr Archive -> IO CInt
+foreign import ccall archive_read_disk_current_filesystem_is_remote :: Ptr Archive -> IO CInt
+foreign import ccall archive_read_disk_set_atime_restored :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_read_disk_set_behavior :: Ptr Archive -> ReadDiskFlags -> IO ArchiveError
 
-foreign import ccall unsafe archive_read_disk_set_matching :: Ptr Archive -> Ptr Archive -> FunPtr (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO ()) -> Ptr a -> IO ArchiveError
-foreign import ccall unsafe archive_read_disk_set_metadata_filter_callback :: Ptr Archive -> FunPtr (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO CInt) -> Ptr a -> IO ArchiveError
+foreign import ccall archive_read_disk_set_matching :: Ptr Archive -> Ptr Archive -> FunPtr (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO ()) -> Ptr a -> IO ArchiveError
+foreign import ccall archive_read_disk_set_metadata_filter_callback :: Ptr Archive -> FunPtr (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO CInt) -> Ptr a -> IO ArchiveError
 
-foreign import ccall unsafe archive_free :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_free :: Ptr Archive -> IO ArchiveError
 
-foreign import ccall unsafe archive_filter_count :: Ptr Archive -> IO CInt
-foreign import ccall unsafe archive_filter_bytes :: Ptr Archive -> CInt -> Int64
-foreign import ccall unsafe archive_filter_code :: Ptr Archive -> CInt -> IO Int
-foreign import ccall unsafe archive_filter_name :: Ptr Archive -> CInt -> IO CString
+foreign import ccall archive_filter_count :: Ptr Archive -> IO CInt
+foreign import ccall archive_filter_bytes :: Ptr Archive -> CInt -> Int64
+foreign import ccall archive_filter_code :: Ptr Archive -> CInt -> IO Int
+foreign import ccall archive_filter_name :: Ptr Archive -> CInt -> IO CString
 
-foreign import ccall unsafe archive_errno :: Ptr Archive -> IO CInt
-foreign import ccall unsafe archive_error_string :: Ptr Archive -> IO CString
-foreign import ccall unsafe archive_format_name :: Ptr Archive -> IO CString
-foreign import ccall unsafe archive_format :: Ptr Archive -> IO ArchiveFormat
-foreign import ccall unsafe archive_clear_error :: Ptr Archive -> IO ()
-foreign import ccall unsafe archive_set_error :: Ptr Archive -> CInt -> CString -> IO () -- TODO: variadic lol
-foreign import ccall unsafe archive_copy_error :: Ptr Archive -> Ptr Archive -> IO ()
-foreign import ccall unsafe archive_file_count :: Ptr Archive -> IO CInt
+foreign import ccall archive_errno :: Ptr Archive -> IO CInt
+foreign import ccall archive_error_string :: Ptr Archive -> IO CString
+foreign import ccall archive_format_name :: Ptr Archive -> IO CString
+foreign import ccall archive_format :: Ptr Archive -> IO ArchiveFormat
+foreign import ccall archive_clear_error :: Ptr Archive -> IO ()
+foreign import ccall archive_set_error :: Ptr Archive -> CInt -> CString -> IO () -- TODO: variadic lol
+foreign import ccall archive_copy_error :: Ptr Archive -> Ptr Archive -> IO ()
+foreign import ccall archive_file_count :: Ptr Archive -> IO CInt
 
-foreign import ccall unsafe archive_match_new :: Ptr Archive
-foreign import ccall unsafe archive_match_free :: Ptr Archive -> IO ArchiveError
-foreign import ccall unsafe archive_match_excluded :: Ptr Archive -> IO CInt
-foreign import ccall unsafe archive_match_path_excluded :: Ptr Archive -> Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_match_exclude_pattern :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_match_exclude_pattern_w :: Ptr Archive -> CWString -> IO ArchiveError
-foreign import ccall unsafe archive_match_exclude_pattern_from_file :: Ptr Archive -> CString -> CInt -> IO ArchiveError
-foreign import ccall unsafe archive_match_exclude_pattern_from_file_w :: Ptr Archive -> CWString -> CInt -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_pattern :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_pattern_w :: Ptr Archive -> CWString -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_pattern_from_file :: Ptr Archive -> CString -> CInt -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_pattern_from_file_w :: Ptr Archive -> CString -> CInt -> IO ArchiveError
-foreign import ccall unsafe archive_match_path_unmatched_inclusions :: Ptr Archive -> IO CInt
-foreign import ccall unsafe archive_match_path_unmatched_inclusions_next :: Ptr Archive -> Ptr CString -> IO ArchiveError
-foreign import ccall unsafe archive_match_path_unmatched_inclusions_next_w :: Ptr Archive -> Ptr CWString -> IO ArchiveError
-foreign import ccall unsafe archive_match_time_excluded :: Ptr Archive -> Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_match_include_time :: Ptr Archive -> TimeFlag -> CTime -> CLong -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_date :: Ptr Archive -> TimeFlag -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_date_w :: Ptr Archive -> TimeFlag -> CWString -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_file_time :: Ptr Archive -> TimeFlag -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_file_time_w :: Ptr Archive -> TimeFlag -> CWString -> IO ArchiveError
-foreign import ccall unsafe archive_match_exclude_entry :: Ptr Archive -> TimeFlag -> Ptr ArchiveEntry -> IO ArchiveError
-foreign import ccall unsafe archive_match_owner_excluded :: Ptr Archive -> Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_match_include_gid :: Ptr Archive -> Id -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_uid :: Ptr Archive -> Id -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_uname :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_uname_w :: Ptr Archive -> CWString -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_gname :: Ptr Archive -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_match_include_gname_w :: Ptr Archive -> CWString -> IO ArchiveError
+foreign import ccall archive_match_new :: Ptr Archive
+foreign import ccall archive_match_free :: Ptr Archive -> IO ArchiveError
+foreign import ccall archive_match_excluded :: Ptr Archive -> IO CInt
+foreign import ccall archive_match_path_excluded :: Ptr Archive -> Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_match_exclude_pattern :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_match_exclude_pattern_w :: Ptr Archive -> CWString -> IO ArchiveError
+foreign import ccall archive_match_exclude_pattern_from_file :: Ptr Archive -> CString -> CInt -> IO ArchiveError
+foreign import ccall archive_match_exclude_pattern_from_file_w :: Ptr Archive -> CWString -> CInt -> IO ArchiveError
+foreign import ccall archive_match_include_pattern :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_match_include_pattern_w :: Ptr Archive -> CWString -> IO ArchiveError
+foreign import ccall archive_match_include_pattern_from_file :: Ptr Archive -> CString -> CInt -> IO ArchiveError
+foreign import ccall archive_match_include_pattern_from_file_w :: Ptr Archive -> CString -> CInt -> IO ArchiveError
+foreign import ccall archive_match_path_unmatched_inclusions :: Ptr Archive -> IO CInt
+foreign import ccall archive_match_path_unmatched_inclusions_next :: Ptr Archive -> Ptr CString -> IO ArchiveError
+foreign import ccall archive_match_path_unmatched_inclusions_next_w :: Ptr Archive -> Ptr CWString -> IO ArchiveError
+foreign import ccall archive_match_time_excluded :: Ptr Archive -> Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_match_include_time :: Ptr Archive -> TimeFlag -> CTime -> CLong -> IO ArchiveError
+foreign import ccall archive_match_include_date :: Ptr Archive -> TimeFlag -> CString -> IO ArchiveError
+foreign import ccall archive_match_include_date_w :: Ptr Archive -> TimeFlag -> CWString -> IO ArchiveError
+foreign import ccall archive_match_include_file_time :: Ptr Archive -> TimeFlag -> CString -> IO ArchiveError
+foreign import ccall archive_match_include_file_time_w :: Ptr Archive -> TimeFlag -> CWString -> IO ArchiveError
+foreign import ccall archive_match_exclude_entry :: Ptr Archive -> TimeFlag -> Ptr ArchiveEntry -> IO ArchiveError
+foreign import ccall archive_match_owner_excluded :: Ptr Archive -> Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_match_include_gid :: Ptr Archive -> Id -> IO ArchiveError
+foreign import ccall archive_match_include_uid :: Ptr Archive -> Id -> IO ArchiveError
+foreign import ccall archive_match_include_uname :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_match_include_uname_w :: Ptr Archive -> CWString -> IO ArchiveError
+foreign import ccall archive_match_include_gname :: Ptr Archive -> CString -> IO ArchiveError
+foreign import ccall archive_match_include_gname_w :: Ptr Archive -> CWString -> IO ArchiveError
 
 #include <archive.h>
 
diff --git a/src/Codec/Archive/Foreign/ArchiveEntry.chs b/src/Codec/Archive/Foreign/ArchiveEntry.chs
--- a/src/Codec/Archive/Foreign/ArchiveEntry.chs
+++ b/src/Codec/Archive/Foreign/ArchiveEntry.chs
@@ -224,164 +224,164 @@
 #include <archive_entry.h>
 
 -- Archive entry
-foreign import ccall unsafe archive_entry_clear :: Ptr ArchiveEntry -> IO (Ptr ArchiveEntry)
-foreign import ccall unsafe archive_entry_clone :: Ptr ArchiveEntry -> IO (Ptr ArchiveEntry)
-foreign import ccall unsafe archive_entry_free :: Ptr ArchiveEntry -> IO ()
-foreign import ccall unsafe archive_entry_new :: IO (Ptr ArchiveEntry)
-foreign import ccall unsafe archive_entry_new2 :: Ptr ArchiveEntry -> IO (Ptr ArchiveEntry)
+foreign import ccall archive_entry_clear :: Ptr ArchiveEntry -> IO (Ptr ArchiveEntry)
+foreign import ccall archive_entry_clone :: Ptr ArchiveEntry -> IO (Ptr ArchiveEntry)
+foreign import ccall archive_entry_free :: Ptr ArchiveEntry -> IO ()
+foreign import ccall archive_entry_new :: IO (Ptr ArchiveEntry)
+foreign import ccall archive_entry_new2 :: Ptr ArchiveEntry -> IO (Ptr ArchiveEntry)
 
-foreign import ccall unsafe archive_entry_atime :: Ptr ArchiveEntry -> IO CTime
-foreign import ccall unsafe archive_entry_atime_nsec :: Ptr ArchiveEntry -> IO CLong
-foreign import ccall unsafe archive_entry_atime_is_set :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_birthtime :: Ptr ArchiveEntry -> IO CTime
-foreign import ccall unsafe archive_entry_birthtime_nsec :: Ptr ArchiveEntry -> IO CLong
-foreign import ccall unsafe archive_entry_birthtime_is_set :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_ctime :: Ptr ArchiveEntry -> IO CTime
-foreign import ccall unsafe archive_entry_ctime_nsec :: Ptr ArchiveEntry -> IO CLong
-foreign import ccall unsafe archive_entry_ctime_is_set :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_dev :: Ptr ArchiveEntry -> IO Word64
-foreign import ccall unsafe archive_entry_dev_is_set :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_devmajor :: Ptr ArchiveEntry -> IO Word64
-foreign import ccall unsafe archive_entry_devminor :: Ptr ArchiveEntry -> IO Word64
-foreign import ccall unsafe archive_entry_filetype :: Ptr ArchiveEntry -> IO FileType
-foreign import ccall unsafe archive_entry_fflags :: Ptr ArchiveEntry -> CULong -> CULong -> IO ()
-foreign import ccall unsafe archive_entry_fflags_text :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_gid :: Ptr ArchiveEntry -> IO Id
-foreign import ccall unsafe archive_entry_gname :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_gname_utf8 :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_gname_w :: Ptr ArchiveEntry -> IO CWString
-foreign import ccall unsafe archive_entry_hardlink :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_hardlink_utf8 :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_hardlink_w :: Ptr ArchiveEntry -> IO CWString
-foreign import ccall unsafe archive_entry_ino :: Ptr ArchiveEntry -> IO Int64
-foreign import ccall unsafe archive_entry_ino64 :: Ptr ArchiveEntry -> IO Int64
-foreign import ccall unsafe archive_entry_ino_is_set :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_mode :: Ptr ArchiveEntry -> IO CMode
-foreign import ccall unsafe archive_entry_mtime :: Ptr ArchiveEntry -> IO CTime
-foreign import ccall unsafe archive_entry_mtime_nsec :: Ptr ArchiveEntry -> IO CLong
-foreign import ccall unsafe archive_entry_mtime_is_set :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_nlink :: Ptr ArchiveEntry -> IO CUInt
-foreign import ccall unsafe archive_entry_pathname :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_pathname_utf8 :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_pathname_w :: Ptr ArchiveEntry -> IO CWString
-foreign import ccall unsafe archive_entry_perm :: Ptr ArchiveEntry -> IO CMode
-foreign import ccall unsafe archive_entry_rdev :: Ptr ArchiveEntry -> IO Word64
-foreign import ccall unsafe archive_entry_rdevmajor :: Ptr ArchiveEntry -> IO Word64
-foreign import ccall unsafe archive_entry_rdevminor :: Ptr ArchiveEntry -> IO Word64
-foreign import ccall unsafe archive_entry_sourcepath :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_sourcepath_w :: Ptr ArchiveEntry -> IO CWString
-foreign import ccall unsafe archive_entry_size :: Ptr ArchiveEntry -> IO Int64
-foreign import ccall unsafe archive_entry_size_is_set :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_strmode :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_symlink :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_symlink_utf8 :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_symlink_w :: Ptr ArchiveEntry -> IO CWString
-foreign import ccall unsafe archive_entry_uid :: Ptr ArchiveEntry -> IO Id
-foreign import ccall unsafe archive_entry_uname :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_uname_utf8 :: Ptr ArchiveEntry -> IO CString
-foreign import ccall unsafe archive_entry_uname_w :: Ptr ArchiveEntry -> IO CWString
-foreign import ccall unsafe archive_entry_is_data_encrypted :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_is_metadata_encrypted :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_is_encrypted :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_atime :: Ptr ArchiveEntry -> IO CTime
+foreign import ccall archive_entry_atime_nsec :: Ptr ArchiveEntry -> IO CLong
+foreign import ccall archive_entry_atime_is_set :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_birthtime :: Ptr ArchiveEntry -> IO CTime
+foreign import ccall archive_entry_birthtime_nsec :: Ptr ArchiveEntry -> IO CLong
+foreign import ccall archive_entry_birthtime_is_set :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_ctime :: Ptr ArchiveEntry -> IO CTime
+foreign import ccall archive_entry_ctime_nsec :: Ptr ArchiveEntry -> IO CLong
+foreign import ccall archive_entry_ctime_is_set :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_dev :: Ptr ArchiveEntry -> IO Word64
+foreign import ccall archive_entry_dev_is_set :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_devmajor :: Ptr ArchiveEntry -> IO Word64
+foreign import ccall archive_entry_devminor :: Ptr ArchiveEntry -> IO Word64
+foreign import ccall archive_entry_filetype :: Ptr ArchiveEntry -> IO FileType
+foreign import ccall archive_entry_fflags :: Ptr ArchiveEntry -> CULong -> CULong -> IO ()
+foreign import ccall archive_entry_fflags_text :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_gid :: Ptr ArchiveEntry -> IO Id
+foreign import ccall archive_entry_gname :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_gname_utf8 :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_gname_w :: Ptr ArchiveEntry -> IO CWString
+foreign import ccall archive_entry_hardlink :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_hardlink_utf8 :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_hardlink_w :: Ptr ArchiveEntry -> IO CWString
+foreign import ccall archive_entry_ino :: Ptr ArchiveEntry -> IO Int64
+foreign import ccall archive_entry_ino64 :: Ptr ArchiveEntry -> IO Int64
+foreign import ccall archive_entry_ino_is_set :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_mode :: Ptr ArchiveEntry -> IO CMode
+foreign import ccall archive_entry_mtime :: Ptr ArchiveEntry -> IO CTime
+foreign import ccall archive_entry_mtime_nsec :: Ptr ArchiveEntry -> IO CLong
+foreign import ccall archive_entry_mtime_is_set :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_nlink :: Ptr ArchiveEntry -> IO CUInt
+foreign import ccall archive_entry_pathname :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_pathname_utf8 :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_pathname_w :: Ptr ArchiveEntry -> IO CWString
+foreign import ccall archive_entry_perm :: Ptr ArchiveEntry -> IO CMode
+foreign import ccall archive_entry_rdev :: Ptr ArchiveEntry -> IO Word64
+foreign import ccall archive_entry_rdevmajor :: Ptr ArchiveEntry -> IO Word64
+foreign import ccall archive_entry_rdevminor :: Ptr ArchiveEntry -> IO Word64
+foreign import ccall archive_entry_sourcepath :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_sourcepath_w :: Ptr ArchiveEntry -> IO CWString
+foreign import ccall archive_entry_size :: Ptr ArchiveEntry -> IO Int64
+foreign import ccall archive_entry_size_is_set :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_strmode :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_symlink :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_symlink_utf8 :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_symlink_w :: Ptr ArchiveEntry -> IO CWString
+foreign import ccall archive_entry_uid :: Ptr ArchiveEntry -> IO Id
+foreign import ccall archive_entry_uname :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_uname_utf8 :: Ptr ArchiveEntry -> IO CString
+foreign import ccall archive_entry_uname_w :: Ptr ArchiveEntry -> IO CWString
+foreign import ccall archive_entry_is_data_encrypted :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_is_metadata_encrypted :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_is_encrypted :: Ptr ArchiveEntry -> IO CInt
 
-foreign import ccall unsafe archive_entry_set_atime :: Ptr ArchiveEntry -> CTime -> CLong -> IO ()
-foreign import ccall unsafe archive_entry_unset_atime :: Ptr ArchiveEntry -> IO ()
-foreign import ccall unsafe archive_entry_set_birthtime :: Ptr ArchiveEntry -> CTime -> CLong -> IO ()
-foreign import ccall unsafe archive_entry_unset_birthtime :: Ptr ArchiveEntry -> IO ()
-foreign import ccall unsafe archive_entry_set_ctime :: Ptr ArchiveEntry -> CTime -> CLong -> IO ()
-foreign import ccall unsafe archive_entry_unset_ctime :: Ptr ArchiveEntry -> IO ()
-foreign import ccall unsafe archive_entry_set_dev :: Ptr ArchiveEntry -> Int64 -> IO ()
-foreign import ccall unsafe archive_entry_set_devmajor :: Ptr ArchiveEntry -> Int64 -> IO ()
-foreign import ccall unsafe archive_entry_set_devminor :: Ptr ArchiveEntry -> Int64 -> IO ()
-foreign import ccall unsafe archive_entry_set_filetype :: Ptr ArchiveEntry -> FileType -> IO ()
-foreign import ccall unsafe archive_entry_set_fflags :: Ptr ArchiveEntry -> CULong -> CULong -> IO ()
-foreign import ccall unsafe archive_entry_copy_fflags_text :: Ptr ArchiveEntry -> CString -> IO CString
-foreign import ccall unsafe archive_entry_copy_fflags_text_w :: Ptr ArchiveEntry -> CWString -> IO CWString
-foreign import ccall unsafe archive_entry_set_gid :: Ptr ArchiveEntry -> Id -> IO ()
-foreign import ccall unsafe archive_entry_set_gname :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_set_gname_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_gname :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_gname_w :: Ptr ArchiveEntry -> CWString -> IO ()
-foreign import ccall unsafe archive_entry_update_gname_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
-foreign import ccall unsafe archive_entry_set_hardlink :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_set_hardlink_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_hardlink :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_hardlink_w :: Ptr ArchiveEntry -> CWString -> IO ()
-foreign import ccall unsafe archive_entry_update_hardlink_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
-foreign import ccall unsafe archive_entry_set_ino :: Ptr ArchiveEntry -> Int64 -> IO ()
-foreign import ccall unsafe archive_entry_set_ino64 :: Ptr ArchiveEntry -> Int64 -> IO ()
-foreign import ccall unsafe archive_entry_set_link :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_set_link_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_link :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_link_w :: Ptr ArchiveEntry -> CWString -> IO ()
-foreign import ccall unsafe archive_entry_update_link_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
-foreign import ccall unsafe archive_entry_set_mode :: Ptr ArchiveEntry -> CMode -> IO ()
-foreign import ccall unsafe archive_entry_set_mtime :: Ptr ArchiveEntry -> CTime -> CLong -> IO ()
-foreign import ccall unsafe archive_entry_unset_mtime :: Ptr ArchiveEntry -> IO ()
-foreign import ccall unsafe archive_entry_set_nlink :: Ptr ArchiveEntry -> CUInt -> IO ()
-foreign import ccall unsafe archive_entry_set_pathname :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_set_pathname_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_pathname :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_pathname_w :: Ptr ArchiveEntry -> CWString -> IO ()
-foreign import ccall unsafe archive_entry_update_pathname_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
-foreign import ccall unsafe archive_entry_set_perm :: Ptr ArchiveEntry -> CMode -> IO ()
-foreign import ccall unsafe archive_entry_set_rdev :: Ptr ArchiveEntry -> Int64 -> IO ()
-foreign import ccall unsafe archive_entry_set_rdevmajor :: Ptr ArchiveEntry -> Int64 -> IO ()
-foreign import ccall unsafe archive_entry_set_rdevminor :: Ptr ArchiveEntry -> Int64 -> IO ()
-foreign import ccall unsafe archive_entry_set_size :: Ptr ArchiveEntry -> Int64 -> IO ()
-foreign import ccall unsafe archive_entry_unset_size :: Ptr ArchiveEntry -> IO ()
-foreign import ccall unsafe archive_entry_copy_sourcepath :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_sourcepath_w :: Ptr ArchiveEntry -> CWString -> IO ()
-foreign import ccall unsafe archive_entry_set_symlink :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_set_symlink_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_symlink :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_symlink_w :: Ptr ArchiveEntry -> CWString -> IO ()
-foreign import ccall unsafe archive_entry_update_symlink_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
-foreign import ccall unsafe archive_entry_set_uid :: Ptr ArchiveEntry -> Id -> IO ()
-foreign import ccall unsafe archive_entry_set_uname :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_set_uname_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_uname :: Ptr ArchiveEntry -> CString -> IO ()
-foreign import ccall unsafe archive_entry_copy_uname_w :: Ptr ArchiveEntry -> CWString -> IO ()
-foreign import ccall unsafe archive_entry_update_uname_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
-foreign import ccall unsafe archive_entry_stat :: Ptr ArchiveEntry -> IO (Ptr Stat)
-foreign import ccall unsafe archive_entry_copy_stat :: Ptr ArchiveEntry -> Ptr Stat -> IO ()
-foreign import ccall unsafe archive_entry_mac_metadata :: Ptr ArchiveEntry -> Ptr CSize -> IO (Ptr a)
-foreign import ccall unsafe archive_entry_copy_mac_metadata :: Ptr ArchiveEntry -> Ptr a -> CSize -> IO ()
+foreign import ccall archive_entry_set_atime :: Ptr ArchiveEntry -> CTime -> CLong -> IO ()
+foreign import ccall archive_entry_unset_atime :: Ptr ArchiveEntry -> IO ()
+foreign import ccall archive_entry_set_birthtime :: Ptr ArchiveEntry -> CTime -> CLong -> IO ()
+foreign import ccall archive_entry_unset_birthtime :: Ptr ArchiveEntry -> IO ()
+foreign import ccall archive_entry_set_ctime :: Ptr ArchiveEntry -> CTime -> CLong -> IO ()
+foreign import ccall archive_entry_unset_ctime :: Ptr ArchiveEntry -> IO ()
+foreign import ccall archive_entry_set_dev :: Ptr ArchiveEntry -> Int64 -> IO ()
+foreign import ccall archive_entry_set_devmajor :: Ptr ArchiveEntry -> Int64 -> IO ()
+foreign import ccall archive_entry_set_devminor :: Ptr ArchiveEntry -> Int64 -> IO ()
+foreign import ccall archive_entry_set_filetype :: Ptr ArchiveEntry -> FileType -> IO ()
+foreign import ccall archive_entry_set_fflags :: Ptr ArchiveEntry -> CULong -> CULong -> IO ()
+foreign import ccall archive_entry_copy_fflags_text :: Ptr ArchiveEntry -> CString -> IO CString
+foreign import ccall archive_entry_copy_fflags_text_w :: Ptr ArchiveEntry -> CWString -> IO CWString
+foreign import ccall archive_entry_set_gid :: Ptr ArchiveEntry -> Id -> IO ()
+foreign import ccall archive_entry_set_gname :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_set_gname_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_gname :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_gname_w :: Ptr ArchiveEntry -> CWString -> IO ()
+foreign import ccall archive_entry_update_gname_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
+foreign import ccall archive_entry_set_hardlink :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_set_hardlink_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_hardlink :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_hardlink_w :: Ptr ArchiveEntry -> CWString -> IO ()
+foreign import ccall archive_entry_update_hardlink_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
+foreign import ccall archive_entry_set_ino :: Ptr ArchiveEntry -> Int64 -> IO ()
+foreign import ccall archive_entry_set_ino64 :: Ptr ArchiveEntry -> Int64 -> IO ()
+foreign import ccall archive_entry_set_link :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_set_link_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_link :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_link_w :: Ptr ArchiveEntry -> CWString -> IO ()
+foreign import ccall archive_entry_update_link_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
+foreign import ccall archive_entry_set_mode :: Ptr ArchiveEntry -> CMode -> IO ()
+foreign import ccall archive_entry_set_mtime :: Ptr ArchiveEntry -> CTime -> CLong -> IO ()
+foreign import ccall archive_entry_unset_mtime :: Ptr ArchiveEntry -> IO ()
+foreign import ccall archive_entry_set_nlink :: Ptr ArchiveEntry -> CUInt -> IO ()
+foreign import ccall archive_entry_set_pathname :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_set_pathname_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_pathname :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_pathname_w :: Ptr ArchiveEntry -> CWString -> IO ()
+foreign import ccall archive_entry_update_pathname_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
+foreign import ccall archive_entry_set_perm :: Ptr ArchiveEntry -> CMode -> IO ()
+foreign import ccall archive_entry_set_rdev :: Ptr ArchiveEntry -> Int64 -> IO ()
+foreign import ccall archive_entry_set_rdevmajor :: Ptr ArchiveEntry -> Int64 -> IO ()
+foreign import ccall archive_entry_set_rdevminor :: Ptr ArchiveEntry -> Int64 -> IO ()
+foreign import ccall archive_entry_set_size :: Ptr ArchiveEntry -> Int64 -> IO ()
+foreign import ccall archive_entry_unset_size :: Ptr ArchiveEntry -> IO ()
+foreign import ccall archive_entry_copy_sourcepath :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_sourcepath_w :: Ptr ArchiveEntry -> CWString -> IO ()
+foreign import ccall archive_entry_set_symlink :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_set_symlink_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_symlink :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_symlink_w :: Ptr ArchiveEntry -> CWString -> IO ()
+foreign import ccall archive_entry_update_symlink_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
+foreign import ccall archive_entry_set_uid :: Ptr ArchiveEntry -> Id -> IO ()
+foreign import ccall archive_entry_set_uname :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_set_uname_utf8 :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_uname :: Ptr ArchiveEntry -> CString -> IO ()
+foreign import ccall archive_entry_copy_uname_w :: Ptr ArchiveEntry -> CWString -> IO ()
+foreign import ccall archive_entry_update_uname_utf8 :: Ptr ArchiveEntry -> CString -> IO CInt
+foreign import ccall archive_entry_stat :: Ptr ArchiveEntry -> IO (Ptr Stat)
+foreign import ccall archive_entry_copy_stat :: Ptr ArchiveEntry -> Ptr Stat -> IO ()
+foreign import ccall archive_entry_mac_metadata :: Ptr ArchiveEntry -> Ptr CSize -> IO (Ptr a)
+foreign import ccall archive_entry_copy_mac_metadata :: Ptr ArchiveEntry -> Ptr a -> CSize -> IO ()
 
-foreign import ccall unsafe archive_entry_acl_clear :: Ptr ArchiveEntry -> IO ()
-foreign import ccall unsafe archive_entry_acl_add_entry :: Ptr ArchiveEntry -> EntryACL -> EntryACL -> EntryACL -> CInt -> CString -> IO ArchiveError
-foreign import ccall unsafe archive_entry_acl_add_entry_w :: Ptr ArchiveEntry -> EntryACL -> EntryACL -> EntryACL -> CInt -> CWString -> IO ArchiveError
-foreign import ccall unsafe archive_entry_acl_reset :: Ptr ArchiveEntry -> EntryACL -> IO CInt
-foreign import ccall unsafe archive_entry_acl_next :: Ptr ArchiveEntry -> EntryACL -> EntryACL -> EntryACL -> EntryACL -> CInt -> Ptr CString -> IO ArchiveError
--- foreign import ccall unsafe archive_entry_acl_next_w :: Ptr ArchiveEntry -> EntryACL -> EntryACL -> EntryACL -> EntryACL -> CInt -> Ptr CWString -> IO ArchiveError
+foreign import ccall archive_entry_acl_clear :: Ptr ArchiveEntry -> IO ()
+foreign import ccall archive_entry_acl_add_entry :: Ptr ArchiveEntry -> EntryACL -> EntryACL -> EntryACL -> CInt -> CString -> IO ArchiveError
+foreign import ccall archive_entry_acl_add_entry_w :: Ptr ArchiveEntry -> EntryACL -> EntryACL -> EntryACL -> CInt -> CWString -> IO ArchiveError
+foreign import ccall archive_entry_acl_reset :: Ptr ArchiveEntry -> EntryACL -> IO CInt
+foreign import ccall archive_entry_acl_next :: Ptr ArchiveEntry -> EntryACL -> EntryACL -> EntryACL -> EntryACL -> CInt -> Ptr CString -> IO ArchiveError
+-- foreign import ccall archive_entry_acl_next_w :: Ptr ArchiveEntry -> EntryACL -> EntryACL -> EntryACL -> EntryACL -> CInt -> Ptr CWString -> IO ArchiveError
 
--- foreign import ccall unsafe archive_entry_acl_to_text_w :: Ptr ArchiveEntry -> CSize -> EntryACL -> IO CWString
--- foreign import ccall unsafe archive_entry_acl_to_text :: Ptr ArchiveEntry -> CSize -> EntryACL -> IO CString
--- foreign import ccall unsafe archive_entry_acl_from_text :: Ptr ArchiveEntry -> CString -> EntryACL -> IO ArchiveError
--- foreign import ccall unsafe archive_entry_acl_from_text_w :: Ptr ArchiveEntry -> CWString -> EntryACL -> IO ArchiveError
--- foreign import ccall unsafe archive_entry_acl_types :: Ptr ArchiveEntry -> IO EntryACL
--- foreign import ccall unsafe archive_entry_count :: Ptr ArchiveEntry -> EntryACL -> IO CInt
+-- foreign import ccall archive_entry_acl_to_text_w :: Ptr ArchiveEntry -> CSize -> EntryACL -> IO CWString
+-- foreign import ccall archive_entry_acl_to_text :: Ptr ArchiveEntry -> CSize -> EntryACL -> IO CString
+-- foreign import ccall archive_entry_acl_from_text :: Ptr ArchiveEntry -> CString -> EntryACL -> IO ArchiveError
+-- foreign import ccall archive_entry_acl_from_text_w :: Ptr ArchiveEntry -> CWString -> EntryACL -> IO ArchiveError
+-- foreign import ccall archive_entry_acl_types :: Ptr ArchiveEntry -> IO EntryACL
+-- foreign import ccall archive_entry_count :: Ptr ArchiveEntry -> EntryACL -> IO CInt
 
 -- don't bother with archive_entry_acl
 
-foreign import ccall unsafe archive_entry_xattr_clear :: Ptr ArchiveEntry -> IO ()
-foreign import ccall unsafe archive_entry_xattr_add_entry :: Ptr ArchiveEntry -> CString -> Ptr a -> CSize -> IO ()
-foreign import ccall unsafe archive_entry_xattr_count :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_xattr_reset :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_xattr_next :: Ptr ArchiveEntry -> Ptr CString -> Ptr (Ptr a) -> Ptr CSize -> IO ArchiveError
+foreign import ccall archive_entry_xattr_clear :: Ptr ArchiveEntry -> IO ()
+foreign import ccall archive_entry_xattr_add_entry :: Ptr ArchiveEntry -> CString -> Ptr a -> CSize -> IO ()
+foreign import ccall archive_entry_xattr_count :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_xattr_reset :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_xattr_next :: Ptr ArchiveEntry -> Ptr CString -> Ptr (Ptr a) -> Ptr CSize -> IO ArchiveError
 -- TODO: higher level archiveEntryXattrList?
 
-foreign import ccall unsafe archive_entry_sparse_clear :: Ptr ArchiveEntry -> IO ()
-foreign import ccall unsafe archive_entry_sparse_add_entry :: Ptr ArchiveEntry -> Int64 -> Int64 -> IO ()
-foreign import ccall unsafe archive_entry_sparse_count :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_sparse_reset :: Ptr ArchiveEntry -> IO CInt
-foreign import ccall unsafe archive_entry_sparse_next :: Ptr ArchiveEntry -> Ptr Int64 -> Ptr Int64 -> IO ArchiveError
+foreign import ccall archive_entry_sparse_clear :: Ptr ArchiveEntry -> IO ()
+foreign import ccall archive_entry_sparse_add_entry :: Ptr ArchiveEntry -> Int64 -> Int64 -> IO ()
+foreign import ccall archive_entry_sparse_count :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_sparse_reset :: Ptr ArchiveEntry -> IO CInt
+foreign import ccall archive_entry_sparse_next :: Ptr ArchiveEntry -> Ptr Int64 -> Ptr Int64 -> IO ArchiveError
 
-foreign import ccall unsafe archive_entry_linkresolver_new :: Ptr LinkResolver
-foreign import ccall unsafe archive_entry_linkresolver_set_strategy :: Ptr LinkResolver -> ArchiveFormat -> IO ()
-foreign import ccall unsafe archive_entry_linkresolver_free :: Ptr LinkResolver -> IO ()
-foreign import ccall unsafe archive_entry_linkify :: Ptr LinkResolver -> Ptr (Ptr ArchiveEntry) -> Ptr (Ptr ArchiveEntry) -> IO ()
-foreign import ccall unsafe archive_entry_partial_links :: Ptr LinkResolver -> Ptr CUInt -> IO (Ptr ArchiveEntry)
+foreign import ccall archive_entry_linkresolver_new :: Ptr LinkResolver
+foreign import ccall archive_entry_linkresolver_set_strategy :: Ptr LinkResolver -> ArchiveFormat -> IO ()
+foreign import ccall archive_entry_linkresolver_free :: Ptr LinkResolver -> IO ()
+foreign import ccall archive_entry_linkify :: Ptr LinkResolver -> Ptr (Ptr ArchiveEntry) -> Ptr (Ptr ArchiveEntry) -> IO ()
+foreign import ccall archive_entry_partial_links :: Ptr LinkResolver -> Ptr CUInt -> IO (Ptr ArchiveEntry)
 
 -- stupid function to work around some annoying C quirk
 mode_t :: Integer -> FileType
diff --git a/src/Codec/Archive/Pack.hs b/src/Codec/Archive/Pack.hs
--- a/src/Codec/Archive/Pack.hs
+++ b/src/Codec/Archive/Pack.hs
@@ -75,6 +75,9 @@
 entriesToBSzip = unsafePerformIO . entriesToBSGeneral archive_write_set_format_zip
 {-# NOINLINE entriesToBSzip #-}
 
+-- entriesToBSLGeneral :: Foldable t => (Ptr Archive -> IO ArchiveError) -> t Entry -> IO BSL.ByteString
+-- entriesToBSLGeneral =
+
 -- | Internal function to be used with 'archive_write_set_format_pax' etc.
 entriesToBSGeneral :: (Foldable t) => (Ptr Archive -> IO ArchiveError) -> t Entry -> IO BS.ByteString
 entriesToBSGeneral modifier hsEntries' = do
diff --git a/src/Codec/Archive/Unpack.hs b/src/Codec/Archive/Unpack.hs
--- a/src/Codec/Archive/Unpack.hs
+++ b/src/Codec/Archive/Unpack.hs
@@ -1,17 +1,65 @@
 module Codec.Archive.Unpack ( hsEntries
                             , unpackEntriesFp
+                            , unpackArchive
+                            , readArchiveFile
+                            , readArchiveBS
+                            , unpackToDir
                             ) where
 
+import           Codec.Archive.Common
 import           Codec.Archive.Foreign
 import           Codec.Archive.Types
-import           Control.Monad         (void)
+import           Control.Monad         (void, (<=<))
+import           Data.ByteString       (useAsCStringLen)
 import qualified Data.ByteString       as BS
 import           Foreign.C.String
 import           Foreign.Marshal.Alloc (alloca, allocaBytes)
 import           Foreign.Ptr           (Ptr)
 import           Foreign.Storable      (Storable (..))
 import           System.FilePath       ((</>))
+import           System.IO.Unsafe      (unsafePerformIO)
 
+
+-- | Read an archive contained in a 'BS.ByteString'. The format of the archive is
+-- automatically detected.
+readArchiveBS :: BS.ByteString -> [Entry]
+readArchiveBS = unsafePerformIO . (actFree hsEntries <=< bsToArchive)
+{-# NOINLINE readArchiveBS #-}
+
+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
+
+-- | Read an archive from a file. The format of the archive is automatically
+-- detected.
+readArchiveFile :: FilePath -> IO [Entry]
+readArchiveFile = actFree hsEntries <=< archiveFile
+
+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
+
+-- | This is more efficient than
+--
+-- @
+-- unpackToDir "llvm" =<< BS.readFile "llvm.tar"
+-- @
+unpackArchive :: FilePath -- ^ Filepath pointing to archive
+              -> FilePath -- ^ Dirctory to unpack in
+              -> IO ()
+unpackArchive tarFp dirFp = do
+    a <- archiveFile tarFp
+    unpackEntriesFp a dirFp
+    void $ archive_read_free a
+
 readEntry :: Ptr Archive -> Ptr ArchiveEntry -> IO Entry
 readEntry a entry =
     Entry
@@ -89,3 +137,10 @@
         then pure Nothing
         else Just <$> peek ptr
 
+unpackToDir :: FilePath -- ^ Directory to unpack in
+            -> BS.ByteString -- ^ 'BS.ByteString' containing archive
+            -> IO ()
+unpackToDir fp bs = do
+    a <- bsToArchive bs
+    unpackEntriesFp a fp
+    void $ archive_read_free a
diff --git a/src/Codec/Archive/Unpack/Lazy.hs b/src/Codec/Archive/Unpack/Lazy.hs
new file mode 100644
--- /dev/null
+++ b/src/Codec/Archive/Unpack/Lazy.hs
@@ -0,0 +1,70 @@
+module Codec.Archive.Unpack.Lazy ( readArchiveBSL
+                                 , bslToArchive
+                                 , unpackToDirLazy
+                                 ) where
+
+import           Codec.Archive.Common
+import           Codec.Archive.Foreign
+import           Codec.Archive.Types
+import           Codec.Archive.Unpack
+import           Control.Monad         (void, (<=<))
+import           Data.ByteString       (useAsCStringLen)
+import qualified Data.ByteString.Lazy  as BSL
+import           Data.Functor          (($>))
+import           Data.IORef            (modifyIORef, newIORef, readIORef)
+import           Foreign.C.Types
+import           Foreign.Marshal.Alloc (free, mallocBytes)
+import           Foreign.Ptr
+import           Foreign.Storable      (poke)
+import           System.IO.Unsafe      (unsafePerformIO)
+
+foreign import ccall memcpy :: Ptr a -- ^ Destination
+                            -> Ptr b -- ^ Source
+                            -> CSize -- ^ Size
+                            -> IO (Ptr a) -- ^ Pointer to destination
+
+unpackToDirLazy :: FilePath -- ^ Directory to unpack in
+                -> BSL.ByteString -- ^ 'BSL.ByteString' containing archive
+                -> IO ()
+unpackToDirLazy fp bs = do
+    (a, act) <- bslToArchive bs
+    unpackEntriesFp a fp
+    void $ archive_read_free a
+    act
+
+-- | Read an archive lazily. The format of the archive is automatically
+-- detected.
+readArchiveBSL :: BSL.ByteString -> [Entry]
+readArchiveBSL = unsafePerformIO . (actFreeCallback hsEntries <=< bslToArchive)
+
+freeBits :: FunPtr a -> Ptr b -> IO ()
+freeBits fp ptr = freeHaskellFunPtr fp *> free ptr
+
+-- | Lazily stream a 'BSL.ByteString'
+bslToArchive :: BSL.ByteString
+             -> IO (Ptr Archive, IO ()) -- ^ Returns an 'IO' action that can be used to free things after we're done with the archive
+bslToArchive bs = do
+    a <- archive_read_new
+    void $ archive_read_support_format_all a
+    bufPtr <- mallocBytes (32 * 1024) -- default to 32k byte chunks; should really do something more rigorous
+    bsChunksRef <- newIORef bsChunks
+    rc <- mkReadCallback (readBSL bsChunksRef bufPtr)
+    cc <- mkCloseCallback (\_ ptr -> freeHaskellFunPtr rc *> free ptr $> archiveOk)
+    nothingPtr <- mallocBytes 0
+    sequence_ [ archive_read_set_read_callback a rc
+              , archive_read_set_close_callback a cc
+              , archive_read_set_callback_data a nothingPtr
+              , archive_read_open1 a
+              ]
+    let act = freeBits cc bufPtr
+    pure (a, act)
+    where readBSL bsRef bufPtr _ _ dataPtr = do
+                bs' <- readIORef bsRef
+                case bs' of
+                    [] -> pure 0
+                    (x:_) -> do
+                        modifyIORef bsRef tail
+                        useAsCStringLen x $ \(charPtr, sz) -> do
+                            void $ memcpy bufPtr charPtr (fromIntegral sz)
+                            poke dataPtr bufPtr $> fromIntegral sz
+          bsChunks = BSL.toChunks bs
