packages feed

libarchive-1.0.3.0: src/Codec/Archive/Foreign/Archive.chs

-- | This module corresponds to @archive.h@
module Codec.Archive.Foreign.Archive ( -- * Direct bindings (read)
                                       archive_read_new
                                     , archive_read_data_skip
                                     , archive_read_data
                                     , archive_read_data_block
                                     , archive_read_free
                                     , archive_read_extract
                                     , archive_read_open_filename
                                     , archive_read_open_filename_w
                                     , archive_read_support_filter_all
                                     , archive_read_support_filter_bzip2
                                     , archive_read_support_filter_compress
                                     , archive_read_support_filter_gzip
                                     , archive_read_support_filter_grzip
                                     , archive_read_support_filter_lrzip
                                     , archive_read_support_filter_lz4
                                     , archive_read_support_filter_lzip
                                     , archive_read_support_filter_lzma
                                     , archive_read_support_filter_lzop
                                     , archive_read_support_filter_none
                                     , archive_read_support_filter_program
                                     , archive_read_support_filter_program_signature
                                     , archive_read_support_filter_rpm
                                     , archive_read_support_filter_uu
                                     , archive_read_support_filter_xz
                                     , archive_read_support_format_7zip
                                     , archive_read_support_format_all
                                     , archive_read_support_format_ar
                                     , archive_read_add_passphrase
                                     , archive_read_set_passphrase_callback
                                     , archive_read_extract2
                                     , archive_read_extract_set_progress_callback
                                     , archive_read_extract_set_skip_file
                                     , archive_read_close
                                     , archive_read_support_format_by_code
                                     , archive_read_support_format_cab
                                     , archive_read_support_format_cpio
                                     , archive_read_support_format_empty
                                     , archive_read_support_format_gnutar
                                     , archive_read_support_format_iso9660
                                     , archive_read_support_format_lha
                                     , archive_read_support_format_mtree
                                     , archive_read_support_format_rar
                                     , archive_read_support_format_raw
                                     , archive_read_support_format_tar
                                     , archive_read_support_format_warc
                                     , archive_read_support_format_xar
                                     , archive_read_support_format_zip
                                     , archive_read_support_format_zip_streamable
                                     , archive_read_support_format_zip_seekable
                                     , archive_read_set_format
                                     , archive_read_append_filter
                                     , archive_read_append_filter_program
                                     , archive_read_append_filter_program_signature
                                     , archive_read_set_open_callback
                                     , archive_read_set_read_callback
                                     , archive_read_set_seek_callback
                                     , archive_read_set_skip_callback
                                     , archive_read_set_close_callback
                                     , archive_read_set_switch_callback
                                     , archive_read_set_callback_data
                                     , archive_read_set_callback_data2
                                     , archive_read_add_callback_data
                                     , archive_read_append_callback_data
                                     , archive_read_prepend_callback_data
                                     , archive_read_open1
                                     , archive_read_open
                                     , archive_read_open2
                                     , archive_read_open_filenames
                                     , archive_read_open_memory
                                     , archive_read_open_memory2
                                     , archive_read_open_fd
                                     , archive_read_next_header
                                     , archive_read_next_header2
                                     , archive_read_header_position
                                     , archiveReadHasEncryptedEntries
                                     , archive_read_format_capabilities
                                     , archive_seek_data
                                     , archive_read_data_into_fd
                                     , archive_read_set_format_option
                                     , archive_read_set_filter_option
                                     , archive_read_set_option
                                     , archive_read_set_options
                                     , archive_read_disk_new
                                     , archive_read_disk_set_symlink_logical
                                     , archive_read_disk_set_symlink_physical
                                     , archive_read_disk_set_symlink_hybrid
                                     , archive_read_disk_entry_from_file
                                     , archive_read_disk_gname
                                     , archive_read_disk_uname
                                     , archive_read_disk_set_standard_lookup
                                     , archive_read_disk_set_gname_lookup
                                     , archive_read_disk_set_uname_lookup
                                     , archive_read_disk_open
                                     , archive_read_disk_open_w
                                     , archive_read_disk_descend
                                     , archiveReadDiskCanDescend
                                     , archive_read_disk_current_filesystem
                                     , archiveReadDiskCurrentFilesystemIsSynthetic
                                     , archiveReadDiskCurrentFilesystemIsRemote
                                     , archive_read_disk_set_atime_restored
                                     , archive_read_disk_set_behavior
                                     , archive_read_disk_set_matching
                                     , archive_read_disk_set_metadata_filter_callback
                                     -- * Direct bindings (write)
                                     , archive_write_set_bytes_per_block
                                     , archive_write_get_bytes_per_block
                                     , archive_write_set_bytes_in_last_block
                                     , archive_write_get_bytes_in_last_block
                                     , archive_write_set_skip_file
                                     , archive_write_add_filter
                                     , archive_write_add_filter_by_name
                                     , archive_write_add_filter_b64encode
                                     , archive_write_add_filter_bzip2
                                     , archive_write_add_filter_compress
                                     , archive_write_add_filter_grzip
                                     , archive_write_add_filter_gzip
                                     , archive_write_add_filter_lrzip
                                     , archive_write_add_filter_lz4
                                     , archive_write_add_filter_lzip
                                     , archive_write_add_filter_lzma
                                     , archive_write_add_filter_lzop
                                     , archive_write_add_filter_none
                                     , archive_write_add_filter_program
                                     , archive_write_add_filter_uuencode
                                     , archive_write_add_filter_xz
                                     , archive_write_data
                                     , archive_write_new
                                     , archive_write_free
                                     , archive_write_set_format_pax_restricted
                                     , archive_write_header
                                     , archive_write_set_format
                                     , archive_write_set_format_by_name
                                     , archive_write_set_format_7zip
                                     , archive_write_set_format_ar_bsd
                                     , archive_write_set_format_ar_svr4
                                     , archive_write_set_format_cpio
                                     , archive_write_set_format_cpio_newc
                                     , archive_write_set_format_gnutar
                                     , archive_write_set_format_iso9660
                                     , archive_write_set_format_mtree
                                     , archive_write_set_format_mtree_classic
                                     , archive_write_set_format_pax
                                     , archive_write_set_format_raw
                                     , archive_write_set_format_shar
                                     , archive_write_set_format_shar_dump
                                     , archive_write_set_format_ustar
                                     , archive_write_set_format_v7tar
                                     , archive_write_set_format_warc
                                     , archive_write_set_format_xar
                                     , archive_write_set_format_zip
                                     , archive_write_set_format_filter_by_ext
                                     , archive_write_set_format_filter_by_ext_def
                                     , archive_write_zip_set_compression_deflate
                                     , archive_write_zip_set_compression_store
                                     , archive_write_open
                                     , archive_write_open_fd
                                     , archive_write_open_filename
                                     , archive_write_open_filename_w
                                     , archive_write_open_memory
                                     , archive_write_data_block
                                     , archive_write_finish_entry
                                     , archive_write_close
                                     , archive_write_fail
                                     , archive_write_set_format_option
                                     , archive_write_set_filter_option
                                     , archive_write_set_option
                                     , archive_write_set_options
                                     , archive_write_set_passphrase
                                     , archive_write_set_passphrase_callback
                                     , archive_write_disk_new
                                     , archive_write_disk_set_skip_file
                                     , archive_write_disk_set_options
                                     , archive_write_disk_set_standard_lookup
                                     , archive_write_disk_set_group_lookup
                                     , archive_write_disk_set_user_lookup
                                     , archive_write_disk_gid
                                     , archive_write_disk_uid
                                     -- * Direct bindings (archive error)
                                     , archive_errno
                                     , archive_error_string
                                     , archive_format_name
                                     , archive_format
                                     , archive_clear_error
                                     , archive_set_error
                                     , archive_copy_error
                                     , archive_file_count
                                     -- * Direct bindings (archive match)
                                     , archive_match_new
                                     , archive_match_free
                                     , archiveMatchExcluded
                                     , archiveMatchPathExcluded
                                     , archive_match_exclude_pattern
                                     , archive_match_exclude_pattern_w
                                     , archiveMatchExcludePatternFromFile
                                     , archiveMatchExcludePatternFromFileW
                                     , archive_match_include_pattern
                                     , archive_match_include_pattern_w
                                     , archiveMatchIncludePatternFromFile
                                     , archiveMatchIncludePatternFromFileW
                                     , archive_match_path_unmatched_inclusions
                                     , archive_match_path_unmatched_inclusions_next
                                     , archive_match_path_unmatched_inclusions_next_w
                                     , archiveMatchTimeExcluded
                                     , archive_match_include_time
                                     , archive_match_include_date
                                     , archive_match_include_date_w
                                     , archive_match_include_file_time
                                     , archive_match_include_file_time_w
                                     , archive_match_exclude_entry
                                     , archiveMatchOwnerExcluded
                                     , archive_match_include_uid
                                     , archive_match_include_gid
                                     , archive_match_include_uname
                                     , archive_match_include_uname_w
                                     , archive_match_include_gname
                                     , archive_match_include_gname_w
                                     -- * Direct bindings (version\/filter\/miscellaneous)
                                     , archive_version_number
                                     , archive_version_string
                                     , archive_version_details
                                     , archive_free
                                     , archive_filter_count
                                     , archive_filter_bytes
                                     , archive_filter_code
                                     , archive_filter_name
                                     -- * Version macros
                                     , archiveVersionNumber
                                     , archiveVersionOnlyString
                                     , archiveVersionString
                                     -- * Capability macros
                                     , archiveReadFormatCapsNone
                                     , archiveReadFormatCapsEncryptData
                                     , archiveReadFormatCapsEncryptMetadata
                                     -- * Header read macros
                                     , archiveOk
                                     , archiveEOF
                                     , archiveRetry
                                     , archiveWarn
                                     , archiveFailed
                                     , archiveFatal
                                     -- * Time matching macros
                                     , archiveMatchMTime
                                     , archiveMatchCTime
                                     , archiveMatchNewer
                                     , archiveMatchOlder
                                     , archiveMatchEqual
                                     -- * Entry flags
                                     , archiveExtractOwner
                                     , archiveExtractPerm
                                     , archiveExtractTime
                                     , archiveExtractNoOverwrite
                                     , archiveExtractUnlink
                                     , archiveExtractACL
                                     , archiveExtractFFlags
                                     , archiveExtractXattr
                                     , archiveExtractSecureSymlinks
                                     , archiveExtractSecureNoDotDot
                                     , archiveExtractNoAutodir
                                     , archiveExtractSparse
                                     , archiveExtractMacMetadata
                                     , archiveExtractNoHfsCompression
                                     , archiveExtractHfsCompressionForced
                                     , archiveExtractSecureNoAbsolutePaths
                                     , archiveExtractClearNoChangeFFlags
                                     -- * Filters
                                     , archiveFilterNone
                                     , archiveFilterGzip
                                     , archiveFilterBzip2
                                     , archiveFilterCompress
                                     , archiveFilterProgram
                                     , archiveFilterLzma
                                     , archiveFilterXz
                                     , archiveFilterUu
                                     , archiveFilterRpm
                                     , archiveFilterLzip
                                     , archiveFilterLrzip
                                     , archiveFilterLzop
                                     , archiveFilterGrzip
                                     , archiveFilterLz4
                                     -- * Formats
                                     , archiveFormatCpio
                                     , archiveFormatShar
                                     , archiveFormatTar
                                     , archiveFormatIso9660
                                     , archiveFormatZip
                                     , archiveFormatEmpty
                                     , archiveFormatAr
                                     , archiveFormatMtree
                                     , archiveFormatRaw
                                     , archiveFormatXar
                                     , archiveFormatLha
                                     , archiveFormatCab
                                     , archiveFormatRar
                                     , archiveFormat7zip
                                     , archiveFormatWarc
                                     -- * Read disk flags
                                     , archiveReadDiskRestoreATime
                                     , archiveReadDiskHonorNoDump
                                     , archiveReadDiskMacCopyFile
                                     , archiveReadDiskNoTraverseMounts
                                     , archiveReadDiskNoXattr
                                     -- * Abstract types
                                     , Archive
                                     -- * Haskell types
                                     , ArchiveEncryption (..)
                                     -- * Lower-level API types
                                     , ArchiveError
                                     , Flags
                                     , ArchiveFilter
                                     , ArchiveFormat
                                     , ArchiveCapabilities
                                     , ReadDiskFlags
                                     , TimeFlag
                                     -- * Callback types
                                     , ArchiveReadCallback
                                     , ArchiveSkipCallback
                                     , ArchiveSeekCallback
                                     , ArchiveWriteCallback
                                     , ArchiveOpenCallback
                                     , ArchiveCloseCallback
                                     , ArchiveSwitchCallback
                                     , ArchivePassphraseCallback
                                     -- * Callback constructors
                                     , mkReadCallback
                                     , mkSkipCallback
                                     , mkSeekCallback
                                     , mkWriteCallback
                                     , mkOpenCallback
                                     , mkCloseCallback
                                     , mkSwitchCallback
                                     , mkPassphraseCallback
                                     , mkWriteLookup
                                     , mkReadLookup
                                     , mkCleanup
                                     , mkMatch
                                     , mkFilter
                                     ) where

