packages feed

gore-and-ash-network-1.1.0.0: henet/Network/ENet/Internal.hs

module Network.ENet.Internal where

import Network.Socket.Internal

import Foreign

import Data.Endian
import Data.Endian.Unsafe( unsafeUnwrapBigEndian
                         , unsafeAssertBigEndian)

import Network.ENet.Bindings

toENetAddress :: SockAddr -> Address
toENetAddress (SockAddrInet port ip) =
  Address ip $ fromBigEndian $ unsafeAssertBigEndian $ fromIntegral port
toENetAddress _ = error "Unsupported enet address!"

toSockAddr :: Address -> SockAddr
toSockAddr (Address ip port) =
  SockAddrInet (fromIntegral $ unsafeUnwrapBigEndian $ toBigEndian $ port) ip

withMaybeDo :: Storable a => Maybe a -> (Ptr a -> IO b) -> IO b
withMaybeDo (Just val) f = alloca $ \ptr -> poke ptr val >> f ptr
withMaybeDo Nothing    f = f nullPtr