sockets-0.4.0.0: src-internal/Socket/AddrLength.hs
{-# language DuplicateRecordFields #-}
module Socket.AddrLength
( Buffer
, advance
, length
, sendOnce
, receiveOnce
) where
import Prelude hiding (length)
import Data.Bytes.Types (UnmanagedBytes(UnmanagedBytes))
import Posix.Socket (uninterruptibleSend,noSignal)
import Posix.Socket (uninterruptibleReceive)
import Foreign.C.Types (CSize)
import Foreign.C.Error (Errno)
import System.Posix.Types (Fd)
import qualified Data.Primitive.Addr as PM
type Buffer = UnmanagedBytes
advance :: UnmanagedBytes -> Int -> UnmanagedBytes
{-# inline advance #-}
advance (UnmanagedBytes addr len) n = UnmanagedBytes (PM.plusAddr addr n) (len - n)
length :: UnmanagedBytes -> Int
{-# inline length #-}
length (UnmanagedBytes _ len) = len
sendOnce :: Fd -> UnmanagedBytes -> IO (Either Errno CSize)
{-# inline sendOnce #-}
sendOnce fd (UnmanagedBytes addr len) =
uninterruptibleSend fd addr (intToCSize len) noSignal
receiveOnce :: Fd -> UnmanagedBytes -> IO (Either Errno CSize)
{-# inline receiveOnce #-}
receiveOnce fd (UnmanagedBytes addr len) =
uninterruptibleReceive fd addr (intToCSize len) mempty
intToCSize :: Int -> CSize
{-# inline intToCSize #-}
intToCSize = fromIntegral