{-# LINE 1 "src/System/Posix/Socket/Inet.hsc" #-}
{-# LANGUAGE UnicodeSyntax #-}
{-# LINE 2 "src/System/Posix/Socket/Inet.hsc" #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

-- | Internet address families.
module System.Posix.Socket.Inet
  ( AF_INET(..)
  , AF_INET6(..)
  ) where

import Data.Typeable (Typeable)
import Network.IP.Addr
import Control.Applicative ((<$>), (<*>))
import Foreign.C.Types (CSize)
import Foreign.Storable (Storable(..))
import System.Posix.Socket


{-# LINE 24 "src/System/Posix/Socket/Inet.hsc" #-}

{-# LINE 25 "src/System/Posix/Socket/Inet.hsc" #-}

{-# LINE 26 "src/System/Posix/Socket/Inet.hsc" #-}

-- | IPv4 socket family.
data AF_INET = AF_INET deriving (Typeable, Eq, Show)

instance SockAddr Inet4Addr where
  sockAddrMaxSize _ = (16)
{-# LINE 32 "src/System/Posix/Socket/Inet.hsc" #-}
  sockAddrSize    _ = (16)
{-# LINE 33 "src/System/Posix/Socket/Inet.hsc" #-}
  peekSockAddr p sz =
    if sz /= (16)
{-# LINE 35 "src/System/Posix/Socket/Inet.hsc" #-}
      then ioError $ userError $
             "peekSockAddr(Inet4Addr): invalid size " ++ show sz ++
             " (expected " ++ show ((16)  CSize) ++ ")"
{-# LINE 38 "src/System/Posix/Socket/Inet.hsc" #-}
      else InetAddr <$> (\hsc_ptr -> peekByteOff hsc_ptr 4) p
{-# LINE 39 "src/System/Posix/Socket/Inet.hsc" #-}
                    <*> (\hsc_ptr -> peekByteOff hsc_ptr 2) p
{-# LINE 40 "src/System/Posix/Socket/Inet.hsc" #-}
  pokeSockAddr p (InetAddr addr port) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 2) p port
{-# LINE 42 "src/System/Posix/Socket/Inet.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 4) p addr
{-# LINE 43 "src/System/Posix/Socket/Inet.hsc" #-}

instance SockFamily AF_INET where
  type SockFamilyAddr AF_INET = Inet4Addr
  sockFamilyCode _ = 2
{-# LINE 47 "src/System/Posix/Socket/Inet.hsc" #-}

-- | IPv6 socket family.
data AF_INET6 = AF_INET6 deriving (Typeable, Eq, Show)

instance SockAddr Inet6Addr where
  sockAddrMaxSize _ = (28)
{-# LINE 53 "src/System/Posix/Socket/Inet.hsc" #-}
  sockAddrSize    _ = (28)
{-# LINE 54 "src/System/Posix/Socket/Inet.hsc" #-}
  peekSockAddr p sz =
    if sz /= (28)
{-# LINE 56 "src/System/Posix/Socket/Inet.hsc" #-}
      then ioError $ userError $
             "peekSockAddr(Inet6Addr): invalid size " ++ show sz ++
             " (expected " ++ show ((28)  CSize) ++ ")"
{-# LINE 59 "src/System/Posix/Socket/Inet.hsc" #-}
      else InetAddr <$> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 60 "src/System/Posix/Socket/Inet.hsc" #-}
                    <*> (\hsc_ptr -> peekByteOff hsc_ptr 2) p
{-# LINE 61 "src/System/Posix/Socket/Inet.hsc" #-}
  pokeSockAddr p (InetAddr addr port) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 2) p port
{-# LINE 63 "src/System/Posix/Socket/Inet.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 8) p addr
{-# LINE 64 "src/System/Posix/Socket/Inet.hsc" #-}

instance SockFamily AF_INET6 where
  type SockFamilyAddr AF_INET6 = Inet6Addr
  sockFamilyCode _ = 10
{-# LINE 68 "src/System/Posix/Socket/Inet.hsc" #-}