import Codec.Archive.Foreign.Common
import Control.Composition ((.*), (.**))
import Data.Bits (Bits (..))
import Data.Int (Int64)
import Codec.Archive.Types
import Foreign.C.String
import Foreign.C.Types
import Foreign.Ptr (FunPtr, Ptr)
import System.Posix.Types (Fd (..))

-- Miscellaneous
foreign import ccall archive_version_number :: CInt
foreign import ccall archive_version_string :: CString
foreign import ccall archive_version_details :: CString

-- destructors: use "dynamic" instead of "wrapper" (but we don't want that)
-- callbacks
foreign import ccall "wrapper" mkReadCallback :: ArchiveReadCallback a b -> IO (FunPtr (ArchiveReadCallback a b))
foreign import ccall "wrapper" mkSkipCallback :: ArchiveSkipCallback a -> IO (FunPtr (ArchiveSkipCallback a))
foreign import ccall "wrapper" mkSeekCallback :: ArchiveSeekCallback a -> IO (FunPtr (ArchiveSeekCallback a))
foreign import ccall "wrapper" mkWriteCallback :: ArchiveWriteCallback a b -> IO (FunPtr (ArchiveWriteCallback a b))
foreign import ccall "wrapper" mkOpenCallback :: ArchiveOpenCallback a -> IO (FunPtr (ArchiveOpenCallback a))
foreign import ccall "wrapper" mkCloseCallback :: ArchiveCloseCallback a -> IO (FunPtr (ArchiveCloseCallback a))
foreign import ccall "wrapper" mkSwitchCallback :: ArchiveSwitchCallback a b -> IO (FunPtr (ArchiveSwitchCallback a b))
foreign import ccall "wrapper" mkPassphraseCallback :: ArchivePassphraseCallback a -> IO (FunPtr (ArchivePassphraseCallback a))

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 ()))

