{-# LINE 1 "Z/IO/Network/SocketAddr.hsc" #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE PatternSynonyms    #-}

{-|
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(..)
  , sockAddrFamily
  , peekSocketAddr
  , withSocketAddr
  , sizeOfSocketAddr
  , withSocketAddrStorage
  , 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
  , htons
  , ntohs
  , ntohl
  , htonl
  -- * 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
  ) 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           Z.IO.Exception
import           Z.IO.UV.Errno




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


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

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


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

{-# LINE 98 "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)

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


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

-- | 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 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)
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 
{-
-- | Parse IPv4 address in format "a.b.c.d"
parseInetAddr:: V.Bytes -> Either P.ParseError InetAddr
parseInetAddr = P.parse_ inetAddrParser

-- | Parse IPv4 address in format "a.b.c.d", octets must be between 0 and 255. 
inetAddrParser :: P.Parser InetAddr
inetAddrParser = do
    a <- oct
    P.char8 '.'
    b <- oct
    P.char8 '.'
    c <- oct
    P.char8 '.'
    d <- oct
    return $! tupleToInetAddr (a,b,c,d)
  where
    oct = do
        x <- P.uint :: P.Parser Integer
        if (x > 255) 
        then fail "all octets in an IPv4 address must be between 0 and 255"
        else return $! fromIntegral x
-}
        
-- | @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)

-- | 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)


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..]

{-
-- | Parse IPv6 address in format "a.b.c.d"
parseInet6Addr:: V.Bytes -> Either P.ParseError Inet6Addr
parseInet6Addr = P.parse_ inet6AddrParser

-- | Parse IPv6 address in format "a.b.c.d"
--
-- Octets must be between 0 and 255. 
-- Note: if octets exceed (maxBound :: Int), parser will overflow.
inet6AddrParser :: P.Parser Inet6Addr
inet6AddrParser = do
    a <- oct
    P.char8 '.'
    b <- oct
    P.char8 '.'
    c <- oct
    P.char8 '.'
    d <- oct
    return $! tupleToInetAddr (a,b,c,d)
  where
    oct = do
        x <- P.uint :: P.Parser Int
        if (x > 255) 
        then fail "all octets in an IPv4 address must be between 0 and 255"
        else return $! fromIntegral x
-}

