{-# LINE 1 "Z/IO/Network/SocketAddr.hsc" #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE UnliftedFFITypes #-}
{-# LANGUAGE PatternSynonyms    #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE MagicHash #-}

{-|
Module      : Z.IO.Network.SocketAddr
Description : TCP/UDP socket address API
Copyright   : (c) Winterland, 2018
License     : BSD
Maintainer  : drkoster@qq.com
Stability   : experimental
Portability : non-portable

This module provides necessary types and constant for low level socket address manipulating.

-}

module Z.IO.Network.SocketAddr
  ( -- * name to address
    SocketAddr(..)
  , ipv4, ipv6
  , sockAddrFamily
  , withSocketAddr
  , withSocketAddrUnsafe
  , sizeOfSocketAddr
  , withSocketAddrStorage
  , withSocketAddrStorageUnsafe
  , sizeOfSocketAddrStorage
   -- ** IPv4 address
  , InetAddr(..)
  , inetAny
  , inetBroadcast
  , inetNone
  , inetLoopback
  , inetUnspecificGroup
  , inetAllHostsGroup
  , inetMaxLocalGroup
  , inetAddrToTuple
  , tupleToInetAddr
   -- ** IPv6 address
  , Inet6Addr(..)
  , inet6Any
  , inet6Loopback
  , inet6AddrToTuple
  , tupleToInet6Addr
  , FlowInfo(..)
  , ScopeID(..)
  -- * port numbber
  , PortNumber(..)
  , portAny
  -- * family, type, protocol
  , SocketFamily(..)
  , pattern AF_UNSPEC
  , pattern AF_INET
  , pattern AF_INET6
  , SocketType(..)
  , pattern SOCK_DGRAM
  , pattern SOCK_STREAM
  , pattern SOCK_SEQPACKET
  , pattern SOCK_RAW
  , pattern SOCK_RDM
  , pattern SOCK_ANY
  , ProtocolNumber(..)
  , pattern IPPROTO_DEFAULT
  , pattern IPPROTO_IP
  , pattern IPPROTO_TCP
  , pattern IPPROTO_UDP
  -- * Internal helper
  , peekSocketAddr
  , pokeSocketAddr
  , peekSocketAddrMBA
  , pokeSocketAddrMBA
  , htons
  , ntohs
  , ntohl
  , htonl
  ) where

import           Data.Bits
import qualified Data.List                as List
import           Data.Ratio
import           Data.Typeable
import           Foreign
import           Foreign.C
import           Numeric                  (showHex)
import           System.IO.Unsafe
import           Text.Read
import           Z.Data.CBytes
import           Z.IO.Exception
import           Z.IO.UV.Errno
import           Z.Foreign




{-# LINE 102 "Z/IO/Network/SocketAddr.hsc" #-}


{-# LINE 104 "Z/IO/Network/SocketAddr.hsc" #-}

--------------------------------------------------------------------------------


{-# LINE 112 "Z/IO/Network/SocketAddr.hsc" #-}
type CSaFamily = (Word16)
{-# LINE 113 "Z/IO/Network/SocketAddr.hsc" #-}

{-# LINE 114 "Z/IO/Network/SocketAddr.hsc" #-}

-- | IPv4 or IPv6 socket address, i.e. the `sockaddr_in` or `sockaddr_in6` struct.
-- 
data SocketAddr 
    = SocketAddrInet
        {-# UNPACK #-} !PortNumber  -- sin_port  (network byte order)
        {-# UNPACK #-} !InetAddr    -- sin_addr  (ditto)
    | SocketAddrInet6
        {-# UNPACK #-} !PortNumber  -- sin6_port (network byte order)
        {-# UNPACK #-} !FlowInfo    -- sin6_flowinfo (ditto)
        {-# UNPACK #-} !Inet6Addr   -- sin6_addr (ditto)
        {-# UNPACK #-} !ScopeID     -- sin6_scope_id (ditto)
  deriving (SocketAddr -> SocketAddr -> Bool
(SocketAddr -> SocketAddr -> Bool)
-> (SocketAddr -> SocketAddr -> Bool) -> Eq SocketAddr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SocketAddr -> SocketAddr -> Bool
$c/= :: SocketAddr -> SocketAddr -> Bool
== :: SocketAddr -> SocketAddr -> Bool
$c== :: SocketAddr -> SocketAddr -> Bool
Eq, Eq SocketAddr
Eq SocketAddr
-> (SocketAddr -> SocketAddr -> Ordering)
-> (SocketAddr -> SocketAddr -> Bool)
-> (SocketAddr -> SocketAddr -> Bool)
-> (SocketAddr -> SocketAddr -> Bool)
-> (SocketAddr -> SocketAddr -> Bool)
-> (SocketAddr -> SocketAddr -> SocketAddr)
-> (SocketAddr -> SocketAddr -> SocketAddr)
-> Ord SocketAddr
SocketAddr -> SocketAddr -> Bool
SocketAddr -> SocketAddr -> Ordering
SocketAddr -> SocketAddr -> SocketAddr
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SocketAddr -> SocketAddr -> SocketAddr
$cmin :: SocketAddr -> SocketAddr -> SocketAddr
max :: SocketAddr -> SocketAddr -> SocketAddr
$cmax :: SocketAddr -> SocketAddr -> SocketAddr
>= :: SocketAddr -> SocketAddr -> Bool
$c>= :: SocketAddr -> SocketAddr -> Bool
> :: SocketAddr -> SocketAddr -> Bool
$c> :: SocketAddr -> SocketAddr -> Bool
<= :: SocketAddr -> SocketAddr -> Bool
$c<= :: SocketAddr -> SocketAddr -> Bool
< :: SocketAddr -> SocketAddr -> Bool
$c< :: SocketAddr -> SocketAddr -> Bool
compare :: SocketAddr -> SocketAddr -> Ordering
$ccompare :: SocketAddr -> SocketAddr -> Ordering
$cp1Ord :: Eq SocketAddr
Ord, Typeable)

instance Show SocketAddr where
    showsPrec :: Int -> SocketAddr -> ShowS
showsPrec Int
_ (SocketAddrInet PortNumber
port InetAddr
ia)
       = InetAddr -> ShowS
forall a. Show a => a -> ShowS
shows InetAddr
ia ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
":" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PortNumber -> ShowS
forall a. Show a => a -> ShowS
shows PortNumber
port
    showsPrec Int
_ (SocketAddrInet6 PortNumber
port FlowInfo
_ Inet6Addr
ia6 FlowInfo
_)
       = (Char
'['Char -> ShowS
forall a. a -> [a] -> [a]
:) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inet6Addr -> ShowS
forall a. Show a => a -> ShowS
shows Inet6Addr
ia6 ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
"]:" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PortNumber -> ShowS
forall a. Show a => a -> ShowS
shows PortNumber
port

-- Taken from showIPv6 in Data.IP.Addr.

-- | Show an IPv6 address in the most appropriate notation, based on recommended
-- representation proposed by <http://tools.ietf.org/html/rfc5952 RFC 5952>.
--
-- /The implementation is completely compatible with the current implementation
-- of the `inet_ntop` function in glibc./
--
sockAddrFamily :: SocketAddr -> SocketFamily
sockAddrFamily :: SocketAddr -> SocketFamily
sockAddrFamily (SocketAddrInet PortNumber
_ InetAddr
_) = SocketFamily
AF_INET
sockAddrFamily (SocketAddrInet6 PortNumber
_ FlowInfo
_ Inet6Addr
_ FlowInfo
_) = SocketFamily
AF_INET6

type FlowInfo = Word32
type ScopeID = Word32

-- | Convert a string containing an IPv4 addresses to a binary structure
--
-- This is partial function, wrong address will throw 'InvalidArgument' exception.
ipv4:: HasCallStack => CBytes -> PortNumber -> SocketAddr
ipv4 :: CBytes -> PortNumber -> SocketAddr
ipv4 CBytes
str (PortNumber Word16
port) = IO SocketAddr -> SocketAddr
forall a. IO a -> a
unsafeDupablePerformIO (IO SocketAddr -> SocketAddr)
-> ((MBA# SocketAddr -> IO ()) -> IO SocketAddr)
-> (MBA# SocketAddr -> IO ())
-> SocketAddr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MBA# SocketAddr -> IO ()) -> IO SocketAddr
withSocketAddrStorageUnsafe ((MBA# SocketAddr -> IO ()) -> SocketAddr)
-> (MBA# SocketAddr -> IO ()) -> SocketAddr
forall a b. (a -> b) -> a -> b
$ \ MBA# SocketAddr
p ->
    CBytes -> (CString -> IO ()) -> IO ()
forall a. CBytes -> (CString -> IO a) -> IO a
withCBytes CBytes
str ((CString -> IO ()) -> IO ()) -> (CString -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ CString
cstr -> IO CInt -> IO ()
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ CString -> CInt -> MBA# SocketAddr -> IO CInt
uv_ip4_addr CString
cstr (Word16 -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
port) MBA# SocketAddr
p

-- | Convert a string containing an IPv6 addresses to a binary structure
--
-- This is partial function, wrong address will throw 'InvalidArgument' exception.
ipv6:: HasCallStack => CBytes -> PortNumber -> SocketAddr
ipv6 :: CBytes -> PortNumber -> SocketAddr
ipv6 CBytes
str (PortNumber Word16
port) = IO SocketAddr -> SocketAddr
forall a. IO a -> a
unsafeDupablePerformIO (IO SocketAddr -> SocketAddr)
-> ((MBA# SocketAddr -> IO ()) -> IO SocketAddr)
-> (MBA# SocketAddr -> IO ())
-> SocketAddr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MBA# SocketAddr -> IO ()) -> IO SocketAddr
withSocketAddrStorageUnsafe ((MBA# SocketAddr -> IO ()) -> SocketAddr)
-> (MBA# SocketAddr -> IO ()) -> SocketAddr
forall a b. (a -> b) -> a -> b
$ \ MBA# SocketAddr
p ->
    CBytes -> (CString -> IO ()) -> IO ()
forall a. CBytes -> (CString -> IO a) -> IO a
withCBytes CBytes
str ((CString -> IO ()) -> IO ()) -> (CString -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ CString
cstr -> IO CInt -> IO ()
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ CString -> CInt -> MBA# SocketAddr -> IO CInt
uv_ip6_addr CString
cstr (Word16 -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
port) MBA# SocketAddr
p

--------------------------------------------------------------------------------

-- | Independent of endianness. For example @127.0.0.1@ is stored as @(127, 0, 0, 1)@.
--
-- For direct manipulation prefer 'inetAddrToTuple' and 'tupleToInetAddr'.
--
newtype InetAddr = InetAddr { InetAddr -> FlowInfo
getInetAddr :: Word32 } deriving (InetAddr -> InetAddr -> Bool
(InetAddr -> InetAddr -> Bool)
-> (InetAddr -> InetAddr -> Bool) -> Eq InetAddr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InetAddr -> InetAddr -> Bool
$c/= :: InetAddr -> InetAddr -> Bool
== :: InetAddr -> InetAddr -> Bool
$c== :: InetAddr -> InetAddr -> Bool
Eq, Eq InetAddr
Eq InetAddr
-> (InetAddr -> InetAddr -> Ordering)
-> (InetAddr -> InetAddr -> Bool)
-> (InetAddr -> InetAddr -> Bool)
-> (InetAddr -> InetAddr -> Bool)
-> (InetAddr -> InetAddr -> Bool)
-> (InetAddr -> InetAddr -> InetAddr)
-> (InetAddr -> InetAddr -> InetAddr)
-> Ord InetAddr
InetAddr -> InetAddr -> Bool
InetAddr -> InetAddr -> Ordering
InetAddr -> InetAddr -> InetAddr
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: InetAddr -> InetAddr -> InetAddr
$cmin :: InetAddr -> InetAddr -> InetAddr
max :: InetAddr -> InetAddr -> InetAddr
$cmax :: InetAddr -> InetAddr -> InetAddr
>= :: InetAddr -> InetAddr -> Bool
$c>= :: InetAddr -> InetAddr -> Bool
> :: InetAddr -> InetAddr -> Bool
$c> :: InetAddr -> InetAddr -> Bool
<= :: InetAddr -> InetAddr -> Bool
$c<= :: InetAddr -> InetAddr -> Bool
< :: InetAddr -> InetAddr -> Bool
$c< :: InetAddr -> InetAddr -> Bool
compare :: InetAddr -> InetAddr -> Ordering
$ccompare :: InetAddr -> InetAddr -> Ordering
$cp1Ord :: Eq InetAddr
Ord, Typeable)
instance Show InetAddr where
    showsPrec :: Int -> InetAddr -> ShowS
showsPrec Int
_ InetAddr
ia = 
        let (Word8
a,Word8
b,Word8
c,Word8
d) = InetAddr -> (Word8, Word8, Word8, Word8)
inetAddrToTuple InetAddr
ia
        in Word8 -> ShowS
forall a. Show a => a -> ShowS
shows Word8
a ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char
'.'Char -> ShowS
forall a. a -> [a] -> [a]
:) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> ShowS
forall a. Show a => a -> ShowS
shows Word8
b ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char
'.'Char -> ShowS
forall a. a -> [a] -> [a]
:) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> ShowS
forall a. Show a => a -> ShowS
shows Word8
c ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char
'.'Char -> ShowS
forall a. a -> [a] -> [a]
:) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> ShowS
forall a. Show a => a -> ShowS
shows Word8
d 

-- | @0.0.0.0@
inetAny             :: InetAddr
inetAny :: InetAddr
inetAny              = FlowInfo -> InetAddr
InetAddr FlowInfo
0

-- | @255.255.255.255@
inetBroadcast       :: InetAddr
inetBroadcast :: InetAddr
inetBroadcast        = (Word8, Word8, Word8, Word8) -> InetAddr
tupleToInetAddr (Word8
255,Word8
255,Word8
255,Word8
255)

-- | @255.255.255.255@
inetNone            :: InetAddr
inetNone :: InetAddr
inetNone             = (Word8, Word8, Word8, Word8) -> InetAddr
tupleToInetAddr (Word8
255,Word8
255,Word8
255,Word8
255)

-- | @127.0.0.1@
inetLoopback        :: InetAddr
inetLoopback :: InetAddr
inetLoopback         = (Word8, Word8, Word8, Word8) -> InetAddr
tupleToInetAddr (Word8
127,  Word8
0,  Word8
0,  Word8
1)

-- | @224.0.0.0@
inetUnspecificGroup :: InetAddr
inetUnspecificGroup :: InetAddr
inetUnspecificGroup  = (Word8, Word8, Word8, Word8) -> InetAddr
tupleToInetAddr (Word8
224,  Word8
0,  Word8
0,  Word8
0)

-- | @224.0.0.1@
inetAllHostsGroup   :: InetAddr
inetAllHostsGroup :: InetAddr
inetAllHostsGroup    = (Word8, Word8, Word8, Word8) -> InetAddr
tupleToInetAddr (Word8
224,  Word8
0,  Word8
0,  Word8
1)

-- | @224.0.0.255@
inetMaxLocalGroup   :: InetAddr
inetMaxLocalGroup :: InetAddr
inetMaxLocalGroup    = (Word8, Word8, Word8, Word8) -> InetAddr
tupleToInetAddr (Word8
224,  Word8
0,  Word8
0,Word8
255)

instance Storable InetAddr where
    sizeOf :: InetAddr -> Int
sizeOf InetAddr
_ = FlowInfo -> Int
forall a. Storable a => a -> Int
sizeOf (FlowInfo
forall a. HasCallStack => a
undefined :: Word32)
    alignment :: InetAddr -> Int
alignment InetAddr
_ = FlowInfo -> Int
forall a. Storable a => a -> Int
alignment (FlowInfo
forall a. HasCallStack => a
undefined :: Word32) 
    peek :: Ptr InetAddr -> IO InetAddr
peek Ptr InetAddr
p = (FlowInfo -> InetAddr
InetAddr (FlowInfo -> InetAddr)
-> (FlowInfo -> FlowInfo) -> FlowInfo -> InetAddr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FlowInfo -> FlowInfo
ntohl) (FlowInfo -> InetAddr) -> IO FlowInfo -> IO InetAddr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr InetAddr -> Int -> IO FlowInfo
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr InetAddr
p Int
0
    poke :: Ptr InetAddr -> InetAddr -> IO ()
poke Ptr InetAddr
p (InetAddr FlowInfo
ia) = Ptr InetAddr -> Int -> FlowInfo -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr InetAddr
p Int
0 (FlowInfo -> FlowInfo
htonl FlowInfo
ia)

instance UnalignedAccess InetAddr where
    unalignedSize :: UnalignedSize InetAddr
unalignedSize = Int -> UnalignedSize InetAddr
forall a. Int -> UnalignedSize a
UnalignedSize Int
4
    pokeMBA :: MBA# SocketAddr -> Int -> InetAddr -> IO ()
pokeMBA MBA# SocketAddr
p Int
off InetAddr
x = MBA# SocketAddr -> Int -> FlowInfo -> IO ()
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> a -> IO ()
pokeMBA MBA# SocketAddr
p Int
off (FlowInfo -> FlowInfo
htonl (InetAddr -> FlowInfo
getInetAddr InetAddr
x))
    peekMBA :: MBA# SocketAddr -> Int -> IO InetAddr
peekMBA MBA# SocketAddr
p Int
off = FlowInfo -> InetAddr
InetAddr (FlowInfo -> InetAddr)
-> (FlowInfo -> FlowInfo) -> FlowInfo -> InetAddr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FlowInfo -> FlowInfo
ntohl (FlowInfo -> InetAddr) -> IO FlowInfo -> IO InetAddr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MBA# SocketAddr -> Int -> IO FlowInfo
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> IO a
peekMBA MBA# SocketAddr
p Int
off
    indexBA :: ByteArray# -> Int -> InetAddr
indexBA ByteArray#
p Int
off = FlowInfo -> InetAddr
InetAddr (FlowInfo -> FlowInfo
ntohl (ByteArray# -> Int -> FlowInfo
forall a. UnalignedAccess a => ByteArray# -> Int -> a
indexBA ByteArray#
p Int
off))
    
-- | Converts 'InetAddr' to representation-independent IPv4 quadruple.
-- For example for @127.0.0.1@ the function will return @(127, 0, 0, 1)@
-- regardless of host endianness.
inetAddrToTuple :: InetAddr -> (Word8, Word8, Word8, Word8)
inetAddrToTuple :: InetAddr -> (Word8, Word8, Word8, Word8)
inetAddrToTuple (InetAddr FlowInfo
ia) =
    let byte :: Int -> Word8
byte Int
i = FlowInfo -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (FlowInfo
ia FlowInfo -> Int -> FlowInfo
forall a. Bits a => a -> Int -> a
`shiftR` Int
i) :: Word8
    in (Int -> Word8
byte Int
24, Int -> Word8
byte Int
16, Int -> Word8
byte Int
8, Int -> Word8
byte Int
0)

-- | Converts IPv4 quadruple to 'InetAddr'.
tupleToInetAddr :: (Word8, Word8, Word8, Word8) -> InetAddr
tupleToInetAddr :: (Word8, Word8, Word8, Word8) -> InetAddr
tupleToInetAddr (Word8
b3, Word8
b2, Word8
b1, Word8
b0) =
    let a
x sl :: a -> Int -> FlowInfo
`sl` Int
i = a -> FlowInfo
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x FlowInfo -> Int -> FlowInfo
forall a. Bits a => a -> Int -> a
`shiftL` Int
i :: Word32
    in FlowInfo -> InetAddr
InetAddr (FlowInfo -> InetAddr) -> FlowInfo -> InetAddr
forall a b. (a -> b) -> a -> b
$ (Word8
b3 Word8 -> Int -> FlowInfo
forall a. Integral a => a -> Int -> FlowInfo
`sl` Int
24) FlowInfo -> FlowInfo -> FlowInfo
forall a. Bits a => a -> a -> a
.|. (Word8
b2 Word8 -> Int -> FlowInfo
forall a. Integral a => a -> Int -> FlowInfo
`sl` Int
16) FlowInfo -> FlowInfo -> FlowInfo
forall a. Bits a => a -> a -> a
.|. (Word8
b1 Word8 -> Int -> FlowInfo
forall a. Integral a => a -> Int -> FlowInfo
`sl` Int
8) FlowInfo -> FlowInfo -> FlowInfo
forall a. Bits a => a -> a -> a
.|. (Word8
b0 Word8 -> Int -> FlowInfo
forall a. Integral a => a -> Int -> FlowInfo
`sl` Int
0)

--------------------------------------------------------------------------------

-- | Independent of endianness. For example @::1@ is stored as @(0, 0, 0, 1)@.
--
-- For direct manipulation prefer 'inet6AddrToTuple' and 'tupleToInet6Addr'.
--
data Inet6Addr = Inet6Addr {-# UNPACK #-}!Word32
                           {-# UNPACK #-}!Word32
                           {-# UNPACK #-}!Word32
                           {-# UNPACK #-}!Word32 deriving (Inet6Addr -> Inet6Addr -> Bool
(Inet6Addr -> Inet6Addr -> Bool)
-> (Inet6Addr -> Inet6Addr -> Bool) -> Eq Inet6Addr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Inet6Addr -> Inet6Addr -> Bool
$c/= :: Inet6Addr -> Inet6Addr -> Bool
== :: Inet6Addr -> Inet6Addr -> Bool
$c== :: Inet6Addr -> Inet6Addr -> Bool
Eq, Eq Inet6Addr
Eq Inet6Addr
-> (Inet6Addr -> Inet6Addr -> Ordering)
-> (Inet6Addr -> Inet6Addr -> Bool)
-> (Inet6Addr -> Inet6Addr -> Bool)
-> (Inet6Addr -> Inet6Addr -> Bool)
-> (Inet6Addr -> Inet6Addr -> Bool)
-> (Inet6Addr -> Inet6Addr -> Inet6Addr)
-> (Inet6Addr -> Inet6Addr -> Inet6Addr)
-> Ord Inet6Addr
Inet6Addr -> Inet6Addr -> Bool
Inet6Addr -> Inet6Addr -> Ordering
Inet6Addr -> Inet6Addr -> Inet6Addr
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Inet6Addr -> Inet6Addr -> Inet6Addr
$cmin :: Inet6Addr -> Inet6Addr -> Inet6Addr
max :: Inet6Addr -> Inet6Addr -> Inet6Addr
$cmax :: Inet6Addr -> Inet6Addr -> Inet6Addr
>= :: Inet6Addr -> Inet6Addr -> Bool
$c>= :: Inet6Addr -> Inet6Addr -> Bool
> :: Inet6Addr -> Inet6Addr -> Bool
$c> :: Inet6Addr -> Inet6Addr -> Bool
<= :: Inet6Addr -> Inet6Addr -> Bool
$c<= :: Inet6Addr -> Inet6Addr -> Bool
< :: Inet6Addr -> Inet6Addr -> Bool
$c< :: Inet6Addr -> Inet6Addr -> Bool
compare :: Inet6Addr -> Inet6Addr -> Ordering
$ccompare :: Inet6Addr -> Inet6Addr -> Ordering
$cp1Ord :: Eq Inet6Addr
Ord, Typeable)


instance Show Inet6Addr where
    showsPrec :: Int -> Inet6Addr -> ShowS
showsPrec Int
_ ia6 :: Inet6Addr
ia6@(Inet6Addr FlowInfo
a1 FlowInfo
a2 FlowInfo
a3 FlowInfo
a4)
        -- IPv4-Mapped IPv6 Address
        | FlowInfo
a1 FlowInfo -> FlowInfo -> Bool
forall a. Eq a => a -> a -> Bool
== FlowInfo
0 Bool -> Bool -> Bool
&& FlowInfo
a2 FlowInfo -> FlowInfo -> Bool
forall a. Eq a => a -> a -> Bool
== FlowInfo
0 Bool -> Bool -> Bool
&& FlowInfo
a3 FlowInfo -> FlowInfo -> Bool
forall a. Eq a => a -> a -> Bool
== FlowInfo
0xffff =
          String -> ShowS
showString String
"::ffff:" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InetAddr -> ShowS
forall a. Show a => a -> ShowS
shows (FlowInfo -> InetAddr
InetAddr FlowInfo
a4)
        -- IPv4-Compatible IPv6 Address (exclude IPRange ::/112)
        | FlowInfo
a1 FlowInfo -> FlowInfo -> Bool
forall a. Eq a => a -> a -> Bool
== FlowInfo
0 Bool -> Bool -> Bool
&& FlowInfo
a2 FlowInfo -> FlowInfo -> Bool
forall a. Eq a => a -> a -> Bool
== FlowInfo
0 Bool -> Bool -> Bool
&& FlowInfo
a3 FlowInfo -> FlowInfo -> Bool
forall a. Eq a => a -> a -> Bool
== FlowInfo
0 Bool -> Bool -> Bool
&& FlowInfo
a4 FlowInfo -> FlowInfo -> Bool
forall a. Ord a => a -> a -> Bool
>= FlowInfo
0x10000 =
            String -> ShowS
showString String
"::" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InetAddr -> ShowS
forall a. Show a => a -> ShowS
shows (FlowInfo -> InetAddr
InetAddr FlowInfo
a4)
        -- length of longest run > 1, replace it with "::"
        | Int
end Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
begin Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1 =
            [Word16] -> ShowS
showFields [Word16]
prefix ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
"::" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Word16] -> ShowS
showFields [Word16]
suffix
        | Bool
otherwise =
            [Word16] -> ShowS
showFields [Word16]
fields
      where
        fields :: [Word16]
fields =
            let (Word16
u7, Word16
u6, Word16
u5, Word16
u4, Word16
u3, Word16
u2, Word16
u1, Word16
u0) = Inet6Addr
-> (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16)
inet6AddrToTuple Inet6Addr
ia6 in
            [Word16
u7, Word16
u6, Word16
u5, Word16
u4, Word16
u3, Word16
u2, Word16
u1, Word16
u0]
        showFields :: [Word16] -> ShowS
showFields = (ShowS -> ShowS -> ShowS) -> ShowS -> [ShowS] -> ShowS
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) ShowS
forall a. a -> a
id ([ShowS] -> ShowS) -> ([Word16] -> [ShowS]) -> [Word16] -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS -> [ShowS] -> [ShowS]
forall a. a -> [a] -> [a]
List.intersperse (Char
':'Char -> ShowS
forall a. a -> [a] -> [a]
:) ([ShowS] -> [ShowS])
-> ([Word16] -> [ShowS]) -> [Word16] -> [ShowS]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word16 -> ShowS) -> [Word16] -> [ShowS]
forall a b. (a -> b) -> [a] -> [b]
map Word16 -> ShowS
forall a. (Integral a, Show a) => a -> ShowS
showHex
        prefix :: [Word16]
prefix = Int -> [Word16] -> [Word16]
forall a. Int -> [a] -> [a]
take Int
begin [Word16]
fields  -- fields before "::"
        suffix :: [Word16]
suffix = Int -> [Word16] -> [Word16]
forall a. Int -> [a] -> [a]
drop Int
end [Word16]
fields    -- fields after "::"
        begin :: Int
begin = Int
end Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
diff          -- the longest run of zeros
        (Int
diff, Int
end) = [(Int, Int)] -> (Int, Int)
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum ([(Int, Int)] -> (Int, Int)) -> [(Int, Int)] -> (Int, Int)
forall a b. (a -> b) -> a -> b
$
            (Int -> Word16 -> Int) -> Int -> [Word16] -> [Int]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl (\Int
c Word16
i -> if Word16
i Word16 -> Word16 -> Bool
forall a. Eq a => a -> a -> Bool
== Word16
0 then Int
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1 else Int
0) Int
0 [Word16]
fields [Int] -> [Int] -> [(Int, Int)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [Int
0..]

-- | @::@
inet6Any      :: Inet6Addr
inet6Any :: Inet6Addr
inet6Any       = FlowInfo -> FlowInfo -> FlowInfo -> FlowInfo -> Inet6Addr
Inet6Addr FlowInfo
0 FlowInfo
0 FlowInfo
0 FlowInfo
0

-- | @::1@
inet6Loopback :: Inet6Addr
inet6Loopback :: Inet6Addr
inet6Loopback  = FlowInfo -> FlowInfo -> FlowInfo -> FlowInfo -> Inet6Addr
Inet6Addr FlowInfo
0 FlowInfo
0 FlowInfo
0 FlowInfo
1

-- | convert 'Inet6Addr' to octets.
inet6AddrToTuple :: Inet6Addr -> (Word16, Word16, Word16, Word16,
                                        Word16, Word16, Word16, Word16)
inet6AddrToTuple :: Inet6Addr
-> (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16)
inet6AddrToTuple (Inet6Addr FlowInfo
w3 FlowInfo
w2 FlowInfo
w1 FlowInfo
w0) =
    let high, low :: Word32 -> Word16
        high :: FlowInfo -> Word16
high FlowInfo
w = FlowInfo -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral (FlowInfo
w FlowInfo -> Int -> FlowInfo
forall a. Bits a => a -> Int -> a
`shiftR` Int
16)
        low :: FlowInfo -> Word16
low FlowInfo
w = FlowInfo -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral FlowInfo
w
    in (FlowInfo -> Word16
high FlowInfo
w3, FlowInfo -> Word16
low FlowInfo
w3, FlowInfo -> Word16
high FlowInfo
w2, FlowInfo -> Word16
low FlowInfo
w2, FlowInfo -> Word16
high FlowInfo
w1, FlowInfo -> Word16
low FlowInfo
w1, FlowInfo -> Word16
high FlowInfo
w0, FlowInfo -> Word16
low FlowInfo
w0)

-- | convert 'Inet6Addr' from octets.
tupleToInet6Addr :: (Word16, Word16, Word16, Word16,
                        Word16, Word16, Word16, Word16) -> Inet6Addr
tupleToInet6Addr :: (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16)
-> Inet6Addr
tupleToInet6Addr (Word16
w7, Word16
w6, Word16
w5, Word16
w4, Word16
w3, Word16
w2, Word16
w1, Word16
w0) =
    let add :: Word16 -> Word16 -> Word32
        Word16
high add :: Word16 -> Word16 -> FlowInfo
`add` Word16
low = (Word16 -> FlowInfo
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
high FlowInfo -> Int -> FlowInfo
forall a. Bits a => a -> Int -> a
`shiftL` Int
16) FlowInfo -> FlowInfo -> FlowInfo
forall a. Bits a => a -> a -> a
.|. (Word16 -> FlowInfo
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
low)
    in  FlowInfo -> FlowInfo -> FlowInfo -> FlowInfo -> Inet6Addr
Inet6Addr (Word16
w7 Word16 -> Word16 -> FlowInfo
`add` Word16
w6) (Word16
w5 Word16 -> Word16 -> FlowInfo
`add` Word16
w4) (Word16
w3 Word16 -> Word16 -> FlowInfo
`add` Word16
w2) (Word16
w1 Word16 -> Word16 -> FlowInfo
`add` Word16
w0)

instance Storable Inet6Addr where
    sizeOf :: Inet6Addr -> Int
sizeOf Inet6Addr
_    = (Int
16)
{-# LINE 292 "Z/IO/Network/SocketAddr.hsc" #-}
    alignment _ = 4
{-# LINE 293 "Z/IO/Network/SocketAddr.hsc" #-}
    peek p = do
        a <- peek32 p 0
        b <- peek32 p 1
        c <- peek32 p 2
        d <- peek32 p 3
        return $ Inet6Addr a b c d
    poke :: Ptr Inet6Addr -> Inet6Addr -> IO ()
poke Ptr Inet6Addr
p (Inet6Addr FlowInfo
a FlowInfo
b FlowInfo
c FlowInfo
d) = do
        Ptr Inet6Addr -> Int -> FlowInfo -> IO ()
forall a. Ptr a -> Int -> FlowInfo -> IO ()
poke32 Ptr Inet6Addr
p Int
0 FlowInfo
a
        Ptr Inet6Addr -> Int -> FlowInfo -> IO ()
forall a. Ptr a -> Int -> FlowInfo -> IO ()
poke32 Ptr Inet6Addr
p Int
1 FlowInfo
b
        Ptr Inet6Addr -> Int -> FlowInfo -> IO ()
forall a. Ptr a -> Int -> FlowInfo -> IO ()
poke32 Ptr Inet6Addr
p Int
2 FlowInfo
c
        Ptr Inet6Addr -> Int -> FlowInfo -> IO ()
forall a. Ptr a -> Int -> FlowInfo -> IO ()
poke32 Ptr Inet6Addr
p Int
3 FlowInfo
d


s6_addr_offset :: Int
s6_addr_offset :: Int
s6_addr_offset = ((Int
0))
{-# LINE 308 "Z/IO/Network/SocketAddr.hsc" #-}

peek32 :: Ptr a -> Int -> IO Word32
peek32 :: Ptr a -> Int -> IO FlowInfo
peek32 Ptr a
p Int
i0 = do
    let i' :: Int
i' = Int
i0 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
4
        peekByte :: Int -> IO Word8
peekByte Int
n = Ptr a -> Int -> IO Word8
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr a
p (Int
s6_addr_offset Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
i' Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) :: IO Word8
        a
a sl :: a -> Int -> a
`sl` Int
i = a -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
a a -> Int -> a
forall a. Bits a => a -> Int -> a
`shiftL` Int
i
    Word8
a0 <- Int -> IO Word8
peekByte Int
0
    Word8
a1 <- Int -> IO Word8
peekByte Int
1
    Word8
a2 <- Int -> IO Word8
peekByte Int
2
    Word8
a3 <- Int -> IO Word8
peekByte Int
3
    FlowInfo -> IO FlowInfo
forall (m :: * -> *) a. Monad m => a -> m a
return ((Word8
a0 Word8 -> Int -> FlowInfo
forall a a. (Bits a, Integral a, Num a) => a -> Int -> a
`sl` Int
24) FlowInfo -> FlowInfo -> FlowInfo
forall a. Bits a => a -> a -> a
.|. (Word8
a1 Word8 -> Int -> FlowInfo
forall a a. (Bits a, Integral a, Num a) => a -> Int -> a
`sl` Int
16) FlowInfo -> FlowInfo -> FlowInfo
forall a. Bits a => a -> a -> a
.|. (Word8
a2 Word8 -> Int -> FlowInfo
forall a a. (Bits a, Integral a, Num a) => a -> Int -> a
`sl` Int
8) FlowInfo -> FlowInfo -> FlowInfo
forall a. Bits a => a -> a -> a
.|. (Word8
a3 Word8 -> Int -> FlowInfo
forall a a. (Bits a, Integral a, Num a) => a -> Int -> a
`sl` Int
0))

poke32 :: Ptr a -> Int -> Word32 -> IO ()
poke32 :: Ptr a -> Int -> FlowInfo -> IO ()
poke32 Ptr a
p Int
i0 FlowInfo
a = do
    let i' :: Int
i' = Int
i0 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
4
        pokeByte :: Int -> a -> IO ()
pokeByte Int
n = Ptr a -> Int -> a -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr a
p (Int
s6_addr_offset Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
i' Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n)
        a
x sr :: a -> Int -> Word8
`sr` Int
i = a -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a
x a -> Int -> a
forall a. Bits a => a -> Int -> a
`shiftR` Int
i) :: Word8
    Int -> Word8 -> IO ()
forall a. Storable a => Int -> a -> IO ()
pokeByte Int
0 (FlowInfo
a FlowInfo -> Int -> Word8
forall a. (Integral a, Bits a) => a -> Int -> Word8
`sr` Int
24)
    Int -> Word8 -> IO ()
forall a. Storable a => Int -> a -> IO ()
pokeByte Int
1 (FlowInfo
a FlowInfo -> Int -> Word8
forall a. (Integral a, Bits a) => a -> Int -> Word8
`sr` Int
16)
    Int -> Word8 -> IO ()
forall a. Storable a => Int -> a -> IO ()
pokeByte Int
2 (FlowInfo
a FlowInfo -> Int -> Word8
forall a. (Integral a, Bits a) => a -> Int -> Word8
`sr`  Int
8)
    Int -> Word8 -> IO ()
forall a. Storable a => Int -> a -> IO ()
pokeByte Int
3 (FlowInfo
a FlowInfo -> Int -> Word8
forall a. (Integral a, Bits a) => a -> Int -> Word8
`sr`  Int
0)

instance UnalignedAccess Inet6Addr where
    unalignedSize :: UnalignedSize Inet6Addr
unalignedSize   = Int -> UnalignedSize Inet6Addr
forall a. Int -> UnalignedSize a
UnalignedSize ((Int
16))
{-# LINE 332 "Z/IO/Network/SocketAddr.hsc" #-}

    peekMBA :: MBA# SocketAddr -> Int -> IO Inet6Addr
peekMBA MBA# SocketAddr
p Int
off = do
        BE FlowInfo
a <- MBA# SocketAddr -> Int -> IO (BE FlowInfo)
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> IO a
peekMBA MBA# SocketAddr
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
s6_addr_offset Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0)
        BE FlowInfo
b <- MBA# SocketAddr -> Int -> IO (BE FlowInfo)
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> IO a
peekMBA MBA# SocketAddr
p  (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
s6_addr_offset Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4)
        BE FlowInfo
c <- MBA# SocketAddr -> Int -> IO (BE FlowInfo)
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> IO a
peekMBA MBA# SocketAddr
p  (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
s6_addr_offset Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
8)
        BE FlowInfo
d <- MBA# SocketAddr -> Int -> IO (BE FlowInfo)
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> IO a
peekMBA MBA# SocketAddr
p  (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
s6_addr_offset Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
12)
        Inet6Addr -> IO Inet6Addr
forall (m :: * -> *) a. Monad m => a -> m a
return (Inet6Addr -> IO Inet6Addr) -> Inet6Addr -> IO Inet6Addr
forall a b. (a -> b) -> a -> b
$ FlowInfo -> FlowInfo -> FlowInfo -> FlowInfo -> Inet6Addr
Inet6Addr (BE FlowInfo -> FlowInfo
forall a. BE a -> a
getBE BE FlowInfo
a) (BE FlowInfo -> FlowInfo
forall a. BE a -> a
getBE BE FlowInfo
b) (BE FlowInfo -> FlowInfo
forall a. BE a -> a
getBE BE FlowInfo
c) (BE FlowInfo -> FlowInfo
forall a. BE a -> a
getBE BE FlowInfo
d)

    pokeMBA :: MBA# SocketAddr -> Int -> Inet6Addr -> IO ()
pokeMBA MBA# SocketAddr
p Int
off (Inet6Addr FlowInfo
a FlowInfo
b FlowInfo
c FlowInfo
d) = do
        MBA# SocketAddr -> Int -> BE FlowInfo -> IO ()
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> a -> IO ()
pokeMBA MBA# SocketAddr
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
s6_addr_offset) (FlowInfo -> BE FlowInfo
forall a. a -> BE a
BE FlowInfo
a)
        MBA# SocketAddr -> Int -> BE FlowInfo -> IO ()
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> a -> IO ()
pokeMBA MBA# SocketAddr
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
s6_addr_offset) (FlowInfo -> BE FlowInfo
forall a. a -> BE a
BE FlowInfo
b)
        MBA# SocketAddr -> Int -> BE FlowInfo -> IO ()
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> a -> IO ()
pokeMBA MBA# SocketAddr
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
s6_addr_offset) (FlowInfo -> BE FlowInfo
forall a. a -> BE a
BE FlowInfo
c)
        MBA# SocketAddr -> Int -> BE FlowInfo -> IO ()
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> a -> IO ()
pokeMBA MBA# SocketAddr
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
s6_addr_offset) (FlowInfo -> BE FlowInfo
forall a. a -> BE a
BE FlowInfo
d)

--------------------------------------------------------------------------------

peekSocketAddr :: HasCallStack => Ptr SocketAddr -> IO SocketAddr
peekSocketAddr :: Ptr SocketAddr -> IO SocketAddr
peekSocketAddr Ptr SocketAddr
p = do
    Word16
family <- ((\Ptr SocketAddr
hsc_ptr -> Ptr SocketAddr -> Int -> IO Word16
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr SocketAddr
hsc_ptr Int
0)) Ptr SocketAddr
p
{-# LINE 351 "Z/IO/Network/SocketAddr.hsc" #-}
    case family :: CSaFamily of
        (2) -> do
{-# LINE 353 "Z/IO/Network/SocketAddr.hsc" #-}
            addr <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 354 "Z/IO/Network/SocketAddr.hsc" #-}
            port <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 355 "Z/IO/Network/SocketAddr.hsc" #-}
            return (SocketAddrInet port addr)
        (10) -> do
{-# LINE 357 "Z/IO/Network/SocketAddr.hsc" #-}
            port <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 358 "Z/IO/Network/SocketAddr.hsc" #-}
            flow <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 359 "Z/IO/Network/SocketAddr.hsc" #-}
            addr <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p
{-# LINE 360 "Z/IO/Network/SocketAddr.hsc" #-}
            scope <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) p
{-# LINE 361 "Z/IO/Network/SocketAddr.hsc" #-}
            return (SocketAddrInet6 port flow addr scope)
        _ -> do let errno = UV_EAI_ADDRFAMILY
                name <- uvErrName errno
                desc <- uvStdError errno
                throwUVError errno (IOEInfo name desc callStack)

pokeSocketAddr :: Ptr SocketAddr -> SocketAddr -> IO ()
pokeSocketAddr :: Ptr SocketAddr -> SocketAddr -> IO ()
pokeSocketAddr Ptr SocketAddr
p (SocketAddrInet PortNumber
port InetAddr
addr) =  do

{-# LINE 372 "Z/IO/Network/SocketAddr.hsc" #-}

{-# LINE 375 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\Ptr SocketAddr
hsc_ptr -> Ptr SocketAddr -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr SocketAddr
hsc_ptr Int
0)) Ptr SocketAddr
p ((Word16
2) :: CSaFamily)
{-# LINE 376 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 2)) p port
{-# LINE 377 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p addr
{-# LINE 378 "Z/IO/Network/SocketAddr.hsc" #-}
pokeSocketAddr p (SocketAddrInet6 port flow addr scope) =  do

{-# LINE 382 "Z/IO/Network/SocketAddr.hsc" #-}

{-# LINE 385 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p ((10) :: CSaFamily)
{-# LINE 386 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 2)) p port
{-# LINE 387 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p flow
{-# LINE 388 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) p (addr)
{-# LINE 389 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 24)) p scope
{-# LINE 390 "Z/IO/Network/SocketAddr.hsc" #-}


-- | Pass 'SocketAddr' to FFI as pointer.
--
withSocketAddr :: SocketAddr -> (Ptr SocketAddr -> IO a) -> IO a
withSocketAddr :: SocketAddr -> (Ptr SocketAddr -> IO a) -> IO a
withSocketAddr sa :: SocketAddr
sa@(SocketAddrInet PortNumber
_ InetAddr
_) Ptr SocketAddr -> IO a
f = do
    Int -> Int -> (Ptr SocketAddr -> IO a) -> IO a
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned
        ((Int
16))
{-# LINE 398 "Z/IO/Network/SocketAddr.hsc" #-}
        (Int
4) ((Ptr SocketAddr -> IO a) -> IO a)
-> (Ptr SocketAddr -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \ Ptr SocketAddr
p -> Ptr SocketAddr -> SocketAddr -> IO ()
pokeSocketAddr Ptr SocketAddr
p SocketAddr
sa IO () -> IO a -> IO a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ptr SocketAddr -> IO a
f Ptr SocketAddr
p
{-# LINE 399 "Z/IO/Network/SocketAddr.hsc" #-}
withSocketAddr sa@(SocketAddrInet6 _ _ _ _) f = do
    allocaBytesAligned 
        ((28)) 
{-# LINE 402 "Z/IO/Network/SocketAddr.hsc" #-}
        (4) $ \ p -> pokeSocketAddr p sa >> f p
{-# LINE 403 "Z/IO/Network/SocketAddr.hsc" #-}

-- | Pass 'SocketAddr' to FFI as pointer.
--
-- USE THIS FUNCTION WITH UNSAFE FFI CALL ONLY.
--
withSocketAddrUnsafe :: SocketAddr -> (MBA# SocketAddr -> IO a) -> IO a
withSocketAddrUnsafe :: SocketAddr -> (MBA# SocketAddr -> IO a) -> IO a
withSocketAddrUnsafe sa :: SocketAddr
sa@(SocketAddrInet PortNumber
_ InetAddr
_) MBA# SocketAddr -> IO a
f = do
    Int -> (MBA# SocketAddr -> IO a) -> IO a
forall a b. Int -> (MBA# SocketAddr -> IO b) -> IO b
allocMutableByteArrayUnsafe ((Int
16)) ((MBA# SocketAddr -> IO a) -> IO a)
-> (MBA# SocketAddr -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \ MBA# SocketAddr
p ->
{-# LINE 411 "Z/IO/Network/SocketAddr.hsc" #-}
        MBA# SocketAddr -> SocketAddr -> IO ()
pokeSocketAddrMBA MBA# SocketAddr
p SocketAddr
sa IO () -> IO a -> IO a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> MBA# SocketAddr -> IO a
f MBA# SocketAddr
p
withSocketAddrUnsafe sa :: SocketAddr
sa@(SocketAddrInet6 PortNumber
_ FlowInfo
_ Inet6Addr
_ FlowInfo
_) MBA# SocketAddr -> IO a
f = do
    Int -> (MBA# SocketAddr -> IO a) -> IO a
forall a b. Int -> (MBA# SocketAddr -> IO b) -> IO b
allocMutableByteArrayUnsafe ((Int
28)) ((MBA# SocketAddr -> IO a) -> IO a)
-> (MBA# SocketAddr -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \ MBA# SocketAddr
p ->
{-# LINE 414 "Z/IO/Network/SocketAddr.hsc" #-}
        MBA# SocketAddr -> SocketAddr -> IO ()
pokeSocketAddrMBA MBA# SocketAddr
p SocketAddr
sa IO () -> IO a -> IO a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> MBA# SocketAddr -> IO a
f MBA# SocketAddr
p

sizeOfSocketAddr :: SocketAddr -> CSize
sizeOfSocketAddr :: SocketAddr -> CSize
sizeOfSocketAddr (SocketAddrInet PortNumber
_ InetAddr
_) = (CSize
16)
{-# LINE 418 "Z/IO/Network/SocketAddr.hsc" #-}
sizeOfSocketAddr (SocketAddrInet6 _ _ _ _) = (28)
{-# LINE 419 "Z/IO/Network/SocketAddr.hsc" #-}

-- | Allocate space for 'sockaddr_storage' and pass to FFI.
withSocketAddrStorage :: (Ptr SocketAddr -> IO ()) -> IO SocketAddr
withSocketAddrStorage :: (Ptr SocketAddr -> IO ()) -> IO SocketAddr
withSocketAddrStorage Ptr SocketAddr -> IO ()
f = do
    Int -> Int -> (Ptr SocketAddr -> IO SocketAddr) -> IO SocketAddr
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned
        ((Int
128))
{-# LINE 425 "Z/IO/Network/SocketAddr.hsc" #-}
        (Int
8) ((Ptr SocketAddr -> IO SocketAddr) -> IO SocketAddr)
-> (Ptr SocketAddr -> IO SocketAddr) -> IO SocketAddr
forall a b. (a -> b) -> a -> b
$ \ Ptr SocketAddr
p -> Ptr SocketAddr -> IO ()
f Ptr SocketAddr
p IO () -> IO SocketAddr -> IO SocketAddr
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> HasCallStack => Ptr SocketAddr -> IO SocketAddr
Ptr SocketAddr -> IO SocketAddr
peekSocketAddr Ptr SocketAddr
p
{-# LINE 426 "Z/IO/Network/SocketAddr.hsc" #-}

-- | Allocate space for 'sockaddr_storage' and pass to FFI.
--
-- USE THIS FUNCTION WITH UNSAFE FFI CALL ONLY.
--
withSocketAddrStorageUnsafe :: (MBA# SocketAddr -> IO ()) -> IO SocketAddr
withSocketAddrStorageUnsafe :: (MBA# SocketAddr -> IO ()) -> IO SocketAddr
withSocketAddrStorageUnsafe MBA# SocketAddr -> IO ()
f = do
    Int -> (MBA# SocketAddr -> IO SocketAddr) -> IO SocketAddr
forall a b. Int -> (MBA# SocketAddr -> IO b) -> IO b
allocMutableByteArrayUnsafe ((Int
128)) ((MBA# SocketAddr -> IO SocketAddr) -> IO SocketAddr)
-> (MBA# SocketAddr -> IO SocketAddr) -> IO SocketAddr
forall a b. (a -> b) -> a -> b
$ \ MBA# SocketAddr
p ->
{-# LINE 434 "Z/IO/Network/SocketAddr.hsc" #-}
        MBA# SocketAddr -> IO ()
f MBA# SocketAddr
p IO () -> IO SocketAddr -> IO SocketAddr
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> HasCallStack => MBA# SocketAddr -> IO SocketAddr
MBA# SocketAddr -> IO SocketAddr
peekSocketAddrMBA MBA# SocketAddr
p

sizeOfSocketAddrStorage :: CSize
sizeOfSocketAddrStorage :: CSize
sizeOfSocketAddrStorage = ((CSize
128))
{-# LINE 438 "Z/IO/Network/SocketAddr.hsc" #-}

peekSocketAddrMBA :: HasCallStack => MBA# SocketAddr -> IO SocketAddr
peekSocketAddrMBA :: MBA# SocketAddr -> IO SocketAddr
peekSocketAddrMBA MBA# SocketAddr
p = do
    Word16
family <- MBA# SocketAddr -> Int -> IO Word16
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> IO a
peekMBA MBA# SocketAddr
p ((Int
0))
{-# LINE 442 "Z/IO/Network/SocketAddr.hsc" #-}
    case family :: CSaFamily of
        (2) -> do
{-# LINE 444 "Z/IO/Network/SocketAddr.hsc" #-}
            addr <- peekMBA p ((4)) 
{-# LINE 445 "Z/IO/Network/SocketAddr.hsc" #-}
            port <- peekMBA p ((2)) 
{-# LINE 446 "Z/IO/Network/SocketAddr.hsc" #-}
            return (SocketAddrInet port addr)
        (10) -> do
{-# LINE 448 "Z/IO/Network/SocketAddr.hsc" #-}
            port <- peekMBA p ((2)) 
{-# LINE 449 "Z/IO/Network/SocketAddr.hsc" #-}
            flow <- peekMBA p ((4)) 
{-# LINE 450 "Z/IO/Network/SocketAddr.hsc" #-}
            addr <- peekMBA p ((8)) 
{-# LINE 451 "Z/IO/Network/SocketAddr.hsc" #-}
            scope <- peekMBA p ((24)) 
{-# LINE 452 "Z/IO/Network/SocketAddr.hsc" #-}
            return (SocketAddrInet6 port flow addr scope)
        _ -> do let errno = UV_EAI_ADDRFAMILY
                name <- uvErrName errno
                desc <- uvStdError errno
                throwUVError errno (IOEInfo name desc callStack)

pokeSocketAddrMBA :: MBA# SocketAddr -> SocketAddr -> IO ()
pokeSocketAddrMBA :: MBA# SocketAddr -> SocketAddr -> IO ()
pokeSocketAddrMBA MBA# SocketAddr
p (SocketAddrInet PortNumber
port InetAddr
addr) =  do

{-# LINE 463 "Z/IO/Network/SocketAddr.hsc" #-}

{-# LINE 466 "Z/IO/Network/SocketAddr.hsc" #-}
    MBA# SocketAddr -> Int -> Word16 -> IO ()
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> a -> IO ()
pokeMBA MBA# SocketAddr
p ((Int
0)) ((Word16
2) :: CSaFamily)
{-# LINE 467 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((2)) port
{-# LINE 468 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((4)) addr
{-# LINE 469 "Z/IO/Network/SocketAddr.hsc" #-}
pokeSocketAddrMBA p (SocketAddrInet6 port flow addr scope) =  do

{-# LINE 473 "Z/IO/Network/SocketAddr.hsc" #-}

{-# LINE 476 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((0)) ((10) :: CSaFamily)
{-# LINE 477 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((2)) port
{-# LINE 478 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((4)) flow
{-# LINE 479 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((8)) (addr)
{-# LINE 480 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((24)) scope
{-# LINE 481 "Z/IO/Network/SocketAddr.hsc" #-}

--------------------------------------------------------------------------------
-- Port Numbers

-- | Port number.
--   Use the @Num@ instance (i.e. use a literal) to create a
--   @PortNumber@ value.
--
-- >>> 1 :: PortNumber
-- 1
-- >>> read "1" :: PortNumber
-- 1
-- >>> show (12345 :: PortNumber)
-- "12345"
-- >>> 50000 < (51000 :: PortNumber)
-- True
-- >>> 50000 < (52000 :: PortNumber)
-- True
-- >>> 50000 + (10000 :: PortNumber)
-- 60000
newtype PortNumber = PortNumber Word16 deriving (PortNumber -> PortNumber -> Bool
(PortNumber -> PortNumber -> Bool)
-> (PortNumber -> PortNumber -> Bool) -> Eq PortNumber
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PortNumber -> PortNumber -> Bool
$c/= :: PortNumber -> PortNumber -> Bool
== :: PortNumber -> PortNumber -> Bool
$c== :: PortNumber -> PortNumber -> Bool
Eq, Eq PortNumber
Eq PortNumber
-> (PortNumber -> PortNumber -> Ordering)
-> (PortNumber -> PortNumber -> Bool)
-> (PortNumber -> PortNumber -> Bool)
-> (PortNumber -> PortNumber -> Bool)
-> (PortNumber -> PortNumber -> Bool)
-> (PortNumber -> PortNumber -> PortNumber)
-> (PortNumber -> PortNumber -> PortNumber)
-> Ord PortNumber
PortNumber -> PortNumber -> Bool
PortNumber -> PortNumber -> Ordering
PortNumber -> PortNumber -> PortNumber
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PortNumber -> PortNumber -> PortNumber
$cmin :: PortNumber -> PortNumber -> PortNumber
max :: PortNumber -> PortNumber -> PortNumber
$cmax :: PortNumber -> PortNumber -> PortNumber
>= :: PortNumber -> PortNumber -> Bool
$c>= :: PortNumber -> PortNumber -> Bool
> :: PortNumber -> PortNumber -> Bool
$c> :: PortNumber -> PortNumber -> Bool
<= :: PortNumber -> PortNumber -> Bool
$c<= :: PortNumber -> PortNumber -> Bool
< :: PortNumber -> PortNumber -> Bool
$c< :: PortNumber -> PortNumber -> Bool
compare :: PortNumber -> PortNumber -> Ordering
$ccompare :: PortNumber -> PortNumber -> Ordering
$cp1Ord :: Eq PortNumber
Ord, Integer -> PortNumber
PortNumber -> PortNumber
PortNumber -> PortNumber -> PortNumber
(PortNumber -> PortNumber -> PortNumber)
-> (PortNumber -> PortNumber -> PortNumber)
-> (PortNumber -> PortNumber -> PortNumber)
-> (PortNumber -> PortNumber)
-> (PortNumber -> PortNumber)
-> (PortNumber -> PortNumber)
-> (Integer -> PortNumber)
-> Num PortNumber
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> PortNumber
$cfromInteger :: Integer -> PortNumber
signum :: PortNumber -> PortNumber
$csignum :: PortNumber -> PortNumber
abs :: PortNumber -> PortNumber
$cabs :: PortNumber -> PortNumber
negate :: PortNumber -> PortNumber
$cnegate :: PortNumber -> PortNumber
* :: PortNumber -> PortNumber -> PortNumber
$c* :: PortNumber -> PortNumber -> PortNumber
- :: PortNumber -> PortNumber -> PortNumber
$c- :: PortNumber -> PortNumber -> PortNumber
+ :: PortNumber -> PortNumber -> PortNumber
$c+ :: PortNumber -> PortNumber -> PortNumber
Num, Int -> PortNumber
PortNumber -> Int
PortNumber -> [PortNumber]
PortNumber -> PortNumber
PortNumber -> PortNumber -> [PortNumber]
PortNumber -> PortNumber -> PortNumber -> [PortNumber]
(PortNumber -> PortNumber)
-> (PortNumber -> PortNumber)
-> (Int -> PortNumber)
-> (PortNumber -> Int)
-> (PortNumber -> [PortNumber])
-> (PortNumber -> PortNumber -> [PortNumber])
-> (PortNumber -> PortNumber -> [PortNumber])
-> (PortNumber -> PortNumber -> PortNumber -> [PortNumber])
-> Enum PortNumber
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: PortNumber -> PortNumber -> PortNumber -> [PortNumber]
$cenumFromThenTo :: PortNumber -> PortNumber -> PortNumber -> [PortNumber]
enumFromTo :: PortNumber -> PortNumber -> [PortNumber]
$cenumFromTo :: PortNumber -> PortNumber -> [PortNumber]
enumFromThen :: PortNumber -> PortNumber -> [PortNumber]
$cenumFromThen :: PortNumber -> PortNumber -> [PortNumber]
enumFrom :: PortNumber -> [PortNumber]
$cenumFrom :: PortNumber -> [PortNumber]
fromEnum :: PortNumber -> Int
$cfromEnum :: PortNumber -> Int
toEnum :: Int -> PortNumber
$ctoEnum :: Int -> PortNumber
pred :: PortNumber -> PortNumber
$cpred :: PortNumber -> PortNumber
succ :: PortNumber -> PortNumber
$csucc :: PortNumber -> PortNumber
Enum, PortNumber
PortNumber -> PortNumber -> Bounded PortNumber
forall a. a -> a -> Bounded a
maxBound :: PortNumber
$cmaxBound :: PortNumber
minBound :: PortNumber
$cminBound :: PortNumber
Bounded, Num PortNumber
Ord PortNumber
Num PortNumber
-> Ord PortNumber -> (PortNumber -> Rational) -> Real PortNumber
PortNumber -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
toRational :: PortNumber -> Rational
$ctoRational :: PortNumber -> Rational
$cp2Real :: Ord PortNumber
$cp1Real :: Num PortNumber
Real, Enum PortNumber
Real PortNumber
Real PortNumber
-> Enum PortNumber
-> (PortNumber -> PortNumber -> PortNumber)
-> (PortNumber -> PortNumber -> PortNumber)
-> (PortNumber -> PortNumber -> PortNumber)
-> (PortNumber -> PortNumber -> PortNumber)
-> (PortNumber -> PortNumber -> (PortNumber, PortNumber))
-> (PortNumber -> PortNumber -> (PortNumber, PortNumber))
-> (PortNumber -> Integer)
-> Integral PortNumber
PortNumber -> Integer
PortNumber -> PortNumber -> (PortNumber, PortNumber)
PortNumber -> PortNumber -> PortNumber
forall a.
Real a
-> Enum a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
toInteger :: PortNumber -> Integer
$ctoInteger :: PortNumber -> Integer
divMod :: PortNumber -> PortNumber -> (PortNumber, PortNumber)
$cdivMod :: PortNumber -> PortNumber -> (PortNumber, PortNumber)
quotRem :: PortNumber -> PortNumber -> (PortNumber, PortNumber)
$cquotRem :: PortNumber -> PortNumber -> (PortNumber, PortNumber)
mod :: PortNumber -> PortNumber -> PortNumber
$cmod :: PortNumber -> PortNumber -> PortNumber
div :: PortNumber -> PortNumber -> PortNumber
$cdiv :: PortNumber -> PortNumber -> PortNumber
rem :: PortNumber -> PortNumber -> PortNumber
$crem :: PortNumber -> PortNumber -> PortNumber
quot :: PortNumber -> PortNumber -> PortNumber
$cquot :: PortNumber -> PortNumber -> PortNumber
$cp2Integral :: Enum PortNumber
$cp1Integral :: Real PortNumber
Integral)

-- | @:0@
portAny :: PortNumber
portAny :: PortNumber
portAny = Word16 -> PortNumber
PortNumber Word16
0

-- Print "n" instead of "PortNum n".
instance Show PortNumber where
  showsPrec :: Int -> PortNumber -> ShowS
showsPrec Int
p (PortNumber Word16
pn) = Int -> Word16 -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p Word16
pn

-- Read "n" instead of "PortNum n".
instance Read PortNumber where
  readPrec :: ReadPrec PortNumber
readPrec = Word16 -> PortNumber
PortNumber (Word16 -> PortNumber) -> ReadPrec Word16 -> ReadPrec PortNumber
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadPrec Word16
forall a. Read a => ReadPrec a
readPrec

instance Storable PortNumber where
   sizeOf :: PortNumber -> Int
sizeOf    PortNumber
_ = Word16 -> Int
forall a. Storable a => a -> Int
sizeOf    (Word16
0 :: Word16)
   alignment :: PortNumber -> Int
alignment PortNumber
_ = Word16 -> Int
forall a. Storable a => a -> Int
alignment (Word16
0 :: Word16)
   poke :: Ptr PortNumber -> PortNumber -> IO ()
poke Ptr PortNumber
p (PortNumber Word16
po) = Ptr Word16 -> Word16 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr PortNumber -> Ptr Word16
forall a b. Ptr a -> Ptr b
castPtr Ptr PortNumber
p) (Word16 -> Word16
htons Word16
po)
   peek :: Ptr PortNumber -> IO PortNumber
peek Ptr PortNumber
p = Word16 -> PortNumber
PortNumber (Word16 -> PortNumber)
-> (Word16 -> Word16) -> Word16 -> PortNumber
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Word16
ntohs (Word16 -> PortNumber) -> IO Word16 -> IO PortNumber
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr Word16 -> IO Word16
forall a. Storable a => Ptr a -> IO a
peek (Ptr PortNumber -> Ptr Word16
forall a b. Ptr a -> Ptr b
castPtr Ptr PortNumber
p)

instance UnalignedAccess PortNumber where
   unalignedSize :: UnalignedSize PortNumber
unalignedSize = Int -> UnalignedSize PortNumber
forall a. Int -> UnalignedSize a
UnalignedSize Int
2
   pokeMBA :: MBA# SocketAddr -> Int -> PortNumber -> IO ()
pokeMBA MBA# SocketAddr
p Int
off (PortNumber Word16
po) = MBA# SocketAddr -> Int -> Word16 -> IO ()
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> a -> IO ()
pokeMBA MBA# SocketAddr
p Int
off (Word16 -> Word16
htons Word16
po)
   peekMBA :: MBA# SocketAddr -> Int -> IO PortNumber
peekMBA MBA# SocketAddr
p Int
off = Word16 -> PortNumber
PortNumber (Word16 -> PortNumber)
-> (Word16 -> Word16) -> Word16 -> PortNumber
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Word16
ntohs (Word16 -> PortNumber) -> IO Word16 -> IO PortNumber
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MBA# SocketAddr -> Int -> IO Word16
forall a. UnalignedAccess a => MBA# SocketAddr -> Int -> IO a
peekMBA MBA# SocketAddr
p Int
off
    
--------------------------------------------------------------------------------

newtype SocketFamily = SocketFamily CInt
    deriving (SocketFamily -> SocketFamily -> Bool
(SocketFamily -> SocketFamily -> Bool)
-> (SocketFamily -> SocketFamily -> Bool) -> Eq SocketFamily
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SocketFamily -> SocketFamily -> Bool
$c/= :: SocketFamily -> SocketFamily -> Bool
== :: SocketFamily -> SocketFamily -> Bool
$c== :: SocketFamily -> SocketFamily -> Bool
Eq, Eq SocketFamily
Eq SocketFamily
-> (SocketFamily -> SocketFamily -> Ordering)
-> (SocketFamily -> SocketFamily -> Bool)
-> (SocketFamily -> SocketFamily -> Bool)
-> (SocketFamily -> SocketFamily -> Bool)
-> (SocketFamily -> SocketFamily -> Bool)
-> (SocketFamily -> SocketFamily -> SocketFamily)
-> (SocketFamily -> SocketFamily -> SocketFamily)
-> Ord SocketFamily
SocketFamily -> SocketFamily -> Bool
SocketFamily -> SocketFamily -> Ordering
SocketFamily -> SocketFamily -> SocketFamily
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SocketFamily -> SocketFamily -> SocketFamily
$cmin :: SocketFamily -> SocketFamily -> SocketFamily
max :: SocketFamily -> SocketFamily -> SocketFamily
$cmax :: SocketFamily -> SocketFamily -> SocketFamily
>= :: SocketFamily -> SocketFamily -> Bool
$c>= :: SocketFamily -> SocketFamily -> Bool
> :: SocketFamily -> SocketFamily -> Bool
$c> :: SocketFamily -> SocketFamily -> Bool
<= :: SocketFamily -> SocketFamily -> Bool
$c<= :: SocketFamily -> SocketFamily -> Bool
< :: SocketFamily -> SocketFamily -> Bool
$c< :: SocketFamily -> SocketFamily -> Bool
compare :: SocketFamily -> SocketFamily -> Ordering
$ccompare :: SocketFamily -> SocketFamily -> Ordering
$cp1Ord :: Eq SocketFamily
Ord, ReadPrec [SocketFamily]
ReadPrec SocketFamily
Int -> ReadS SocketFamily
ReadS [SocketFamily]
(Int -> ReadS SocketFamily)
-> ReadS [SocketFamily]
-> ReadPrec SocketFamily
-> ReadPrec [SocketFamily]
-> Read SocketFamily
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [SocketFamily]
$creadListPrec :: ReadPrec [SocketFamily]
readPrec :: ReadPrec SocketFamily
$creadPrec :: ReadPrec SocketFamily
readList :: ReadS [SocketFamily]
$creadList :: ReadS [SocketFamily]
readsPrec :: Int -> ReadS SocketFamily
$creadsPrec :: Int -> ReadS SocketFamily
Read, Int -> SocketFamily -> ShowS
[SocketFamily] -> ShowS
SocketFamily -> String
(Int -> SocketFamily -> ShowS)
-> (SocketFamily -> String)
-> ([SocketFamily] -> ShowS)
-> Show SocketFamily
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SocketFamily] -> ShowS
$cshowList :: [SocketFamily] -> ShowS
show :: SocketFamily -> String
$cshow :: SocketFamily -> String
showsPrec :: Int -> SocketFamily -> ShowS
$cshowsPrec :: Int -> SocketFamily -> ShowS
Show, Typeable)
newtype SocketType = SocketType CInt
    deriving (SocketType -> SocketType -> Bool
(SocketType -> SocketType -> Bool)
-> (SocketType -> SocketType -> Bool) -> Eq SocketType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SocketType -> SocketType -> Bool
$c/= :: SocketType -> SocketType -> Bool
== :: SocketType -> SocketType -> Bool
$c== :: SocketType -> SocketType -> Bool
Eq, Eq SocketType
Eq SocketType
-> (SocketType -> SocketType -> Ordering)
-> (SocketType -> SocketType -> Bool)
-> (SocketType -> SocketType -> Bool)
-> (SocketType -> SocketType -> Bool)
-> (SocketType -> SocketType -> Bool)
-> (SocketType -> SocketType -> SocketType)
-> (SocketType -> SocketType -> SocketType)
-> Ord SocketType
SocketType -> SocketType -> Bool
SocketType -> SocketType -> Ordering
SocketType -> SocketType -> SocketType
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SocketType -> SocketType -> SocketType
$cmin :: SocketType -> SocketType -> SocketType
max :: SocketType -> SocketType -> SocketType
$cmax :: SocketType -> SocketType -> SocketType
>= :: SocketType -> SocketType -> Bool
$c>= :: SocketType -> SocketType -> Bool
> :: SocketType -> SocketType -> Bool
$c> :: SocketType -> SocketType -> Bool
<= :: SocketType -> SocketType -> Bool
$c<= :: SocketType -> SocketType -> Bool
< :: SocketType -> SocketType -> Bool
$c< :: SocketType -> SocketType -> Bool
compare :: SocketType -> SocketType -> Ordering
$ccompare :: SocketType -> SocketType -> Ordering
$cp1Ord :: Eq SocketType
Ord, ReadPrec [SocketType]
ReadPrec SocketType
Int -> ReadS SocketType
ReadS [SocketType]
(Int -> ReadS SocketType)
-> ReadS [SocketType]
-> ReadPrec SocketType
-> ReadPrec [SocketType]
-> Read SocketType
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [SocketType]
$creadListPrec :: ReadPrec [SocketType]
readPrec :: ReadPrec SocketType
$creadPrec :: ReadPrec SocketType
readList :: ReadS [SocketType]
$creadList :: ReadS [SocketType]
readsPrec :: Int -> ReadS SocketType
$creadsPrec :: Int -> ReadS SocketType
Read, Int -> SocketType -> ShowS
[SocketType] -> ShowS
SocketType -> String
(Int -> SocketType -> ShowS)
-> (SocketType -> String)
-> ([SocketType] -> ShowS)
-> Show SocketType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SocketType] -> ShowS
$cshowList :: [SocketType] -> ShowS
show :: SocketType -> String
$cshow :: SocketType -> String
showsPrec :: Int -> SocketType -> ShowS
$cshowsPrec :: Int -> SocketType -> ShowS
Show, Typeable)
newtype ProtocolNumber = ProtocolNumber CInt
    deriving (ProtocolNumber -> ProtocolNumber -> Bool
(ProtocolNumber -> ProtocolNumber -> Bool)
-> (ProtocolNumber -> ProtocolNumber -> Bool) -> Eq ProtocolNumber
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ProtocolNumber -> ProtocolNumber -> Bool
$c/= :: ProtocolNumber -> ProtocolNumber -> Bool
== :: ProtocolNumber -> ProtocolNumber -> Bool
$c== :: ProtocolNumber -> ProtocolNumber -> Bool
Eq, Eq ProtocolNumber
Eq ProtocolNumber
-> (ProtocolNumber -> ProtocolNumber -> Ordering)
-> (ProtocolNumber -> ProtocolNumber -> Bool)
-> (ProtocolNumber -> ProtocolNumber -> Bool)
-> (ProtocolNumber -> ProtocolNumber -> Bool)
-> (ProtocolNumber -> ProtocolNumber -> Bool)
-> (ProtocolNumber -> ProtocolNumber -> ProtocolNumber)
-> (ProtocolNumber -> ProtocolNumber -> ProtocolNumber)
-> Ord ProtocolNumber
ProtocolNumber -> ProtocolNumber -> Bool
ProtocolNumber -> ProtocolNumber -> Ordering
ProtocolNumber -> ProtocolNumber -> ProtocolNumber
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ProtocolNumber -> ProtocolNumber -> ProtocolNumber
$cmin :: ProtocolNumber -> ProtocolNumber -> ProtocolNumber
max :: ProtocolNumber -> ProtocolNumber -> ProtocolNumber
$cmax :: ProtocolNumber -> ProtocolNumber -> ProtocolNumber
>= :: ProtocolNumber -> ProtocolNumber -> Bool
$c>= :: ProtocolNumber -> ProtocolNumber -> Bool
> :: ProtocolNumber -> ProtocolNumber -> Bool
$c> :: ProtocolNumber -> ProtocolNumber -> Bool
<= :: ProtocolNumber -> ProtocolNumber -> Bool
$c<= :: ProtocolNumber -> ProtocolNumber -> Bool
< :: ProtocolNumber -> ProtocolNumber -> Bool
$c< :: ProtocolNumber -> ProtocolNumber -> Bool
compare :: ProtocolNumber -> ProtocolNumber -> Ordering
$ccompare :: ProtocolNumber -> ProtocolNumber -> Ordering
$cp1Ord :: Eq ProtocolNumber
Ord, ReadPrec [ProtocolNumber]
ReadPrec ProtocolNumber
Int -> ReadS ProtocolNumber
ReadS [ProtocolNumber]
(Int -> ReadS ProtocolNumber)
-> ReadS [ProtocolNumber]
-> ReadPrec ProtocolNumber
-> ReadPrec [ProtocolNumber]
-> Read ProtocolNumber
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ProtocolNumber]
$creadListPrec :: ReadPrec [ProtocolNumber]
readPrec :: ReadPrec ProtocolNumber
$creadPrec :: ReadPrec ProtocolNumber
readList :: ReadS [ProtocolNumber]
$creadList :: ReadS [ProtocolNumber]
readsPrec :: Int -> ReadS ProtocolNumber
$creadsPrec :: Int -> ReadS ProtocolNumber
Read, Int -> ProtocolNumber -> ShowS
[ProtocolNumber] -> ShowS
ProtocolNumber -> String
(Int -> ProtocolNumber -> ShowS)
-> (ProtocolNumber -> String)
-> ([ProtocolNumber] -> ShowS)
-> Show ProtocolNumber
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ProtocolNumber] -> ShowS
$cshowList :: [ProtocolNumber] -> ShowS
show :: ProtocolNumber -> String
$cshow :: ProtocolNumber -> String
showsPrec :: Int -> ProtocolNumber -> ShowS
$cshowsPrec :: Int -> ProtocolNumber -> ShowS
Show, Typeable)

instance Storable SocketFamily where                      
    sizeOf :: SocketFamily -> Int
sizeOf SocketFamily
_ = CInt -> Int
forall a. Storable a => a -> Int
sizeOf (CInt
forall a. HasCallStack => a
undefined :: CInt)       
    alignment :: SocketFamily -> Int
alignment SocketFamily
_ = CInt -> Int
forall a. Storable a => a -> Int
alignment (CInt
forall a. HasCallStack => a
undefined :: CInt) 
    peek :: Ptr SocketFamily -> IO SocketFamily
peek Ptr SocketFamily
ptr = CInt -> SocketFamily
SocketFamily (CInt -> SocketFamily) -> IO CInt -> IO SocketFamily
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr SocketFamily -> Ptr CInt
forall a b. Ptr a -> Ptr b
castPtr Ptr SocketFamily
ptr)             
    poke :: Ptr SocketFamily -> SocketFamily -> IO ()
poke Ptr SocketFamily
ptr (SocketFamily CInt
v) = Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr SocketFamily -> Ptr CInt
forall a b. Ptr a -> Ptr b
castPtr Ptr SocketFamily
ptr) CInt
v

instance Storable SocketType where                      
    sizeOf :: SocketType -> Int
sizeOf SocketType
_ = CInt -> Int
forall a. Storable a => a -> Int
sizeOf (CInt
forall a. HasCallStack => a
undefined :: CInt)       
    alignment :: SocketType -> Int
alignment SocketType
_ = CInt -> Int
forall a. Storable a => a -> Int
alignment (CInt
forall a. HasCallStack => a
undefined :: CInt) 
    peek :: Ptr SocketType -> IO SocketType
peek Ptr SocketType
ptr = CInt -> SocketType
SocketType (CInt -> SocketType) -> IO CInt -> IO SocketType
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr SocketType -> Ptr CInt
forall a b. Ptr a -> Ptr b
castPtr Ptr SocketType
ptr)             
    poke :: Ptr SocketType -> SocketType -> IO ()
poke Ptr SocketType
ptr (SocketType CInt
v) = Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr SocketType -> Ptr CInt
forall a b. Ptr a -> Ptr b
castPtr Ptr SocketType
ptr) CInt
v

instance Storable ProtocolNumber where                      
    sizeOf :: ProtocolNumber -> Int
sizeOf ProtocolNumber
_ = CInt -> Int
forall a. Storable a => a -> Int
sizeOf (CInt
forall a. HasCallStack => a
undefined :: CInt)       
    alignment :: ProtocolNumber -> Int
alignment ProtocolNumber
_ = CInt -> Int
forall a. Storable a => a -> Int
alignment (CInt
forall a. HasCallStack => a
undefined :: CInt) 
    peek :: Ptr ProtocolNumber -> IO ProtocolNumber
peek Ptr ProtocolNumber
ptr = CInt -> ProtocolNumber
ProtocolNumber (CInt -> ProtocolNumber) -> IO CInt -> IO ProtocolNumber
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr ProtocolNumber -> Ptr CInt
forall a b. Ptr a -> Ptr b
castPtr Ptr ProtocolNumber
ptr)             
    poke :: Ptr ProtocolNumber -> ProtocolNumber -> IO ()
poke Ptr ProtocolNumber
ptr (ProtocolNumber CInt
v) = Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ProtocolNumber -> Ptr CInt
forall a b. Ptr a -> Ptr b
castPtr Ptr ProtocolNumber
ptr) CInt
v

-- | unspecified
pattern AF_UNSPEC :: SocketFamily
pattern $bAF_UNSPEC :: SocketFamily
$mAF_UNSPEC :: forall r. SocketFamily -> (Void# -> r) -> (Void# -> r) -> r
AF_UNSPEC = SocketFamily (0)
{-# LINE 556 "Z/IO/Network/SocketAddr.hsc" #-}
-- | internetwork: UDP, TCP, etc
pattern AF_INET :: SocketFamily
pattern $bAF_INET :: SocketFamily
$mAF_INET :: forall r. SocketFamily -> (Void# -> r) -> (Void# -> r) -> r
AF_INET = SocketFamily (2)
{-# LINE 559 "Z/IO/Network/SocketAddr.hsc" #-}
-- | Internet Protocol version 6
pattern AF_INET6 :: SocketFamily
pattern $bAF_INET6 :: SocketFamily
$mAF_INET6 :: forall r. SocketFamily -> (Void# -> r) -> (Void# -> r) -> r
AF_INET6 = SocketFamily (10)
{-# LINE 562 "Z/IO/Network/SocketAddr.hsc" #-}

pattern SOCK_STREAM :: SocketType
pattern $bSOCK_STREAM :: SocketType
$mSOCK_STREAM :: forall r. SocketType -> (Void# -> r) -> (Void# -> r) -> r
SOCK_STREAM = SocketType (1)
{-# LINE 565 "Z/IO/Network/SocketAddr.hsc" #-}
pattern SOCK_DGRAM :: SocketType
pattern $bSOCK_DGRAM :: SocketType
$mSOCK_DGRAM :: forall r. SocketType -> (Void# -> r) -> (Void# -> r) -> r
SOCK_DGRAM = SocketType (2)
{-# LINE 567 "Z/IO/Network/SocketAddr.hsc" #-}
pattern SOCK_RAW :: SocketType
pattern $bSOCK_RAW :: SocketType
$mSOCK_RAW :: forall r. SocketType -> (Void# -> r) -> (Void# -> r) -> r
SOCK_RAW = SocketType (3)
{-# LINE 569 "Z/IO/Network/SocketAddr.hsc" #-}
pattern SOCK_RDM :: SocketType
pattern $bSOCK_RDM :: SocketType
$mSOCK_RDM :: forall r. SocketType -> (Void# -> r) -> (Void# -> r) -> r
SOCK_RDM = SocketType (4)
{-# LINE 571 "Z/IO/Network/SocketAddr.hsc" #-}
pattern SOCK_SEQPACKET :: SocketType
pattern $bSOCK_SEQPACKET :: SocketType
$mSOCK_SEQPACKET :: forall r. SocketType -> (Void# -> r) -> (Void# -> r) -> r
SOCK_SEQPACKET = SocketType (5)
{-# LINE 573 "Z/IO/Network/SocketAddr.hsc" #-}
-- | Used in getAddrInfo hints, for any type can be returned by getAddrInfo
pattern SOCK_ANY :: SocketType
pattern $bSOCK_ANY :: SocketType
$mSOCK_ANY :: forall r. SocketType -> (Void# -> r) -> (Void# -> r) -> r
SOCK_ANY = SocketType 0

pattern IPPROTO_DEFAULT :: ProtocolNumber
pattern $bIPPROTO_DEFAULT :: ProtocolNumber
$mIPPROTO_DEFAULT :: forall r. ProtocolNumber -> (Void# -> r) -> (Void# -> r) -> r
IPPROTO_DEFAULT = ProtocolNumber 0
pattern IPPROTO_IP :: ProtocolNumber
pattern $bIPPROTO_IP :: ProtocolNumber
$mIPPROTO_IP :: forall r. ProtocolNumber -> (Void# -> r) -> (Void# -> r) -> r
IPPROTO_IP = ProtocolNumber (0)
{-# LINE 581 "Z/IO/Network/SocketAddr.hsc" #-}
pattern IPPROTO_TCP :: ProtocolNumber
pattern $bIPPROTO_TCP :: ProtocolNumber
$mIPPROTO_TCP :: forall r. ProtocolNumber -> (Void# -> r) -> (Void# -> r) -> r
IPPROTO_TCP = ProtocolNumber (6)
{-# LINE 583 "Z/IO/Network/SocketAddr.hsc" #-}
pattern IPPROTO_UDP :: ProtocolNumber
pattern $bIPPROTO_UDP :: ProtocolNumber
$mIPPROTO_UDP :: forall r. ProtocolNumber -> (Void# -> r) -> (Void# -> r) -> r
IPPROTO_UDP = ProtocolNumber (17)
{-# LINE 585 "Z/IO/Network/SocketAddr.hsc" #-}

--------------------------------------------------------------------------------

foreign import ccall unsafe "ntohs" ntohs :: Word16 -> Word16
{-# LINE 589 "Z/IO/Network/SocketAddr.hsc" #-}
foreign import ccall unsafe "htons" htons :: Word16 -> Word16
{-# LINE 590 "Z/IO/Network/SocketAddr.hsc" #-}
foreign import ccall unsafe "ntohl" ntohl :: Word32 -> Word32
{-# LINE 591 "Z/IO/Network/SocketAddr.hsc" #-}
foreign import ccall unsafe "htonl" htonl :: Word32 -> Word32
{-# LINE 592 "Z/IO/Network/SocketAddr.hsc" #-}

foreign import ccall unsafe uv_ip4_addr :: CString -> CInt -> MBA# SocketAddr -> IO CInt
foreign import ccall unsafe uv_ip6_addr :: CString -> CInt -> MBA# SocketAddr -> IO CInt