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

-- | Internet address families.
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





-- | IPv4 socket family.
data AF_INET deriving Typeable

pattern AF_INET  Proxy AF_INET
pattern AF_INET = Proxy

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

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

-- | IPv6 socket family.
data AF_INET6 deriving Typeable

pattern AF_INET6  Proxy AF_INET6
pattern AF_INET6 = Proxy

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

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