packages feed

sockets-0.5.0.0: src-internal/Socket/Destined/IPv4/UnmanagedBytes.hs

{-# language BangPatterns #-}
{-# language DataKinds #-}
{-# language NamedFieldPuns #-}

module Socket.Destined.IPv4.UnmanagedBytes
  ( Buffer
  , Peer
  , advance
  , length
  , send
  ) where

import Prelude hiding (length)

import Data.Bytes.Types (UnmanagedBytes(UnmanagedBytes))
import Foreign.C.Error (Errno)
import Foreign.C.Types (CInt,CSize)
import GHC.Exts (RealWorld)
import Net.Types (IPv4(..))
import Socket.IPv4 (Peer(..))
import Socket.AddrLength (advance,length)
import System.Posix.Types (Fd)
import qualified Posix.Socket as S

type Buffer = UnmanagedBytes

send :: Peer -> Fd -> UnmanagedBytes -> IO (Either Errno CSize)
send !dst !sock (UnmanagedBytes arr len) =
  S.uninterruptibleSendToInternet sock arr
    (intToCSize len)
    mempty
    (endpointToSocketAddressInternet dst)

endpointToSocketAddressInternet :: Peer -> S.SocketAddressInternet
endpointToSocketAddressInternet (Peer {address, port}) =
  S.SocketAddressInternet
    { S.port = S.hostToNetworkShort port
    , S.address = S.hostToNetworkLong (getIPv4 address)
    }

intToCInt :: Int -> CInt
intToCInt = fromIntegral

intToCSize :: Int -> CSize
intToCSize = fromIntegral