foreign import ccall "wrapper" mkMatch :: (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO ()) -> IO (FunPtr (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO ()))
foreign import ccall "wrapper" preMkFilter :: (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO CInt) -> IO (FunPtr (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO CInt))

mkFilter :: (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO Bool) -> IO (FunPtr (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO CInt))
mkFilter f = let f' = fmap boolToInt .** f in preMkFilter f'

boolToInt :: Integral a => Bool -> a
boolToInt False = 0
boolToInt True = 1

type ArchiveReadCallback a b = Ptr Archive -> Ptr a -> Ptr (Ptr b) -> IO CSize
type ArchiveSkipCallback a = Ptr Archive -> Ptr a -> Int64 -> IO Int64
type ArchiveSeekCallback a = Ptr Archive -> Ptr a -> Int64 -> CInt -> IO Int64
type ArchiveWriteCallback a b = Ptr Archive -> Ptr a -> Ptr b -> CSize -> IO CSize
type ArchiveOpenCallback a = Ptr Archive -> Ptr a -> IO ArchiveError
type ArchiveCloseCallback a = Ptr Archive -> Ptr a -> IO ArchiveError
type ArchiveSwitchCallback a b = Ptr Archive -> Ptr a -> Ptr b -> IO ArchiveError
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 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 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 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 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 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 unsafe archive_read_close :: Ptr Archive -> IO ArchiveError
foreign import ccall unsafe 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 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 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 unsafe 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 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 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 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 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 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 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 unsafe 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 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 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

