module System.Posix.Socket.Inet
( AF_INET
, pattern AF_INET
, AF_INET6
, pattern AF_INET6
) where
import Data.Typeable (Typeable)
import Data.Proxy (Proxy(..))
import Network.IP.Addr
import Control.Applicative ((<$>), (<*>))
import Foreign.C.Types (CSize)
import Foreign.Storable (Storable(..))
import System.Posix.Socket
data AF_INET deriving Typeable
pattern AF_INET ∷ Proxy AF_INET
pattern AF_INET = Proxy
instance SockAddr Inet4Addr where
sockAddrMaxSize _ = (16)
sockAddrSize _ = (16)
peekSockAddr p sz =
if sz /= (16)
then ioError $ userError $
"peekSockAddr(Inet4Addr): invalid size " ++ show sz ++
" (expected " ++ show ((16) ∷ CSize) ++ ")"
else InetAddr <$> (\hsc_ptr -> peekByteOff hsc_ptr 4) p
<*> (\hsc_ptr -> peekByteOff hsc_ptr 2) p
pokeSockAddr p (InetAddr addr port) = do
(\hsc_ptr -> pokeByteOff hsc_ptr 2) p port
(\hsc_ptr -> pokeByteOff hsc_ptr 4) p addr
instance SockFamily AF_INET where
type SockFamilyAddr AF_INET = Inet4Addr
sockFamilyCode _ = 2
data AF_INET6 deriving Typeable
pattern AF_INET6 ∷ Proxy AF_INET6
pattern AF_INET6 = Proxy
instance SockAddr Inet6Addr where
sockAddrMaxSize _ = (28)
sockAddrSize _ = (28)
peekSockAddr p sz =
if sz /= (28)
then ioError $ userError $
"peekSockAddr(Inet6Addr): invalid size " ++ show sz ++
" (expected " ++ show ((28) ∷ CSize) ++ ")"
else InetAddr <$> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
<*> (\hsc_ptr -> peekByteOff hsc_ptr 2) p
pokeSockAddr p (InetAddr addr port) = do
(\hsc_ptr -> pokeByteOff hsc_ptr 2) p port
(\hsc_ptr -> pokeByteOff hsc_ptr 8) p addr
instance SockFamily AF_INET6 where
type SockFamilyAddr AF_INET6 = Inet6Addr
sockFamilyCode _ = 10