blob: e5e812070ba4ebf4c1ba65daa8b9d1c40f5c15bd [file]
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DisambiguateRecordFields #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -F -pgmFderive -optF-F #-}
module FFI where
import Data.Functor.Const (Const(..))
import Foreign
import Foreign.Ptr
import Foreign.C.String
import Foreign.C.Types
import System.IO.Unsafe
import Test.QuickCheck.Arbitrary
import Test.QuickCheck.Gen
import Util
-- /////////////////////////////////////////////////////////////////////////////
tag_ENUM_Error = Tag 0
tag_ENUM_Success = Tag 1
tag_ENUM_TObjData = Tag 2
tag_ENUM_TObjDel = Tag 3
tag_ENUM_TObjDentarr = Tag 4
tag_ENUM_TObjInode = Tag 5
tag_ENUM_TObjPad = Tag 5
tag_ENUM_TObjSummary = Tag 6
tag_ENUM_TObjSuper = Tag 7
data Ct24 = Ct24 { p1 :: Ptr CSysState, p2 :: Ct23 } deriving Show
instance Storable Ct24 where
sizeOf _ = 40
alignment _ = 8
peek ptr = Ct24 <$> (\p -> peekByteOff p 0) ptr <*> (\p -> peekByteOff p 8) ptr
poke ptr (Ct24 f1 f2) = (\p -> pokeByteOff p 0) ptr f1 >> (\p -> pokeByteOff p 8) ptr f2
data Ct23 = Ct23 {
tag :: Ctag_t
, error :: Ct22
, success :: Ptr Ct20
} deriving Show
instance Storable Ct23 where
sizeOf _ = 32
alignment _ = 8
peek ptr = Ct23 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 24) ptr
poke ptr (Ct23 f1 f2 f3) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 8 ) ptr f2
(\p -> pokeByteOff p 24) ptr f3
data Ct22 = Ct22 { p1 :: Cu32, p2 :: Ptr Ct20 } deriving Show
instance Storable Ct22 where
sizeOf _ = 16
alignment _ = 8
peek ptr = Ct22 <$> (\p -> peekByteOff p 0) ptr <*> (\p -> peekByteOff p 8) ptr
poke ptr (Ct22 p1 p2) = (\p -> pokeByteOff p 0) ptr p1 >> (\p -> pokeByteOff p 8) ptr p2
data Ct21 = Ct21 { p1 :: Ptr CSysState, p2 :: Ptr Ct19, p3 :: Ptr Ct20 } deriving Show
instance Storable Ct21 where
sizeOf _ = 24
alignment _ = 8
peek ptr = Ct21 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 16) ptr
poke ptr (Ct21 p1 p2 p3) = do
(\p -> pokeByteOff p 0 ) ptr p1
(\p -> pokeByteOff p 8 ) ptr p2
(\p -> pokeByteOff p 16) ptr p3
data Ct19 = Ct19 {
eb_recovery :: Cu32
, eb_recovery_offs :: Cu32
, super :: Ptr Ct9
, obj_sup :: Ptr Ct18
, super_offs :: Cu32
, vol :: Ptr CUbiVolInfo
, dev :: Ptr CUbiDevInfo
, no_summary :: Cbool_t
} deriving Show
instance Storable Ct19 where
sizeOf _ = 56
alignment _ = 8
peek ptr = Ct19 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 4 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 16) ptr
<*> (\p -> peekByteOff p 24) ptr
<*> (\p -> peekByteOff p 32) ptr
<*> (\p -> peekByteOff p 40) ptr
<*> (\p -> peekByteOff p 48) ptr
poke ptr (Ct19 f1 f2 f3 f4 f5 f6 f7 f8) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 4 ) ptr f2
(\p -> pokeByteOff p 8 ) ptr f3
(\p -> pokeByteOff p 16) ptr f4
(\p -> pokeByteOff p 24) ptr f5
(\p -> pokeByteOff p 32) ptr f6
(\p -> pokeByteOff p 40) ptr f7
(\p -> pokeByteOff p 48) ptr f8
data Ct20 = Ct20 {
nb_free_eb :: Cu32
, used_eb :: Ptr (CWordArray Cu8 )
, dirty_space :: Ptr (CWordArray Cu32)
, gim :: Ptr (CRbt Cu64 Ct3)
} deriving Show
instance Storable Ct20 where
sizeOf _ = 32
alignment _ = 8
peek ptr = Ct20 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 16) ptr
<*> (\p -> peekByteOff p 24) ptr
poke ptr (Ct20 f1 f2 f3 f4) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 8 ) ptr f2
(\p -> pokeByteOff p 16) ptr f3
(\p -> pokeByteOff p 24) ptr f4
data Ct18 = Ct18 {
magic :: Cu32
, crc :: Cu32
, sqnum :: Cu64
, offs :: Cu32
, trans :: Cu8
, otype :: Cu8
, ounion :: Ct17
}
instance Storable Ct18 where
sizeOf _ = 96
alignment _ = 8
peek ptr = Ct18 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 4 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 16) ptr
<*> (\p -> peekByteOff p 20) ptr
<*> (\p -> peekByteOff p 22) ptr
<*> (\p -> peekByteOff p 24) ptr
poke ptr (Ct18 f1 f2 f3 f4 f5 f6 f7) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 4 ) ptr f2
(\p -> pokeByteOff p 8 ) ptr f3
(\p -> pokeByteOff p 16) ptr f4
(\p -> pokeByteOff p 20) ptr f5
(\p -> pokeByteOff p 22) ptr f6
(\p -> pokeByteOff p 24) ptr f7
data Ct17 = Ct17 {
tag :: Ctag_t
, tObjData :: Ct10
, tObjDel :: Ct11
, tObjDentarr :: Ptr Ct13
, tObjInode :: Ptr Ct14
, tObjPad :: Cunit_t
, tObjSummary :: Ptr Ct16
, tObjSuper :: Ptr Ct9
}
instance Storable Ct17 where
sizeOf _ = 72
alignment _ = 8
peek ptr = Ct17 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 24) ptr
<*> (\p -> peekByteOff p 32) ptr
<*> (\p -> peekByteOff p 40) ptr
<*> (\p -> peekByteOff p 48) ptr
<*> (\p -> peekByteOff p 56) ptr
<*> (\p -> peekByteOff p 64) ptr
poke ptr (Ct17 f1 f2 f3 f4 f5 f6 f7 f8) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 8 ) ptr f2
(\p -> pokeByteOff p 24) ptr f3
(\p -> pokeByteOff p 32) ptr f4
(\p -> pokeByteOff p 40) ptr f5
(\p -> pokeByteOff p 48) ptr f6
(\p -> pokeByteOff p 56) ptr f7
(\p -> pokeByteOff p 64) ptr f8
data Ct13 = Ct13 {
id :: Cu64
, nb_dentry :: Cu32
, entries :: Ptr (CArray Ct12)
}
instance Storable Ct13 where
sizeOf _ = 24
alignment _ = 8
peek ptr = Ct13 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 16) ptr
poke ptr (Ct13 f1 f2 f3) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 8 ) ptr f2
(\p -> pokeByteOff p 16) ptr f3
newtype Ct11 = Ct11 { id :: Cu64 } deriving (Storable)
data Ct10 = Ct10 { id :: Cu64, odata :: Ptr (CWordArray Cu8) }
instance Storable Ct10 where
sizeOf _ = 16
alignment _ = 8
peek ptr = Ct10 <$> (\p -> peekByteOff p 0) ptr <*> (\p -> peekByteOff p 8) ptr
poke ptr (Ct10 id odata) = (\p -> pokeByteOff p 0) ptr id >> (\p -> pokeByteOff p 8) ptr odata
data Ct12 = Ct12 {
ino :: Cu32
, dtype :: Cu8
, nlen :: Cu16
, name :: Ptr (CWordArray Cu8)
}
instance Storable Ct12 where
sizeOf _ = 16
alignment _ = 8
peek ptr = Ct12 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 4 ) ptr
<*> (\p -> peekByteOff p 6 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
poke ptr (Ct12 f1 f2 f3 f4) = do
(\p -> pokeByteOff p 0) ptr f1
(\p -> pokeByteOff p 4) ptr f2
(\p -> pokeByteOff p 6) ptr f3
(\p -> pokeByteOff p 8) ptr f4
data Ct14 = Ct14 {
id :: Cu64
, size :: Cu64
, atime_sec :: Cu64
, ctime_sec :: Cu64
, mtime_sec :: Cu64
, nlink :: Cu32
, uid :: Cu32
, gid :: Cu32
, mode :: Cu32
, flags :: Cu32
}
instance Storable Ct14 where
sizeOf _ = 64
alignment _ = 8
peek ptr = Ct14 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 16) ptr
<*> (\p -> peekByteOff p 24) ptr
<*> (\p -> peekByteOff p 32) ptr
<*> (\p -> peekByteOff p 40) ptr
<*> (\p -> peekByteOff p 44) ptr
<*> (\p -> peekByteOff p 48) ptr
<*> (\p -> peekByteOff p 52) ptr
<*> (\p -> peekByteOff p 56) ptr
poke ptr (Ct14 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 8 ) ptr f2
(\p -> pokeByteOff p 16) ptr f3
(\p -> pokeByteOff p 24) ptr f4
(\p -> pokeByteOff p 32) ptr f5
(\p -> pokeByteOff p 40) ptr f6
(\p -> pokeByteOff p 44) ptr f7
(\p -> pokeByteOff p 48) ptr f8
(\p -> pokeByteOff p 52) ptr f9
(\p -> pokeByteOff p 56) ptr f10
data Ct16 = Ct16 {
nb_sum_entry :: Cu32
, entries :: Ptr (CWordArray Ct15)
, sum_offs :: Cu32
}
instance Storable Ct16 where
sizeOf _ = 24
alignment _ = 8
peek ptr = Ct16 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 16) ptr
poke ptr (Ct16 f1 f2 f3) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 8 ) ptr f2
(\p -> pokeByteOff p 16) ptr f3
data Ct9 = Ct9 {
nb_eb :: Cu32
, eb_size :: Cu32
, io_size :: Cu32
, nb_reserved_gc :: Cu32
, nb_reserved_del :: Cu32
, cur_eb :: Cu32
, cur_offs :: Cu32
, last_inum :: Cu32
, next_sqnum :: Cu64
}
instance Storable Ct9 where
sizeOf _ = 40
alignment _ = 8
peek ptr = Ct9 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 4 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 12) ptr
<*> (\p -> peekByteOff p 16) ptr
<*> (\p -> peekByteOff p 20) ptr
<*> (\p -> peekByteOff p 24) ptr
<*> (\p -> peekByteOff p 28) ptr
<*> (\p -> peekByteOff p 32) ptr
poke ptr (Ct9 f1 f2 f3 f4 f5 f6 f7 f8 f9) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 4 ) ptr f2
(\p -> pokeByteOff p 8 ) ptr f3
(\p -> pokeByteOff p 12) ptr f4
(\p -> pokeByteOff p 16) ptr f5
(\p -> pokeByteOff p 20) ptr f6
(\p -> pokeByteOff p 24) ptr f7
(\p -> pokeByteOff p 28) ptr f8
(\p -> pokeByteOff p 32) ptr f9
data Ct3 = Ct3 {
count :: Cu16
, sqnum :: Cu64
}
instance Storable Ct3 where
sizeOf _ = 16
alignment _ = 8
peek ptr = Ct3 <$> (\p -> peekByteOff p 0) ptr <*> (\p -> peekByteOff p 8) ptr
poke ptr (Ct3 count sqnum) = (\p -> pokeByteOff p 0) ptr count >> (\p -> pokeByteOff p 8) ptr sqnum
data Ct15 = Ct15 {
id :: Cu64
, sqnum :: Cu64
, len :: Cu32
, del_flags_and_offs :: Cu32
, count :: Cu16
}
instance Storable Ct15 where
sizeOf _ = 32
alignment _ = 8
peek ptr = Ct15 <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 16) ptr
<*> (\p -> peekByteOff p 20) ptr
<*> (\p -> peekByteOff p 24) ptr
poke ptr (Ct15 f1 f2 f3 f4 f5) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 8 ) ptr f2
(\p -> pokeByteOff p 16) ptr f3
(\p -> pokeByteOff p 20) ptr f4
(\p -> pokeByteOff p 24) ptr f5
type CUbiVolInfo = Cubi_volume_info
data Cubi_volume_info = Cubi_volume_info {
ubi_num :: CInt
, vol_id :: CInt
, size :: CInt
, used_bytes :: CLLong
, used_ebs :: CInt
, vol_type :: CInt
, corrupted :: CInt
, upd_marker :: CInt
, alignment :: CInt
, usable_leb_size :: CInt
, name_len :: CInt
, name :: Ptr CChar
, cdev :: Cdev_t
} deriving (Show)
{-!
deriving instance Arbitrary Cubi_volume_info
!-}
instance Storable Cubi_volume_info where
sizeOf _ = 72
alignment _ = 8
peek ptr = Cubi_volume_info <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 4 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 16) ptr
<*> (\p -> peekByteOff p 24) ptr
<*> (\p -> peekByteOff p 28) ptr
<*> (\p -> peekByteOff p 32) ptr
<*> (\p -> peekByteOff p 36) ptr
<*> (\p -> peekByteOff p 40) ptr
<*> (\p -> peekByteOff p 44) ptr
<*> (\p -> peekByteOff p 48) ptr
<*> (\p -> peekByteOff p 56) ptr
<*> (\p -> peekByteOff p 64) ptr
poke ptr (Cubi_volume_info f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 4 ) ptr f2
(\p -> pokeByteOff p 8 ) ptr f3
(\p -> pokeByteOff p 16) ptr f4
(\p -> pokeByteOff p 24) ptr f5
(\p -> pokeByteOff p 28) ptr f6
(\p -> pokeByteOff p 32) ptr f7
(\p -> pokeByteOff p 36) ptr f8
(\p -> pokeByteOff p 40) ptr f9
(\p -> pokeByteOff p 44) ptr f10
(\p -> pokeByteOff p 48) ptr f11
(\p -> pokeByteOff p 56) ptr f12
(\p -> pokeByteOff p 64) ptr f13
type Cdev_t = C__kernel_dev_t
type C__kernel_dev_t = C__u32
type C__u32 = Word32
type CUbiDevInfo = Cubi_device_info
data Cubi_device_info = Cubi_device_info {
ubi_num :: CInt
, leb_size :: CInt
, leb_start :: CInt
, min_io_size :: CInt
, max_write_size :: CInt
, ro_mode :: CInt
, cdev :: Cdev_t
} deriving (Show)
instance Storable Cubi_device_info where
sizeOf _ = 28
alignment _ = 4
peek ptr = Cubi_device_info <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 4 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 12) ptr
<*> (\p -> peekByteOff p 16) ptr
<*> (\p -> peekByteOff p 20) ptr
<*> (\p -> peekByteOff p 24) ptr
poke ptr (Cubi_device_info f1 f2 f3 f4 f5 f6 f7) = do
(\p -> pokeByteOff p 0 ) ptr f1
(\p -> pokeByteOff p 4 ) ptr f2
(\p -> pokeByteOff p 8 ) ptr f3
(\p -> pokeByteOff p 12) ptr f4
(\p -> pokeByteOff p 16) ptr f5
(\p -> pokeByteOff p 20) ptr f6
(\p -> pokeByteOff p 24) ptr f7
{-!
deriving instance Arbitrary Cubi_device_info
!-}
data CArray t = CArray {
len :: CInt
, values :: Ptr (Ptr t)
}
instance Storable t => Storable (CArray t) where
sizeOf _ = 16
alignment _ = 8
peek ptr = CArray <$> (\p -> peekByteOff p 0) ptr
<*> (\p -> peekByteOff p 8) ptr
poke ptr (CArray len values) = do
(\p -> pokeByteOff p 0) ptr len
(\p -> pokeByteOff p 8) ptr values
data CWordArray t = CWordArray {
len :: CInt
, values :: Ptr t
}
instance (Storable t) => Storable (CWordArray t) where
sizeOf _ = 16
alignment _ = 8
peek ptr = CWordArray <$> (\p -> peekByteOff p 0) ptr
<*> (\p -> peekByteOff p 8) ptr
poke ptr (CWordArray len values) = do
(\p -> pokeByteOff p 0) ptr len
(\p -> pokeByteOff p 8) ptr values
newtype CRbt k v = CRbt { rbt :: Crbt_root k v } deriving (Eq, Ord, Show, Storable, Functor, Traversable, Foldable)
instance Functor (Flip CRbt v) where
fmap f (Flip (CRbt r)) = Flip (CRbt $ ffmap f r)
instance Traversable (Flip CRbt v) where
traverse f (Flip (CRbt r)) = Flip <$> (CRbt <$> ttraverse f r)
instance Foldable (Flip CRbt v) where
foldMap f a = getConst $ traverse (Const . f) a
newtype Crbt_root k v = Crbt_root { root :: Ptr (Crbt_node k v) } deriving (Eq, Ord, Show, Storable)
instance Functor (Crbt_root k) where
fmap _ (Crbt_root r) = Crbt_root $ castPtr r
instance Functor (Flip Crbt_root v) where
fmap _ (Flip (Crbt_root r)) = Flip (Crbt_root $ castPtr r)
instance Traversable (Crbt_root k) where
traverse _ (Crbt_root r) = pure $ Crbt_root $ castPtr r
instance Traversable (Flip Crbt_root v) where
traverse _ (Flip (Crbt_root r)) = pure $ Flip $ Crbt_root $ castPtr r
instance Foldable (Crbt_root k) where
foldMap f a = getConst $ traverse (Const . f) a
instance Foldable (Flip Crbt_root v) where
foldMap f a = getConst $ traverse (Const . f) a
data Crbt_node k v = Crbt_node {
rbt_parent_color :: CULong
, rbt_left :: Ptr (Crbt_node k v)
, rbt_right :: Ptr (Crbt_node k v)
} deriving (Eq, Ord, Show)
instance (Arbitrary k, Arbitrary v) => Arbitrary (CRbt k v) where
arbitrary = CRbt <$> arbitrary
instance (Arbitrary k, Arbitrary v) => Arbitrary (Crbt_root k v) where
arbitrary = pure $ Crbt_root nullPtr
instance (Arbitrary k, Arbitrary v) => Arbitrary (Crbt_node k v) where
arbitrary = undefined -- TODO
instance Storable (Crbt_node k v) where
sizeOf _ = 24
alignment _ = 8
peek ptr = Crbt_node <$> (\p -> peekByteOff p 0 ) ptr
<*> (\p -> peekByteOff p 8 ) ptr
<*> (\p -> peekByteOff p 16) ptr
poke ptr (Crbt_node rbt_parent_color rbt_left rbt_right) = do
(\p -> pokeByteOff p 0 ) ptr rbt_parent_color
(\p -> pokeByteOff p 8 ) ptr rbt_left
(\p -> pokeByteOff p 16) ptr rbt_right
instance (Arbitrary t, Storable t) => Arbitrary (Ptr t) where
arbitrary = arbitrary >>= \x -> return (unsafePerformIO (new x)) -- FIXME
data Cffi_fsm_init_ds = Cffi_fsm_init_ds { ret :: Ptr Ct24, ds :: Ptr Bool }
instance Storable Cffi_fsm_init_ds where
sizeOf _ = 16
alignment _ = 8
peek ptr = Cffi_fsm_init_ds <$> (\p -> peekByteOff p 0) ptr
<*> (\p -> peekByteOff p 8) ptr
poke ptr (Cffi_fsm_init_ds ret ds) = do
(\p -> pokeByteOff p 0) ptr ret
(\p -> pokeByteOff p 8) ptr ds