#include <archive.h>

archiveVersionNumber :: Int
archiveVersionNumber = {# const ARCHIVE_VERSION_NUMBER #}

archiveVersionOnlyString :: String
archiveVersionOnlyString = {# const ARCHIVE_VERSION_ONLY_STRING #}

archiveVersionString :: String
archiveVersionString = {# const ARCHIVE_VERSION_STRING #}

-- TODO: make ArchiveError a sum type
archiveOk :: ArchiveError
archiveOk = ArchiveError {# const ARCHIVE_OK #}

archiveEOF :: ArchiveError
archiveEOF = ArchiveError {# const ARCHIVE_EOF #}

archiveRetry :: ArchiveError
archiveRetry = ArchiveError ({# const ARCHIVE_RETRY #})

archiveWarn :: ArchiveError
archiveWarn = ArchiveError ({# const ARCHIVE_WARN #})

archiveFailed :: ArchiveError
archiveFailed = ArchiveError ({# const ARCHIVE_FAILED #})

archiveFatal :: ArchiveError
archiveFatal = ArchiveError ({# const ARCHIVE_FATAL #})

-- Archive filter
archiveFilterNone :: ArchiveFilter
archiveFilterNone = ArchiveFilter {# const ARCHIVE_FILTER_NONE #}

archiveFilterGzip :: ArchiveFilter
archiveFilterGzip = ArchiveFilter {# const ARCHIVE_FILTER_GZIP #}

archiveFilterBzip2 :: ArchiveFilter
archiveFilterBzip2 = ArchiveFilter {# const ARCHIVE_FILTER_BZIP2 #}

archiveFilterCompress :: ArchiveFilter
archiveFilterCompress = ArchiveFilter {# const ARCHIVE_FILTER_COMPRESS #}

archiveFilterProgram :: ArchiveFilter
archiveFilterProgram = ArchiveFilter {# const ARCHIVE_FILTER_PROGRAM #}

archiveFilterLzma :: ArchiveFilter
archiveFilterLzma = ArchiveFilter {# const ARCHIVE_FILTER_LZMA #}

archiveFilterXz :: ArchiveFilter
archiveFilterXz = ArchiveFilter {# const ARCHIVE_FILTER_XZ #}

archiveFilterUu :: ArchiveFilter
archiveFilterUu = ArchiveFilter {# const ARCHIVE_FILTER_UU #}

archiveFilterRpm :: ArchiveFilter
archiveFilterRpm = ArchiveFilter {# const ARCHIVE_FILTER_RPM #}

archiveFilterLzip :: ArchiveFilter
archiveFilterLzip = ArchiveFilter {# const ARCHIVE_FILTER_LZIP #}

archiveFilterLrzip :: ArchiveFilter
archiveFilterLrzip = ArchiveFilter {# const ARCHIVE_FILTER_LRZIP #}

archiveFilterLzop :: ArchiveFilter
archiveFilterLzop = ArchiveFilter {# const ARCHIVE_FILTER_LZOP #}

archiveFilterGrzip :: ArchiveFilter
archiveFilterGrzip = ArchiveFilter {# const ARCHIVE_FILTER_GRZIP #}

archiveFilterLz4 :: ArchiveFilter
archiveFilterLz4 = ArchiveFilter {# const ARCHIVE_FILTER_LZ4 #}

-- Extraction flags
archiveExtractOwner :: Flags
archiveExtractOwner = Flags {# const ARCHIVE_EXTRACT_OWNER #}

archiveExtractPerm :: Flags
archiveExtractPerm = Flags {# const ARCHIVE_EXTRACT_PERM #}

archiveExtractTime :: Flags
archiveExtractTime = Flags {# const ARCHIVE_EXTRACT_TIME #}

archiveExtractNoOverwrite :: Flags
archiveExtractNoOverwrite = Flags {# const ARCHIVE_EXTRACT_NO_OVERWRITE #}

archiveExtractUnlink :: Flags
archiveExtractUnlink = Flags {# const ARCHIVE_EXTRACT_UNLINK #}

archiveExtractACL :: Flags
archiveExtractACL = Flags {# const ARCHIVE_EXTRACT_ACL #}

archiveExtractFFlags :: Flags
archiveExtractFFlags = Flags {# const ARCHIVE_EXTRACT_FFLAGS #}

archiveExtractXattr :: Flags
archiveExtractXattr = Flags {# const ARCHIVE_EXTRACT_XATTR #}

archiveExtractSecureSymlinks :: Flags
archiveExtractSecureSymlinks = Flags {# const ARCHIVE_EXTRACT_SECURE_SYMLINKS #}

archiveExtractSecureNoDotDot :: Flags
archiveExtractSecureNoDotDot = Flags {# const ARCHIVE_EXTRACT_SECURE_NODOTDOT #}

archiveExtractNoAutodir :: Flags
archiveExtractNoAutodir = Flags {# const ARCHIVE_EXTRACT_NO_AUTODIR #}

-- archiveExtractNoOverwriteNewer :: Flags
-- archiveExtractNoOverwriteNewer = Flags {# const ARCHIVE_NO_OVERWRITE_NEWER #}

archiveExtractSparse :: Flags
archiveExtractSparse = Flags {# const ARCHIVE_EXTRACT_SPARSE #}

archiveExtractMacMetadata :: Flags
archiveExtractMacMetadata = Flags {# const ARCHIVE_EXTRACT_MAC_METADATA #}

archiveExtractNoHfsCompression :: Flags
archiveExtractNoHfsCompression = Flags {# const ARCHIVE_EXTRACT_NO_HFS_COMPRESSION #}

archiveExtractHfsCompressionForced :: Flags
archiveExtractHfsCompressionForced = Flags {# const ARCHIVE_EXTRACT_HFS_COMPRESSION_FORCED #}

archiveExtractSecureNoAbsolutePaths :: Flags
archiveExtractSecureNoAbsolutePaths = Flags {# const ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS #}

archiveExtractClearNoChangeFFlags :: Flags
archiveExtractClearNoChangeFFlags = Flags {# const ARCHIVE_EXTRACT_CLEAR_NOCHANGE_FFLAGS #}

archiveFormatCpio :: ArchiveFormat
archiveFormatCpio = ArchiveFormat {# const ARCHIVE_FORMAT_CPIO #}

archiveFormatShar :: ArchiveFormat
archiveFormatShar = ArchiveFormat {# const ARCHIVE_FORMAT_SHAR #}

archiveFormatTar :: ArchiveFormat
archiveFormatTar = ArchiveFormat {# const ARCHIVE_FORMAT_TAR #}

archiveFormatIso9660 :: ArchiveFormat
archiveFormatIso9660 = ArchiveFormat {# const ARCHIVE_FORMAT_ISO9660 #}

archiveFormatZip :: ArchiveFormat
archiveFormatZip = ArchiveFormat {# const ARCHIVE_FORMAT_ZIP #}

archiveFormatEmpty :: ArchiveFormat
archiveFormatEmpty = ArchiveFormat {# const ARCHIVE_FORMAT_EMPTY #}

archiveFormatAr :: ArchiveFormat
archiveFormatAr = ArchiveFormat {# const ARCHIVE_FORMAT_AR #}

archiveFormatMtree :: ArchiveFormat
archiveFormatMtree = ArchiveFormat {# const ARCHIVE_FORMAT_MTREE #}

archiveFormatRaw :: ArchiveFormat
archiveFormatRaw = ArchiveFormat {# const ARCHIVE_FORMAT_RAW #}

archiveFormatXar :: ArchiveFormat
archiveFormatXar = ArchiveFormat {# const ARCHIVE_FORMAT_XAR #}

archiveFormatLha :: ArchiveFormat
archiveFormatLha = ArchiveFormat {# const ARCHIVE_FORMAT_LHA #}

archiveFormatCab :: ArchiveFormat
archiveFormatCab = ArchiveFormat {# const ARCHIVE_FORMAT_CAB #}

archiveFormatRar :: ArchiveFormat
archiveFormatRar = ArchiveFormat {# const ARCHIVE_FORMAT_RAR #}

archiveFormat7zip :: ArchiveFormat
archiveFormat7zip = ArchiveFormat {# const ARCHIVE_FORMAT_7ZIP #}

archiveFormatWarc :: ArchiveFormat
archiveFormatWarc = ArchiveFormat {# const ARCHIVE_FORMAT_WARC #}

archiveReadHasEncryptedEntries :: Ptr Archive -> IO ArchiveEncryption
archiveReadHasEncryptedEntries = fmap encryptionResult . archive_read_has_encrypted_entries

encryptionResult :: CInt -> ArchiveEncryption
encryptionResult 0                                                        = NoEncryption
encryptionResult 1                                                        = HasEncryption
encryptionResult ({# const ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED #}) = EncryptionUnsupported
encryptionResult ({# const ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW #})   = EncryptionUnknown
encryptionResult _                                                        = error "Should not happen."

archiveReadFormatCapsNone :: ArchiveCapabilities
archiveReadFormatCapsNone = ArchiveCapabilities {# const ARCHIVE_READ_FORMAT_CAPS_NONE #}

(<<) :: Bits a => a -> Int -> a
m << n = m `shift` n

archiveReadFormatCapsEncryptData :: ArchiveCapabilities
archiveReadFormatCapsEncryptData = ArchiveCapabilities ({# const ARCHIVE_READ_FORMAT_CAPS_ENCRYPT_DATA #})

archiveReadFormatCapsEncryptMetadata :: ArchiveCapabilities
archiveReadFormatCapsEncryptMetadata = ArchiveCapabilities ({# const ARCHIVE_READ_FORMAT_CAPS_ENCRYPT_DATA #})

archiveReadDiskCanDescend :: Ptr Archive -> IO Bool
archiveReadDiskCanDescend = fmap intToBool . archive_read_disk_can_descend

archiveReadDiskCurrentFilesystemIsSynthetic :: Ptr Archive -> IO Bool
archiveReadDiskCurrentFilesystemIsSynthetic = fmap intToBool . archive_read_disk_current_filesystem_is_synthetic

archiveReadDiskCurrentFilesystemIsRemote :: Ptr Archive -> IO Bool
archiveReadDiskCurrentFilesystemIsRemote = fmap intToBool . archive_read_disk_current_filesystem_is_remote

archiveReadDiskRestoreATime :: ReadDiskFlags
archiveReadDiskRestoreATime = ReadDiskFlags {# const ARCHIVE_READDISK_RESTORE_ATIME #}

archiveReadDiskHonorNoDump :: ReadDiskFlags
archiveReadDiskHonorNoDump = ReadDiskFlags {# const ARCHIVE_READDISK_HONOR_NODUMP #}

archiveReadDiskMacCopyFile :: ReadDiskFlags
archiveReadDiskMacCopyFile = ReadDiskFlags {# const ARCHIVE_READDISK_MAC_COPYFILE #}

archiveReadDiskNoTraverseMounts :: ReadDiskFlags
archiveReadDiskNoTraverseMounts = ReadDiskFlags {# const ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS #}

archiveReadDiskNoXattr :: ReadDiskFlags
archiveReadDiskNoXattr = ReadDiskFlags {# const ARCHIVE_READDISK_NO_XATTR #}

-- archiveReadDiskNoAcl :: ReadDiskFlags
-- archiveReadDiskNoAcl = ReadDiskFlags {# const ARCHIVE_READDISK_NO_ACL #}

-- archiveReadDiskNoFFlags :: ReadDiskFlags
-- archiveReadDiskNoFFlags = ReadDiskFlags {# const ARCHIVE_READDISK_NO_FFLAGS #}

archiveMatchExcluded :: Ptr Archive -> IO Bool
archiveMatchExcluded = fmap intToBool . archive_match_excluded

archiveMatchPathExcluded :: Ptr Archive -> Ptr ArchiveEntry -> IO Bool
archiveMatchPathExcluded = fmap intToBool .* archive_match_path_excluded

archiveMatchExcludePatternFromFile :: Ptr Archive -> CString -> Bool -> IO ArchiveError
archiveMatchExcludePatternFromFile a str b = archive_match_exclude_pattern_from_file a str (boolToInt b)

archiveMatchExcludePatternFromFileW :: Ptr Archive -> CWString -> Bool -> IO ArchiveError
archiveMatchExcludePatternFromFileW a str b = archive_match_exclude_pattern_from_file_w a str (boolToInt b)

archiveMatchIncludePatternFromFile :: Ptr Archive -> CString -> Bool -> IO ArchiveError
archiveMatchIncludePatternFromFile a str b = archive_match_include_pattern_from_file a str (boolToInt b)

archiveMatchIncludePatternFromFileW :: Ptr Archive -> CString -> Bool -> IO ArchiveError
archiveMatchIncludePatternFromFileW a str b = archive_match_include_pattern_from_file_w a str (boolToInt b)

archiveMatchTimeExcluded :: Ptr Archive -> Ptr ArchiveEntry -> IO Bool
archiveMatchTimeExcluded = fmap intToBool .* archive_match_time_excluded

archiveMatchMTime :: TimeFlag
archiveMatchMTime = TimeFlag {# const ARCHIVE_MATCH_MTIME #}

archiveMatchCTime :: TimeFlag
archiveMatchCTime = TimeFlag {# const ARCHIVE_MATCH_CTIME #}

archiveMatchNewer :: TimeFlag
archiveMatchNewer = TimeFlag {# const ARCHIVE_MATCH_NEWER #}

archiveMatchOlder :: TimeFlag
archiveMatchOlder = TimeFlag {# const ARCHIVE_MATCH_OLDER #}

archiveMatchEqual :: TimeFlag
archiveMatchEqual = TimeFlag {# const ARCHIVE_MATCH_EQUAL #}

archiveMatchOwnerExcluded :: Ptr Archive -> Ptr ArchiveEntry -> IO Bool
archiveMatchOwnerExcluded = fmap intToBool .* archive_match_owner_excluded