-- | @::@
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

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)

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 305 "Z/IO/Network/SocketAddr.hsc" #-}
    alignment _ = 4
{-# LINE 306 "Z/IO/Network/SocketAddr.hsc" #-}

    peek :: Ptr Inet6Addr -> IO Inet6Addr
peek Ptr Inet6Addr
p = do
        FlowInfo
a <- Ptr Inet6Addr -> Int -> IO FlowInfo
forall a. Ptr a -> Int -> IO FlowInfo
peek32 Ptr Inet6Addr
p Int
0
        FlowInfo
b <- Ptr Inet6Addr -> Int -> IO FlowInfo
forall a. Ptr a -> Int -> IO FlowInfo
peek32 Ptr Inet6Addr
p Int
1
        FlowInfo
c <- Ptr Inet6Addr -> Int -> IO FlowInfo
forall a. Ptr a -> Int -> IO FlowInfo
peek32 Ptr Inet6Addr
p Int
2
        FlowInfo
d <- Ptr Inet6Addr -> Int -> IO FlowInfo
forall a. Ptr a -> Int -> IO FlowInfo
peek32 Ptr Inet6Addr
p Int
3
        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 FlowInfo
a FlowInfo
b FlowInfo
c FlowInfo
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

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

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 325 "Z/IO/Network/SocketAddr.hsc" #-}
    case family :: CSaFamily of
        (2) -> do
{-# LINE 327 "Z/IO/Network/SocketAddr.hsc" #-}
            addr <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 328 "Z/IO/Network/SocketAddr.hsc" #-}
            port <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 329 "Z/IO/Network/SocketAddr.hsc" #-}
            return (SocketAddrInet (PortNumber port) addr)
        (10) -> do
{-# LINE 331 "Z/IO/Network/SocketAddr.hsc" #-}
            port <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 332 "Z/IO/Network/SocketAddr.hsc" #-}
            flow <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 333 "Z/IO/Network/SocketAddr.hsc" #-}
            addr <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p
{-# LINE 334 "Z/IO/Network/SocketAddr.hsc" #-}
            scope <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) p
{-# LINE 335 "Z/IO/Network/SocketAddr.hsc" #-}
            return (SocketAddrInet6 (PortNumber port) flow addr scope)

        _ -> do let errno = UV_EAI_ADDRFAMILY
                name <- uvErrName errno
                desc <- uvStdError errno
                throwUVError errno (IOEInfo name desc callStack)

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

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

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

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

{-# LINE 360 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p ((10) :: CSaFamily)
{-# LINE 361 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 2)) p port
{-# LINE 362 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p flow
{-# LINE 363 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) p (addr)
{-# LINE 364 "Z/IO/Network/SocketAddr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 24)) p scope
{-# LINE 365 "Z/IO/Network/SocketAddr.hsc" #-}

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 370 "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 -> HasCallStack => Ptr SocketAddr -> SocketAddr -> IO ()
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 371 "Z/IO/Network/SocketAddr.hsc" #-}
withSocketAddr sa@(SocketAddrInet6 _ _ _ _) f = do
    allocaBytesAligned 
        ((28)) 
{-# LINE 374 "Z/IO/Network/SocketAddr.hsc" #-}
        (4) $ \ p -> pokeSocketAddr p sa >> f p
{-# LINE 375 "Z/IO/Network/SocketAddr.hsc" #-}

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

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 384 "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 385 "Z/IO/Network/SocketAddr.hsc" #-}

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

-- The peek32 and poke32 functions work around the fact that the RFCs
-- don't require 32-bit-wide address fields to be present.  We can
-- only portably rely on an 8-bit field, s6_addr.

s6_addr_offset :: Int
s6_addr_offset :: Int
s6_addr_offset = ((Int
0))
{-# LINE 395 "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)

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

-- Port Numbers

-- | Use the @Num@ instance (i.e. use a literal or 'fromIntegral') to create a
-- @PortNumber@ value with the correct network-byte-ordering.
--
-- >>> 1 :: PortNumber
-- 1
-- >>> read "1" :: PortNumber
-- 1
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, Typeable)
-- newtyped to prevent accidental use of sane-looking
-- port numbers that haven't actually been converted to
-- network-byte-order first.

portAny :: PortNumber
portAny :: PortNumber
portAny = PortNumber
0

instance Show PortNumber where
  showsPrec :: Int -> PortNumber -> ShowS
showsPrec Int
p PortNumber
pn = Int -> Int -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p (PortNumber -> Int
portNumberToInt PortNumber
pn)

instance Read PortNumber where
  readsPrec :: Int -> ReadS PortNumber
readsPrec Int
n = ((Int, String) -> (PortNumber, String))
-> [(Int, String)] -> [(PortNumber, String)]
forall a b. (a -> b) -> [a] -> [b]
map (\(Int
x,String
y) -> (Int -> PortNumber
intToPortNumber Int
x, String
y)) ([(Int, String)] -> [(PortNumber, String)])
-> (String -> [(Int, String)]) -> ReadS PortNumber
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> [(Int, String)]
forall a. Read a => Int -> ReadS a
readsPrec Int
n

intToPortNumber :: Int -> PortNumber
intToPortNumber :: Int -> PortNumber
intToPortNumber Int
v = Word16 -> PortNumber
PortNumber (Word16 -> Word16
htons (Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
v))

portNumberToInt :: PortNumber -> Int
portNumberToInt :: PortNumber -> Int
portNumberToInt (PortNumber Word16
po) = Word16 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16 -> Word16
ntohs Word16
po)

foreign import ccall unsafe "ntohs" ntohs :: Word16 -> Word16
{-# LINE 449 "Z/IO/Network/SocketAddr.hsc" #-}
foreign import ccall unsafe "htons" htons :: Word16 -> Word16
{-# LINE 450 "Z/IO/Network/SocketAddr.hsc" #-}
foreign import ccall unsafe "ntohl" ntohl :: Word32 -> Word32
{-# LINE 451 "Z/IO/Network/SocketAddr.hsc" #-}
foreign import ccall unsafe "htonl" htonl :: Word32 -> Word32
{-# LINE 452 "Z/IO/Network/SocketAddr.hsc" #-}

instance Enum PortNumber where
    toEnum :: Int -> PortNumber
toEnum   = Int -> PortNumber
intToPortNumber
    fromEnum :: PortNumber -> Int
fromEnum = PortNumber -> Int
portNumberToInt

instance Num PortNumber where
   fromInteger :: Integer -> PortNumber
fromInteger Integer
i = Int -> PortNumber
intToPortNumber (Integer -> Int
forall a. Num a => Integer -> a
fromInteger Integer
i)
    -- for completeness.
   + :: PortNumber -> PortNumber -> PortNumber
(+) PortNumber
x PortNumber
y   = Int -> PortNumber
intToPortNumber (PortNumber -> Int
portNumberToInt PortNumber
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ PortNumber -> Int
portNumberToInt PortNumber
y)
   (-) PortNumber
x PortNumber
y   = Int -> PortNumber
intToPortNumber (PortNumber -> Int
portNumberToInt PortNumber
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- PortNumber -> Int
portNumberToInt PortNumber
y)
   negate :: PortNumber -> PortNumber
negate PortNumber
x  = Int -> PortNumber
intToPortNumber (-PortNumber -> Int
portNumberToInt PortNumber
x)
   * :: PortNumber -> PortNumber -> PortNumber
(*) PortNumber
x PortNumber
y   = Int -> PortNumber
intToPortNumber (PortNumber -> Int
portNumberToInt PortNumber
x Int -> Int -> Int
forall a. Num a => a -> a -> a
* PortNumber -> Int
portNumberToInt PortNumber
y)
   abs :: PortNumber -> PortNumber
abs PortNumber
n     = Int -> PortNumber
intToPortNumber (Int -> Int
forall a. Num a => a -> a
abs (PortNumber -> Int
portNumberToInt PortNumber
n))
   signum :: PortNumber -> PortNumber
signum PortNumber
n  = Int -> PortNumber
intToPortNumber (Int -> Int
forall a. Num a => a -> a
signum (PortNumber -> Int
portNumberToInt PortNumber
n))

instance Real PortNumber where
    toRational :: PortNumber -> Rational
toRational PortNumber
x = PortNumber -> Integer
forall a. Integral a => a -> Integer
toInteger PortNumber
x Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
% Integer
1

instance Integral PortNumber where
    quotRem :: PortNumber -> PortNumber -> (PortNumber, PortNumber)
quotRem PortNumber
a PortNumber
b = let (Int
c,Int
d) = Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
quotRem (PortNumber -> Int
portNumberToInt PortNumber
a) (PortNumber -> Int
portNumberToInt PortNumber
b) in
                  (Int -> PortNumber
intToPortNumber Int
c, Int -> PortNumber
intToPortNumber Int
d)
    toInteger :: PortNumber -> Integer
toInteger PortNumber
a = Int -> Integer
forall a. Integral a => a -> Integer
toInteger (PortNumber -> Int
portNumberToInt PortNumber
a)

instance Storable PortNumber where
   sizeOf :: PortNumber -> Int
sizeOf    PortNumber
_ = Word16 -> Int
forall a. Storable a => a -> Int
sizeOf    (Word16
forall a. HasCallStack => a
undefined :: Word16)
   alignment :: PortNumber -> Int
alignment PortNumber
_ = Word16 -> Int
forall a. Storable a => a -> Int
alignment (Word16
forall a. HasCallStack => a
undefined :: 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
po
   peek :: Ptr PortNumber -> IO PortNumber
peek Ptr PortNumber
p = Word16 -> PortNumber
PortNumber (Word16 -> PortNumber) -> IO Word16 -> IO PortNumber
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` 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)
    
--------------------------------------------------------------------------------

newtype SocketFamily = SocketFamily CInt deriving (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, 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, 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, Typeable)
newtype SocketType = SocketType CInt deriving (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, 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, 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, Typeable)
newtype ProtocolNumber = ProtocolNumber CInt deriving (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, 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, 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, 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 508 "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 511 "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 514 "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 517 "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 519 "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 521 "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 523 "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 525 "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 533 "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 535 "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 537 "Z/IO/Network/SocketAddr.hsc" #-}