{-# LANGUAGE ForeignFunctionInterface #-} module System.Zfs.Lowlevel where import Data.Int import Data.Word import Foreign.C import Foreign.C.String import Foreign.Ptr data LibzfsHandle type LibzfsHandlePtr = Ptr LibzfsHandle data ZpoolHandle type ZpoolHandlePtr = Ptr ZpoolHandle data ZfsHandle type ZfsHandlePtr = Ptr ZfsHandle data Nvlist type NvlistPtr = Ptr Nvlist data Nvpair type NvpairPtr = Ptr Nvpair data VdevState type VdevStatePtr = Ptr VdevState type ZpoolIterF a = FunPtr (ZpoolHandlePtr -> Ptr a -> IO Int) type ZfsIterF a = FunPtr (ZfsHandlePtr -> Ptr a -> IO Int) foreign import ccall "libzfs_init" libzfs_init :: IO LibzfsHandlePtr foreign import ccall "libzfs_fini" libzfs_fini :: LibzfsHandlePtr -> IO () foreign import ccall "&libzfs_fini" libzfs_fini_ :: FunPtr (LibzfsHandlePtr -> IO ()) foreign import ccall "zpool_open_canfail" zpool_open :: LibzfsHandlePtr -> CString -> IO ZpoolHandlePtr foreign import ccall "zpool_close" zpool_close :: ZpoolHandlePtr -> IO () foreign import ccall "&zpool_close" zpool_close_ :: FunPtr (ZpoolHandlePtr -> IO()) foreign import ccall "zpool_get_name" zpool_get_name :: ZpoolHandlePtr -> IO CString foreign import ccall "libzfs_errno" libzfs_errno :: LibzfsHandlePtr -> IO Int foreign import ccall "zpool_get_state" zpool_get_state :: ZpoolHandlePtr -> IO Int foreign import ccall "zpool_iter" zpool_iter :: LibzfsHandlePtr -> ZpoolIterF a -> Ptr a -> IO Int foreign import ccall "zpool_create" zpool_create :: LibzfsHandlePtr -> CString -> NvlistPtr -> NvlistPtr -> NvlistPtr -> IO Int foreign import ccall "zpool_destroy" zpool_destroy :: ZpoolHandlePtr -> CString -> IO Int foreign import ccall "zpool_enable_datasets" zpool_enable_datasets :: ZpoolHandlePtr -> CString -> Int -> IO Int foreign import ccall "zpool_disable_datasets" zpool_disable_datasets :: ZpoolHandlePtr -> Bool -> IO Int foreign import ccall "zpool_add" zpool_add :: ZpoolHandlePtr -> NvlistPtr -> IO Int foreign import ccall "wrapper" wrap_zpool_iter :: (ZpoolHandlePtr -> Ptr a -> IO Int) -> IO (FunPtr (ZpoolHandlePtr -> Ptr a -> IO Int)) foreign import ccall "zpool_get_config" zpool_get_config :: ZpoolHandlePtr -> Ptr NvlistPtr -> IO NvlistPtr foreign import ccall "zpool_get_features" zpool_get_features :: ZpoolHandlePtr -> IO NvlistPtr foreign import ccall "zfs_iter_root" zfs_iter_root :: LibzfsHandlePtr -> ZfsIterF a -> Ptr a -> IO Int foreign import ccall "zfs_iter_children" zfs_iter_children :: ZfsHandlePtr -> ZfsIterF a -> Ptr a -> IO Int foreign import ccall "zfs_iter_filesystems" zfs_iter_filesystems :: ZfsHandlePtr -> ZfsIterF a -> Ptr a -> IO Int foreign import ccall "zfs_iter_snapshots" zfs_iter_snapshots :: ZfsHandlePtr -> ZfsIterF a -> Ptr a -> IO Int foreign import ccall "zfs_get_name" zfs_get_name :: ZfsHandlePtr -> IO CString foreign import ccall "zfs_get_type" zfs_get_type :: ZfsHandlePtr -> IO Int foreign import ccall "wrapper" wrap_zfs_iter :: (ZfsHandlePtr -> Ptr a -> IO Int) -> IO (FunPtr (ZfsHandlePtr -> Ptr a -> IO Int)) foreign import ccall "zfs_open" zfs_open :: LibzfsHandlePtr -> CString -> Int -> IO ZfsHandlePtr foreign import ccall "zfs_close" zfs_close :: ZfsHandlePtr -> IO () foreign import ccall "&zfs_close" zfs_close_ :: FunPtr (ZfsHandlePtr -> IO ()) foreign import ccall "zfs_is_mounted" zfs_is_mounted :: ZfsHandlePtr -> Ptr CString -> IO Bool foreign import ccall "zfs_mount" zfs_mount :: ZfsHandlePtr -> CString -> Int -> IO Int foreign import ccall "zfs_unmount" zfs_unmount :: ZfsHandlePtr -> CString -> Int -> IO Int foreign import ccall "zfs_unmountall" zfs_unmountall :: ZfsHandlePtr -> Int -> IO Int foreign import ccall "zfs_create" zfs_create :: LibzfsHandlePtr -> CString -> Int -> NvlistPtr -> IO Int foreign import ccall "zfs_destroy" zfs_destroy :: ZfsHandlePtr -> Bool -> IO Int foreign import ccall "zpool_vdev_name" zpool_vdev_name :: LibzfsHandlePtr -> ZpoolHandlePtr -> NvlistPtr -> Bool -> IO CString foreign import ccall "zpool_vdev_online" zpool_vdev_online :: ZpoolHandlePtr -> CString -> Int -> VdevStatePtr -> IO Int foreign import ccall "zpool_vdev_offline" zpool_vdev_offline :: ZpoolHandlePtr -> CString -> Bool -> IO Int foreign import ccall "zpool_vdev_attach" zpool_vdev_attach :: ZpoolHandlePtr -> CString -> CString -> NvlistPtr -> Bool -> IO Int foreign import ccall "zpool_vdev_detach" zpool_vdev_detach :: ZpoolHandlePtr -> CString -> IO Int foreign import ccall "zpool_vdev_remove" zpool_vdev_remove :: ZpoolHandlePtr -> CString -> IO Int foreign import ccall "nvlist_alloc" nvlist_alloc :: Ptr NvlistPtr -> CUInt -> CInt -> IO Int foreign import ccall "nvlist_free" nvlist_free :: NvlistPtr -> IO () foreign import ccall "nvlist_size" nvlist_size :: NvlistPtr -> Ptr CSize -> Int -> IO Int foreign import ccall "nvlist_add_boolean_value" nvlist_add_boolean :: NvlistPtr -> CString -> Bool -> IO Int foreign import ccall "nvlist_add_byte" nvlist_add_byte :: NvlistPtr -> CString -> CUChar -> IO Int foreign import ccall "nvlist_add_int8" nvlist_add_int8 :: NvlistPtr -> CString -> Int8 -> IO Int foreign import ccall "nvlist_add_uint8" nvlist_add_uint8 :: NvlistPtr -> CString -> Word8 -> IO Int foreign import ccall "nvlist_add_int16" nvlist_add_int16 :: NvlistPtr -> CString -> Int16 -> IO Int foreign import ccall "nvlist_add_uint16" nlist_add_uint16 :: NvlistPtr -> CString -> Word16 -> IO Int foreign import ccall "nvlist_add_int32" nvlist_add_int32 :: NvlistPtr -> CString -> Int32 -> IO Int foreign import ccall "nvlist_add_uint32" nvlist_add_uint32 :: NvlistPtr -> CString -> Word32 -> IO Int foreign import ccall "nvlist_add_int64" nvlist_add_int64 :: NvlistPtr -> CString -> Int64 -> IO Int foreign import ccall "nvlist_add_uint64" nvlist_add_uint64 :: NvlistPtr -> CString -> Word64 -> IO Int foreign import ccall "nvlist_add_string" nvlist_add_string :: NvlistPtr -> CString -> CString -> IO Int foreign import ccall "nvlist_add_nvlist" nvlist_add_nvlist :: NvlistPtr -> CString -> NvlistPtr -> IO Int foreign import ccall "nvlist_add_nvlist_array" nvlist_add_nvlist_array :: NvlistPtr -> CString -> Ptr NvlistPtr -> CUInt -> IO Int foreign import ccall "nvlist_remove_all" nvlist_remove :: NvlistPtr -> CString -> IO Int foreign import ccall "nvlist_lookup_boolean_value" nvlist_lookup_boolean :: NvlistPtr -> CString -> Ptr Bool -> IO Int foreign import ccall "nvlist_lookup_byte" nvlist_lookup_byte :: NvlistPtr -> CString -> Ptr CUChar -> IO Int foreign import ccall "nvlist_lookup_uint64" nvlist_lookup_uint64 :: NvlistPtr -> CString -> Ptr Word64 -> IO Int foreign import ccall "nvlist_lookup_nvlist" nvlist_lookup_nvlist :: NvlistPtr -> CString -> Ptr NvlistPtr -> IO Int foreign import ccall "nvlist_lookup_nvlist_array" nvlist_lookup_nvlist_array :: NvlistPtr -> CString -> Ptr (Ptr NvlistPtr) -> Ptr CUInt -> IO Int foreign import ccall "nvlist_lookup_string" nvlist_lookup_string :: NvlistPtr -> CString -> Ptr CString -> IO Int foreign import ccall "nvlist_next_nvpair" nvlist_next_nvpair :: NvlistPtr -> NvpairPtr -> IO NvpairPtr foreign import ccall "nvlist_prev_nvpair" nvlist_prev_nvpair :: NvlistPtr -> NvpairPtr -> IO NvpairPtr foreign import ccall "nvpair_name" nvpair_name :: NvpairPtr -> IO CString foreign import ccall "nvpair_type" nvpair_type :: NvpairPtr -> IO Int