{-# 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(AF_UNSPEC, AF_INET, AF_INET6)
  , SocketType(SOCK_DGRAM, SOCK_STREAM, SOCK_SEQPACKET, SOCK_RAW, SOCK_RDM, SOCK_ANY)
  , ProtocolNumber(IPPROTO_DEFAULT, IPPROTO_IP, IPPROTO_TCP, IPPROTO_UDP)
  -- * Internal helper
  , peekSocketAddr
  , pokeSocketAddr
  , peekSocketAddrMBA
  , pokeSocketAddrMBA
  , htons
  , ntohs
  , ntohl
  , htonl
  ) where

import           Data.Bits
import qualified Data.List                as List
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 88 "Z/IO/Network/SocketAddr.hsc" #-}


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

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


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

{-# LINE 100 "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 278 "Z/IO/Network/SocketAddr.hsc" #-}
    alignment _ = 4
{-# LINE 279 "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 294 "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 318 "Z/IO/Network/SocketAddr.hsc" #-}

    indexBA :: ByteArray# -> Int -> Inet6Addr
indexBA ByteArray#
p Int
off = 
        let a :: BE FlowInfo
a = ByteArray# -> Int -> BE FlowInfo
forall a. UnalignedAccess a => ByteArray# -> Int -> a
indexBA ByteArray#
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)
            b :: BE FlowInfo
b = ByteArray# -> Int -> BE FlowInfo
forall a. UnalignedAccess a => ByteArray# -> Int -> a
indexBA ByteArray#
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)
            c :: BE FlowInfo
c = ByteArray# -> Int -> BE FlowInfo
forall a. UnalignedAccess a => ByteArray# -> Int -> a
indexBA ByteArray#
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)
            d :: BE FlowInfo
d = ByteArray# -> Int -> BE FlowInfo
forall a. UnalignedAccess a => ByteArray# -> Int -> a
indexBA ByteArray#
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)
        in 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)

    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 344 "Z/IO/Network/SocketAddr.hsc" #-}
    case family :: CSaFamily of
        (2) -> do
{-# LINE 346 "Z/IO/Network/SocketAddr.hsc" #-}
            addr <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 347 "Z/IO/Network/SocketAddr.hsc" #-}
            port <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 348 "Z/IO/Network/SocketAddr.hsc" #-}
            return (SocketAddrInet port addr)
        (10) -> do
{-# LINE 350 "Z/IO/Network/SocketAddr.hsc" #-}
            port <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 351 "Z/IO/Network/SocketAddr.hsc" #-}
            flow <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 352 "Z/IO/Network/SocketAddr.hsc" #-}
            addr <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p
{-# LINE 353 "Z/IO/Network/SocketAddr.hsc" #-}
            scope <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) p
{-# LINE 354 "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 365 "Z/IO/Network/SocketAddr.hsc" #-}

{-# LINE 368 "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 369 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 2)) p port
{-# LINE 370 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p addr
{-# LINE 371 "Z/IO/Network/SocketAddr.hsc" #-}
pokeSocketAddr p (SocketAddrInet6 port flow addr scope) =  do

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

{-# LINE 378 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p ((10) :: CSaFamily)
{-# LINE 379 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 2)) p port
{-# LINE 380 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p flow
{-# LINE 381 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) p (addr)
{-# LINE 382 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 24)) p scope
{-# LINE 383 "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 391 "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 392 "Z/IO/Network/SocketAddr.hsc" #-}
withSocketAddr sa@(SocketAddrInet6 _ _ _ _) f = do
    allocaBytesAligned 
        ((28)) 
{-# LINE 395 "Z/IO/Network/SocketAddr.hsc" #-}
        (4) $ \ p -> pokeSocketAddr p sa >> f p
{-# LINE 396 "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 404 "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 407 "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 411 "Z/IO/Network/SocketAddr.hsc" #-}
sizeOfSocketAddr (SocketAddrInet6 _ _ _ _) = (28)
{-# LINE 412 "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 418 "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 419 "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 427 "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 431 "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 435 "Z/IO/Network/SocketAddr.hsc" #-}
    case family :: CSaFamily of
        (2) -> do
{-# LINE 437 "Z/IO/Network/SocketAddr.hsc" #-}
            addr <- peekMBA p ((4)) 
{-# LINE 438 "Z/IO/Network/SocketAddr.hsc" #-}
            port <- peekMBA p ((2)) 
{-# LINE 439 "Z/IO/Network/SocketAddr.hsc" #-}
            return (SocketAddrInet port addr)
        (10) -> do
{-# LINE 441 "Z/IO/Network/SocketAddr.hsc" #-}
            port <- peekMBA p ((2)) 
{-# LINE 442 "Z/IO/Network/SocketAddr.hsc" #-}
            flow <- peekMBA p ((4)) 
{-# LINE 443 "Z/IO/Network/SocketAddr.hsc" #-}
            addr <- peekMBA p ((8)) 
{-# LINE 444 "Z/IO/Network/SocketAddr.hsc" #-}
            scope <- peekMBA p ((24)) 
{-# LINE 445 "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 456 "Z/IO/Network/SocketAddr.hsc" #-}

{-# LINE 459 "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 460 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((2)) port
{-# LINE 461 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((4)) addr
{-# LINE 462 "Z/IO/Network/SocketAddr.hsc" #-}
pokeSocketAddrMBA p (SocketAddrInet6 port flow addr scope) =  do

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

{-# LINE 469 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((0)) ((10) :: CSaFamily)
{-# LINE 470 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((2)) port
{-# LINE 471 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((4)) flow
{-# LINE 472 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((8)) (addr)
{-# LINE 473 "Z/IO/Network/SocketAddr.hsc" #-}
    pokeMBA p ((24)) scope
{-# LINE 474 "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
   indexBA :: ByteArray# -> Int -> PortNumber
indexBA ByteArray#
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) -> Word16 -> PortNumber
forall a b. (a -> b) -> a -> b
$ ByteArray# -> Int -> Word16
forall a. UnalignedAccess a => ByteArray# -> Int -> a
indexBA ByteArray#
p Int
off
   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 550 "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 553 "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 556 "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 559 "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 561 "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 563 "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 565 "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 567 "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 575 "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 577 "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 579 "Z/IO/Network/SocketAddr.hsc" #-}

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

foreign import ccall unsafe "ntohs" ntohs :: Word16 -> Word16
{-# LINE 583 "Z/IO/Network/SocketAddr.hsc" #-}
foreign import ccall unsafe "htons" htons :: Word16 -> Word16
{-# LINE 584 "Z/IO/Network/SocketAddr.hsc" #-}
foreign import ccall unsafe "ntohl" ntohl :: Word32 -> Word32
{-# LINE 585 "Z/IO/Network/SocketAddr.hsc" #-}
foreign import ccall unsafe "htonl" htonl :: Word32 -> Word32
{-# LINE 586 "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