{-# LINE 1 "src/System/Posix/Types/Iovec.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# OPTIONS_GHC -Wall -fwarn-tabs #-}
module System.Posix.Types.Iovec
(
CIovec(..)
, unsafeByteString2CIovec
, touchByteString
, unsafeUseAsCIovec
, useAsCIovec
) where
import Data.Word (Word8)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Internal as BSI
import Foreign.Ptr (Ptr)
import qualified Foreign.Ptr as FFI (castPtr, plusPtr)
import qualified Foreign.ForeignPtr as FFP
import qualified GHC.ForeignPtr as GHC_FFP
import Foreign.C.Types (CSize)
import Foreign.Storable (Storable(..))
data CIovec = CIovec
{ CIovec -> Ptr Word8
iov_base :: {-# UNPACK #-} !(Ptr Word8)
, CIovec -> CSize
iov_len :: {-# UNPACK #-} !CSize
}
{-# LINE 62 "src/System/Posix/Types/Iovec.hsc" #-}
instance Storable CIovec where
alignment :: CIovec -> Int
alignment CIovec
_ = Int
8
{-# LINE 65 "src/System/Posix/Types/Iovec.hsc" #-}
sizeOf :: CIovec -> Int
sizeOf CIovec
_ = (Int
16)
{-# LINE 67 "src/System/Posix/Types/Iovec.hsc" #-}
peek :: Ptr CIovec -> IO CIovec
peek Ptr CIovec
ptr = do
Ptr Word8
base <- (\Ptr CIovec
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr CIovec
hsc_ptr Int
0) Ptr CIovec
ptr
{-# LINE 70 "src/System/Posix/Types/Iovec.hsc" #-}
CSize
len <- (\Ptr CIovec
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr CIovec
hsc_ptr Int
8) Ptr CIovec
ptr
{-# LINE 71 "src/System/Posix/Types/Iovec.hsc" #-}
forall (m :: * -> *) a. Monad m => a -> m a
return (Ptr Word8 -> CSize -> CIovec
CIovec Ptr Word8
base CSize
len)
poke :: Ptr CIovec -> CIovec -> IO ()
poke Ptr CIovec
ptr (CIovec Ptr Word8
base CSize
len) = do
(\Ptr CIovec
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CIovec
hsc_ptr Int
0) Ptr CIovec
ptr Ptr Word8
base
{-# LINE 75 "src/System/Posix/Types/Iovec.hsc" #-}
(\Ptr CIovec
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CIovec
hsc_ptr Int
8) Ptr CIovec
ptr CSize
len
{-# LINE 76 "src/System/Posix/Types/Iovec.hsc" #-}
unsafeByteString2CIovec :: BS.ByteString -> CIovec
unsafeByteString2CIovec :: ByteString -> CIovec
unsafeByteString2CIovec (BSI.PS ForeignPtr Word8
fptr Int
offset Int
len) =
Ptr Word8 -> CSize -> CIovec
CIovec
(forall a. ForeignPtr a -> Ptr a
GHC_FFP.unsafeForeignPtrToPtr ForeignPtr Word8
fptr forall a b. Ptr a -> Int -> Ptr b
`FFI.plusPtr` Int
offset)
(forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len)
{-# INLINE unsafeByteString2CIovec #-}
touchByteString :: BS.ByteString -> IO ()
touchByteString :: ByteString -> IO ()
touchByteString (BSI.PS ForeignPtr Word8
fptr Int
_ Int
_) = forall a. ForeignPtr a -> IO ()
FFP.touchForeignPtr ForeignPtr Word8
fptr
{-# INLINE touchByteString #-}
unsafeUseAsCIovec :: BS.ByteString -> (CIovec -> IO a) -> IO a
unsafeUseAsCIovec :: forall a. ByteString -> (CIovec -> IO a) -> IO a
unsafeUseAsCIovec (BSI.PS ForeignPtr Word8
fptr Int
offset Int
len) CIovec -> IO a
io =
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
FFP.withForeignPtr ForeignPtr Word8
fptr forall a b. (a -> b) -> a -> b
$ \Ptr Word8
ptr ->
CIovec -> IO a
io (Ptr Word8 -> CSize -> CIovec
CIovec (Ptr Word8
ptr forall a b. Ptr a -> Int -> Ptr b
`FFI.plusPtr` Int
offset) (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len))
{-# INLINE unsafeUseAsCIovec #-}
useAsCIovec :: BS.ByteString -> (CIovec -> IO a) -> IO a
useAsCIovec :: forall a. ByteString -> (CIovec -> IO a) -> IO a
useAsCIovec s :: ByteString
s@(BSI.PS ForeignPtr Word8
_ Int
_ Int
len) CIovec -> IO a
io =
forall a. ByteString -> (CString -> IO a) -> IO a
BS.useAsCString ByteString
s forall a b. (a -> b) -> a -> b
$ \CString
cstr ->
CIovec -> IO a
io (Ptr Word8 -> CSize -> CIovec
CIovec (forall a b. Ptr a -> Ptr b
FFI.castPtr CString
cstr) (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len))
{-# INLINE useAsCIovec #-}