{-# LINE 1 "Network/Socket/Types.hsc" #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE MagicHash, UnboxedTuples #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
#include "HsNetDef.h"
module Network.Socket.Types (
    
      Socket
    , withFdSocket
    , unsafeFdSocket
    , touchSocket
    , socketToFd
    , fdSocket
    , mkSocket
    , invalidateSocket
    , close
    , close'
    , c_close
    
    , SocketType(GeneralSocketType, UnsupportedSocketType, NoSocketType
                , Stream, Datagram, Raw, RDM, SeqPacket)
    , isSupportedSocketType
    , packSocketType
    , unpackSocketType
    
    , Family(GeneralFamily, UnsupportedFamily
            ,AF_UNSPEC,AF_UNIX,AF_INET,AF_INET6,AF_IMPLINK,AF_PUP,AF_CHAOS
            ,AF_NS,AF_NBS,AF_ECMA,AF_DATAKIT,AF_CCITT,AF_SNA,AF_DECnet
            ,AF_DLI,AF_LAT,AF_HYLINK,AF_APPLETALK,AF_ROUTE,AF_NETBIOS
            ,AF_NIT,AF_802,AF_ISO,AF_OSI,AF_NETMAN,AF_X25,AF_AX25,AF_OSINET
            ,AF_GOSSIP,AF_IPX,Pseudo_AF_XTP,AF_CTF,AF_WAN,AF_SDL,AF_NETWARE
            ,AF_NDD,AF_INTF,AF_COIP,AF_CNT,Pseudo_AF_RTIP,Pseudo_AF_PIP
            ,AF_SIP,AF_ISDN,Pseudo_AF_KEY,AF_NATM,AF_ARP,Pseudo_AF_HDRCMPLT
            ,AF_ENCAP,AF_LINK,AF_RAW,AF_RIF,AF_NETROM,AF_BRIDGE,AF_ATMPVC
            ,AF_ROSE,AF_NETBEUI,AF_SECURITY,AF_PACKET,AF_ASH,AF_ECONET
            ,AF_ATMSVC,AF_IRDA,AF_PPPOX,AF_WANPIPE,AF_BLUETOOTH,AF_CAN)
    , isSupportedFamily
    , packFamily
    , unpackFamily
    
    , SocketAddress(..)
    , withSocketAddress
    , withNewSocketAddress
    
    , SockAddr(..)
    , isSupportedSockAddr
    , HostAddress
    , hostAddressToTuple
    , tupleToHostAddress
    , HostAddress6
    , hostAddress6ToTuple
    , tupleToHostAddress6
    , FlowInfo
    , ScopeID
    , peekSockAddr
    , pokeSockAddr
    , withSockAddr
    
    , ProtocolNumber
    , defaultProtocol
    , PortNumber
    , defaultPort
    
    , zeroMemory
    , htonl
    , ntohl
    , In6Addr(..)
    ) where
import Data.IORef (IORef, newIORef, readIORef, atomicModifyIORef', mkWeakIORef)
import Foreign.C.Error (throwErrno)
import Foreign.Marshal.Alloc
import GHC.Conc (closeFdWith)
import System.Posix.Types (Fd)
import Control.DeepSeq (NFData (..))
import GHC.Exts (touch#)
import GHC.IORef (IORef (..))
import GHC.STRef (STRef (..))
import GHC.IO (IO (..))
import qualified Text.Read as P
import Foreign.Marshal.Array
import Network.Socket.Imports
import Network.Socket.ReadShow
data Socket = Socket !(IORef CInt) !CInt 
instance Show Socket where
    show (Socket _ ofd) = "<socket: " ++ show ofd ++ ">"
instance Eq Socket where
    Socket ref1 _ == Socket ref2 _ = ref1 == ref2
{-# DEPRECATED fdSocket "Use withFdSocket or unsafeFdSocket instead" #-}
fdSocket :: Socket -> IO CInt
fdSocket = unsafeFdSocket
unsafeFdSocket :: Socket -> IO CInt
unsafeFdSocket (Socket ref _) = readIORef ref
touchSocket :: Socket -> IO ()
touchSocket (Socket ref _) = touch ref
touch :: IORef a -> IO ()
touch (IORef (STRef mutVar)) =
  
  
  
  
  IO $ \s -> (# touch# mutVar s, () #)
withFdSocket :: Socket -> (CInt -> IO r) -> IO r
withFdSocket (Socket ref _) f = do
  fd <- readIORef ref
  
  
  r <- f fd
  touch ref
  return r
socketToFd :: Socket -> IO CInt
socketToFd s = do
{-# LINE 202 "Network/Socket/Types.hsc" #-}
    fd <- unsafeFdSocket s
    
    fd2 <- c_dup fd
    close s
    return fd2
foreign import ccall unsafe "dup"
   c_dup :: CInt -> IO CInt
{-# LINE 211 "Network/Socket/Types.hsc" #-}
mkSocket :: CInt -> IO Socket
mkSocket fd = do
    ref <- newIORef fd
    let s = Socket ref fd
    void $ mkWeakIORef ref $ close s
    return s
invalidSocket :: CInt
{-# LINE 224 "Network/Socket/Types.hsc" #-}
invalidSocket = -1
{-# LINE 226 "Network/Socket/Types.hsc" #-}
invalidateSocket ::
      Socket
   -> (CInt -> IO a)
   -> (CInt -> IO a)
   -> IO a
invalidateSocket (Socket ref _) errorAction normalAction = do
    oldfd <- atomicModifyIORef' ref $ \cur -> (invalidSocket, cur)
    if oldfd == invalidSocket then errorAction oldfd else normalAction oldfd
close :: Socket -> IO ()
close s = invalidateSocket s (\_ -> return ()) $ \oldfd -> do
    
    closeFdWith closeFd (toFd oldfd)
  where
    toFd :: CInt -> Fd
    toFd = fromIntegral
    
    
    closeFd :: Fd -> IO ()
    closeFd = void . c_close . fromIntegral
close' :: Socket -> IO ()
close' s = invalidateSocket s (\_ -> return ()) $ \oldfd -> do
    
    closeFdWith closeFd (toFd oldfd)
  where
    toFd :: CInt -> Fd
    toFd = fromIntegral
    closeFd :: Fd -> IO ()
    closeFd fd = do
        ret <- c_close $ fromIntegral fd
        when (ret == -1) $ throwErrno "Network.Socket.close'"
{-# LINE 274 "Network/Socket/Types.hsc" #-}
foreign import ccall unsafe "close"
  c_close :: CInt -> IO CInt
{-# LINE 277 "Network/Socket/Types.hsc" #-}
type ProtocolNumber = CInt
defaultProtocol :: ProtocolNumber
defaultProtocol = 0
newtype SocketType = SocketType { packSocketType :: CInt }
        deriving (Eq, Ord)
unpackSocketType :: CInt -> SocketType
unpackSocketType = SocketType
{-# INLINE unpackSocketType #-}
isSupportedSocketType :: SocketType -> Bool
isSupportedSocketType = (/= UnsupportedSocketType)
pattern GeneralSocketType    :: CInt -> SocketType
pattern GeneralSocketType n  =  SocketType n
{-# LINE 329 "Network/Socket/Types.hsc" #-}
{-# COMPLETE GeneralSocketType #-}
{-# LINE 331 "Network/Socket/Types.hsc" #-}
pattern UnsupportedSocketType :: SocketType
pattern UnsupportedSocketType  = SocketType (-1)
pattern NoSocketType        :: SocketType
pattern NoSocketType         = SocketType 0
pattern Stream              :: SocketType
{-# LINE 346 "Network/Socket/Types.hsc" #-}
pattern Stream               = SocketType (1)
{-# LINE 347 "Network/Socket/Types.hsc" #-}
{-# LINE 350 "Network/Socket/Types.hsc" #-}
pattern Datagram            :: SocketType
{-# LINE 353 "Network/Socket/Types.hsc" #-}
pattern Datagram             = SocketType (2)
{-# LINE 354 "Network/Socket/Types.hsc" #-}
{-# LINE 357 "Network/Socket/Types.hsc" #-}
pattern Raw                 :: SocketType
{-# LINE 360 "Network/Socket/Types.hsc" #-}
pattern Raw                  = SocketType (3)
{-# LINE 361 "Network/Socket/Types.hsc" #-}
{-# LINE 364 "Network/Socket/Types.hsc" #-}
pattern RDM                 :: SocketType
{-# LINE 367 "Network/Socket/Types.hsc" #-}
pattern RDM                  = SocketType (4)
{-# LINE 368 "Network/Socket/Types.hsc" #-}
{-# LINE 371 "Network/Socket/Types.hsc" #-}
pattern SeqPacket           :: SocketType
{-# LINE 374 "Network/Socket/Types.hsc" #-}
pattern SeqPacket            = SocketType (5)
{-# LINE 375 "Network/Socket/Types.hsc" #-}
{-# LINE 378 "Network/Socket/Types.hsc" #-}
newtype Family = Family { packFamily :: CInt } deriving (Eq, Ord)
isSupportedFamily :: Family -> Bool
isSupportedFamily f = case f of
    UnsupportedFamily -> False
    GeneralFamily _   -> True
unpackFamily :: CInt -> Family
unpackFamily = Family
{-# INLINE unpackFamily #-}
pattern GeneralFamily      :: CInt -> Family
pattern GeneralFamily n     = Family n
{-# LINE 417 "Network/Socket/Types.hsc" #-}
{-# COMPLETE GeneralFamily #-}
{-# LINE 419 "Network/Socket/Types.hsc" #-}
pattern UnsupportedFamily  :: Family
pattern UnsupportedFamily   = Family (-1)
pattern AF_UNSPEC          :: Family
pattern AF_UNSPEC           = Family (0)
{-# LINE 433 "Network/Socket/Types.hsc" #-}
pattern AF_UNIX            :: Family
{-# LINE 437 "Network/Socket/Types.hsc" #-}
pattern AF_UNIX             = Family (1)
{-# LINE 438 "Network/Socket/Types.hsc" #-}
{-# LINE 441 "Network/Socket/Types.hsc" #-}
pattern AF_INET            :: Family
{-# LINE 445 "Network/Socket/Types.hsc" #-}
pattern AF_INET             = Family (2)
{-# LINE 446 "Network/Socket/Types.hsc" #-}
{-# LINE 449 "Network/Socket/Types.hsc" #-}
pattern AF_INET6           :: Family
{-# LINE 453 "Network/Socket/Types.hsc" #-}
pattern AF_INET6            = Family (10)
{-# LINE 454 "Network/Socket/Types.hsc" #-}
{-# LINE 457 "Network/Socket/Types.hsc" #-}
pattern AF_IMPLINK         :: Family
{-# LINE 463 "Network/Socket/Types.hsc" #-}
pattern AF_IMPLINK          = Family (-1)
{-# LINE 465 "Network/Socket/Types.hsc" #-}
pattern AF_PUP             :: Family
{-# LINE 471 "Network/Socket/Types.hsc" #-}
pattern AF_PUP              = Family (-1)
{-# LINE 473 "Network/Socket/Types.hsc" #-}
pattern AF_CHAOS           :: Family
{-# LINE 479 "Network/Socket/Types.hsc" #-}
pattern AF_CHAOS            = Family (-1)
{-# LINE 481 "Network/Socket/Types.hsc" #-}
pattern AF_NS              :: Family
{-# LINE 487 "Network/Socket/Types.hsc" #-}
pattern AF_NS               = Family (-1)
{-# LINE 489 "Network/Socket/Types.hsc" #-}
pattern AF_NBS             :: Family
{-# LINE 495 "Network/Socket/Types.hsc" #-}
pattern AF_NBS              = Family (-1)
{-# LINE 497 "Network/Socket/Types.hsc" #-}
pattern AF_ECMA            :: Family
{-# LINE 503 "Network/Socket/Types.hsc" #-}
pattern AF_ECMA             = Family (-1)
{-# LINE 505 "Network/Socket/Types.hsc" #-}
pattern AF_DATAKIT         :: Family
{-# LINE 511 "Network/Socket/Types.hsc" #-}
pattern AF_DATAKIT          = Family (-1)
{-# LINE 513 "Network/Socket/Types.hsc" #-}
pattern AF_CCITT           :: Family
{-# LINE 519 "Network/Socket/Types.hsc" #-}
pattern AF_CCITT            = Family (-1)
{-# LINE 521 "Network/Socket/Types.hsc" #-}
pattern AF_SNA             :: Family
{-# LINE 525 "Network/Socket/Types.hsc" #-}
pattern AF_SNA              = Family (22)
{-# LINE 526 "Network/Socket/Types.hsc" #-}
{-# LINE 529 "Network/Socket/Types.hsc" #-}
pattern AF_DECnet          :: Family
{-# LINE 533 "Network/Socket/Types.hsc" #-}
pattern AF_DECnet           = Family (12)
{-# LINE 534 "Network/Socket/Types.hsc" #-}
{-# LINE 537 "Network/Socket/Types.hsc" #-}
pattern AF_DLI             :: Family
{-# LINE 543 "Network/Socket/Types.hsc" #-}
pattern AF_DLI              = Family (-1)
{-# LINE 545 "Network/Socket/Types.hsc" #-}
pattern AF_LAT             :: Family
{-# LINE 551 "Network/Socket/Types.hsc" #-}
pattern AF_LAT              = Family (-1)
{-# LINE 553 "Network/Socket/Types.hsc" #-}
pattern AF_HYLINK          :: Family
{-# LINE 559 "Network/Socket/Types.hsc" #-}
pattern AF_HYLINK           = Family (-1)
{-# LINE 561 "Network/Socket/Types.hsc" #-}
pattern AF_APPLETALK       :: Family
{-# LINE 565 "Network/Socket/Types.hsc" #-}
pattern AF_APPLETALK        = Family (5)
{-# LINE 566 "Network/Socket/Types.hsc" #-}
{-# LINE 569 "Network/Socket/Types.hsc" #-}
pattern AF_ROUTE           :: Family
{-# LINE 573 "Network/Socket/Types.hsc" #-}
pattern AF_ROUTE            = Family (16)
{-# LINE 574 "Network/Socket/Types.hsc" #-}
{-# LINE 577 "Network/Socket/Types.hsc" #-}
pattern AF_NETBIOS         :: Family
{-# LINE 583 "Network/Socket/Types.hsc" #-}
pattern AF_NETBIOS          = Family (-1)
{-# LINE 585 "Network/Socket/Types.hsc" #-}
pattern AF_NIT             :: Family
{-# LINE 591 "Network/Socket/Types.hsc" #-}
pattern AF_NIT              = Family (-1)
{-# LINE 593 "Network/Socket/Types.hsc" #-}
pattern AF_802             :: Family
{-# LINE 599 "Network/Socket/Types.hsc" #-}
pattern AF_802              = Family (-1)
{-# LINE 601 "Network/Socket/Types.hsc" #-}
pattern AF_ISO             :: Family
{-# LINE 607 "Network/Socket/Types.hsc" #-}
pattern AF_ISO              = Family (-1)
{-# LINE 609 "Network/Socket/Types.hsc" #-}
pattern AF_OSI             :: Family
{-# LINE 615 "Network/Socket/Types.hsc" #-}
pattern AF_OSI              = Family (-1)
{-# LINE 617 "Network/Socket/Types.hsc" #-}
pattern AF_NETMAN          :: Family
{-# LINE 623 "Network/Socket/Types.hsc" #-}
pattern AF_NETMAN           = Family (-1)
{-# LINE 625 "Network/Socket/Types.hsc" #-}
pattern AF_X25             :: Family
{-# LINE 629 "Network/Socket/Types.hsc" #-}
pattern AF_X25              = Family (9)
{-# LINE 630 "Network/Socket/Types.hsc" #-}
{-# LINE 633 "Network/Socket/Types.hsc" #-}
pattern AF_AX25            :: Family
{-# LINE 637 "Network/Socket/Types.hsc" #-}
pattern AF_AX25             = Family (3)
{-# LINE 638 "Network/Socket/Types.hsc" #-}
{-# LINE 641 "Network/Socket/Types.hsc" #-}
pattern AF_OSINET          :: Family
{-# LINE 647 "Network/Socket/Types.hsc" #-}
pattern AF_OSINET           = Family (-1)
{-# LINE 649 "Network/Socket/Types.hsc" #-}
pattern AF_GOSSIP          :: Family
{-# LINE 655 "Network/Socket/Types.hsc" #-}
pattern AF_GOSSIP           = Family (-1)
{-# LINE 657 "Network/Socket/Types.hsc" #-}
pattern AF_IPX             :: Family
{-# LINE 661 "Network/Socket/Types.hsc" #-}
pattern AF_IPX              = Family (4)
{-# LINE 662 "Network/Socket/Types.hsc" #-}
{-# LINE 665 "Network/Socket/Types.hsc" #-}
pattern Pseudo_AF_XTP      :: Family
{-# LINE 671 "Network/Socket/Types.hsc" #-}
pattern Pseudo_AF_XTP       = Family (-1)
{-# LINE 673 "Network/Socket/Types.hsc" #-}
pattern AF_CTF             :: Family
{-# LINE 679 "Network/Socket/Types.hsc" #-}
pattern AF_CTF              = Family (-1)
{-# LINE 681 "Network/Socket/Types.hsc" #-}
pattern AF_WAN             :: Family
{-# LINE 687 "Network/Socket/Types.hsc" #-}
pattern AF_WAN              = Family (-1)
{-# LINE 689 "Network/Socket/Types.hsc" #-}
pattern AF_SDL             :: Family
{-# LINE 695 "Network/Socket/Types.hsc" #-}
pattern AF_SDL              = Family (-1)
{-# LINE 697 "Network/Socket/Types.hsc" #-}
pattern AF_NETWARE         :: Family
{-# LINE 703 "Network/Socket/Types.hsc" #-}
pattern AF_NETWARE          = Family (-1)
{-# LINE 705 "Network/Socket/Types.hsc" #-}
pattern AF_NDD             :: Family
{-# LINE 711 "Network/Socket/Types.hsc" #-}
pattern AF_NDD              = Family (-1)
{-# LINE 713 "Network/Socket/Types.hsc" #-}
pattern AF_INTF            :: Family
{-# LINE 719 "Network/Socket/Types.hsc" #-}
pattern AF_INTF             = Family (-1)
{-# LINE 721 "Network/Socket/Types.hsc" #-}
pattern AF_COIP            :: Family
{-# LINE 727 "Network/Socket/Types.hsc" #-}
pattern AF_COIP             = Family (-1)
{-# LINE 729 "Network/Socket/Types.hsc" #-}
pattern AF_CNT             :: Family
{-# LINE 735 "Network/Socket/Types.hsc" #-}
pattern AF_CNT              = Family (-1)
{-# LINE 737 "Network/Socket/Types.hsc" #-}
pattern Pseudo_AF_RTIP     :: Family
{-# LINE 743 "Network/Socket/Types.hsc" #-}
pattern Pseudo_AF_RTIP      = Family (-1)
{-# LINE 745 "Network/Socket/Types.hsc" #-}
pattern Pseudo_AF_PIP      :: Family
{-# LINE 751 "Network/Socket/Types.hsc" #-}
pattern Pseudo_AF_PIP       = Family (-1)
{-# LINE 753 "Network/Socket/Types.hsc" #-}
pattern AF_SIP             :: Family
{-# LINE 759 "Network/Socket/Types.hsc" #-}
pattern AF_SIP              = Family (-1)
{-# LINE 761 "Network/Socket/Types.hsc" #-}
pattern AF_ISDN            :: Family
{-# LINE 765 "Network/Socket/Types.hsc" #-}
pattern AF_ISDN             = Family (34)
{-# LINE 766 "Network/Socket/Types.hsc" #-}
{-# LINE 769 "Network/Socket/Types.hsc" #-}
pattern Pseudo_AF_KEY      :: Family
{-# LINE 775 "Network/Socket/Types.hsc" #-}
pattern Pseudo_AF_KEY       = Family (-1)
{-# LINE 777 "Network/Socket/Types.hsc" #-}
pattern AF_NATM            :: Family
{-# LINE 783 "Network/Socket/Types.hsc" #-}
pattern AF_NATM             = Family (-1)
{-# LINE 785 "Network/Socket/Types.hsc" #-}
pattern AF_ARP             :: Family
{-# LINE 791 "Network/Socket/Types.hsc" #-}
pattern AF_ARP              = Family (-1)
{-# LINE 793 "Network/Socket/Types.hsc" #-}
pattern Pseudo_AF_HDRCMPLT :: Family
{-# LINE 799 "Network/Socket/Types.hsc" #-}
pattern Pseudo_AF_HDRCMPLT  = Family (-1)
{-# LINE 801 "Network/Socket/Types.hsc" #-}
pattern AF_ENCAP           :: Family
{-# LINE 807 "Network/Socket/Types.hsc" #-}
pattern AF_ENCAP            = Family (-1)
{-# LINE 809 "Network/Socket/Types.hsc" #-}
pattern AF_LINK            :: Family
{-# LINE 815 "Network/Socket/Types.hsc" #-}
pattern AF_LINK             = Family (-1)
{-# LINE 817 "Network/Socket/Types.hsc" #-}
pattern AF_RAW             :: Family
{-# LINE 823 "Network/Socket/Types.hsc" #-}
pattern AF_RAW              = Family (-1)
{-# LINE 825 "Network/Socket/Types.hsc" #-}
pattern AF_RIF             :: Family
{-# LINE 831 "Network/Socket/Types.hsc" #-}
pattern AF_RIF              = Family (-1)
{-# LINE 833 "Network/Socket/Types.hsc" #-}
pattern AF_NETROM          :: Family
{-# LINE 837 "Network/Socket/Types.hsc" #-}
pattern AF_NETROM           = Family (6)
{-# LINE 838 "Network/Socket/Types.hsc" #-}
{-# LINE 841 "Network/Socket/Types.hsc" #-}
pattern AF_BRIDGE          :: Family
{-# LINE 845 "Network/Socket/Types.hsc" #-}
pattern AF_BRIDGE           = Family (7)
{-# LINE 846 "Network/Socket/Types.hsc" #-}
{-# LINE 849 "Network/Socket/Types.hsc" #-}
pattern AF_ATMPVC          :: Family
{-# LINE 853 "Network/Socket/Types.hsc" #-}
pattern AF_ATMPVC           = Family (8)
{-# LINE 854 "Network/Socket/Types.hsc" #-}
{-# LINE 857 "Network/Socket/Types.hsc" #-}
pattern AF_ROSE            :: Family
{-# LINE 861 "Network/Socket/Types.hsc" #-}
pattern AF_ROSE             = Family (11)
{-# LINE 862 "Network/Socket/Types.hsc" #-}
{-# LINE 865 "Network/Socket/Types.hsc" #-}
pattern AF_NETBEUI         :: Family
{-# LINE 869 "Network/Socket/Types.hsc" #-}
pattern AF_NETBEUI          = Family (13)
{-# LINE 870 "Network/Socket/Types.hsc" #-}
{-# LINE 873 "Network/Socket/Types.hsc" #-}
pattern AF_SECURITY        :: Family
{-# LINE 877 "Network/Socket/Types.hsc" #-}
pattern AF_SECURITY         = Family (14)
{-# LINE 878 "Network/Socket/Types.hsc" #-}
{-# LINE 881 "Network/Socket/Types.hsc" #-}
pattern AF_PACKET          :: Family
{-# LINE 885 "Network/Socket/Types.hsc" #-}
pattern AF_PACKET           = Family (17)
{-# LINE 886 "Network/Socket/Types.hsc" #-}
{-# LINE 889 "Network/Socket/Types.hsc" #-}
pattern AF_ASH             :: Family
{-# LINE 893 "Network/Socket/Types.hsc" #-}
pattern AF_ASH              = Family (18)
{-# LINE 894 "Network/Socket/Types.hsc" #-}
{-# LINE 897 "Network/Socket/Types.hsc" #-}
pattern AF_ECONET          :: Family
{-# LINE 901 "Network/Socket/Types.hsc" #-}
pattern AF_ECONET           = Family (19)
{-# LINE 902 "Network/Socket/Types.hsc" #-}
{-# LINE 905 "Network/Socket/Types.hsc" #-}
pattern AF_ATMSVC          :: Family
{-# LINE 909 "Network/Socket/Types.hsc" #-}
pattern AF_ATMSVC           = Family (20)
{-# LINE 910 "Network/Socket/Types.hsc" #-}
{-# LINE 913 "Network/Socket/Types.hsc" #-}
pattern AF_IRDA            :: Family
{-# LINE 917 "Network/Socket/Types.hsc" #-}
pattern AF_IRDA             = Family (23)
{-# LINE 918 "Network/Socket/Types.hsc" #-}
{-# LINE 921 "Network/Socket/Types.hsc" #-}
pattern AF_PPPOX           :: Family
{-# LINE 925 "Network/Socket/Types.hsc" #-}
pattern AF_PPPOX            = Family (24)
{-# LINE 926 "Network/Socket/Types.hsc" #-}
{-# LINE 929 "Network/Socket/Types.hsc" #-}
pattern AF_WANPIPE         :: Family
{-# LINE 933 "Network/Socket/Types.hsc" #-}
pattern AF_WANPIPE          = Family (25)
{-# LINE 934 "Network/Socket/Types.hsc" #-}
{-# LINE 937 "Network/Socket/Types.hsc" #-}
pattern AF_BLUETOOTH       :: Family
{-# LINE 941 "Network/Socket/Types.hsc" #-}
pattern AF_BLUETOOTH        = Family (31)
{-# LINE 942 "Network/Socket/Types.hsc" #-}
{-# LINE 945 "Network/Socket/Types.hsc" #-}
pattern AF_CAN             :: Family
{-# LINE 949 "Network/Socket/Types.hsc" #-}
pattern AF_CAN              = Family (29)
{-# LINE 950 "Network/Socket/Types.hsc" #-}
{-# LINE 953 "Network/Socket/Types.hsc" #-}
newtype PortNumber = PortNum Word16 deriving (Eq, Ord, Num, Enum, Bounded, Real, Integral)
foreign import CALLCONV unsafe "ntohs" ntohs :: Word16 -> Word16
foreign import CALLCONV unsafe "htons" htons :: Word16 -> Word16
foreign import CALLCONV unsafe "htonl" htonl :: Word32 -> Word32
foreign import CALLCONV unsafe "ntohl" ntohl :: Word32 -> Word32
{-# DEPRECATED htonl "Use getAddrInfo instead" #-}
{-# DEPRECATED ntohl "Use getAddrInfo instead" #-}
instance Storable PortNumber where
   sizeOf    _ = sizeOf    (0 :: Word16)
   alignment _ = alignment (0 :: Word16)
   poke p (PortNum po) = poke (castPtr p) (htons po)
   peek p = PortNum . ntohs <$> peek (castPtr p)
defaultPort :: PortNumber
defaultPort = 0
class SocketAddress sa where
    sizeOfSocketAddress :: sa -> Int
    peekSocketAddress :: Ptr sa -> IO sa
    pokeSocketAddress  :: Ptr a -> sa -> IO ()
sockaddrStorageLen :: Int
sockaddrStorageLen = 128
withSocketAddress :: SocketAddress sa => sa -> (Ptr sa -> Int -> IO a) -> IO a
withSocketAddress addr f = do
    let sz = sizeOfSocketAddress addr
    if sz == 0 then
        f nullPtr 0
      else
        allocaBytes sz $ \p -> pokeSocketAddress p addr >> f (castPtr p) sz
withNewSocketAddress :: SocketAddress sa => (Ptr sa -> Int -> IO a) -> IO a
withNewSocketAddress f = allocaBytes sockaddrStorageLen $ \ptr -> do
    zeroMemory ptr $ fromIntegral sockaddrStorageLen
    f ptr sockaddrStorageLen
type FlowInfo = Word32
type ScopeID = Word32
data SockAddr
  = SockAddrInet
        !PortNumber      
        !HostAddress     
  | SockAddrInet6
        !PortNumber      
        !FlowInfo        
        !HostAddress6    
        !ScopeID         
  
  | SockAddrUnix
        String           
  deriving (Eq, Ord)
instance NFData SockAddr where
  rnf (SockAddrInet _ _) = ()
  rnf (SockAddrInet6 _ _ _ _) = ()
  rnf (SockAddrUnix str) = rnf str
isSupportedSockAddr :: SockAddr -> Bool
isSupportedSockAddr addr = case addr of
  SockAddrInet{}  -> True
  SockAddrInet6{} -> True
  SockAddrUnix{}  -> True
instance SocketAddress SockAddr where
    sizeOfSocketAddress = sizeOfSockAddr
    peekSocketAddress   = peekSockAddr
    pokeSocketAddress   = pokeSockAddr
{-# LINE 1088 "Network/Socket/Types.hsc" #-}
type CSaFamily = (Word16)
{-# LINE 1089 "Network/Socket/Types.hsc" #-}
{-# LINE 1090 "Network/Socket/Types.hsc" #-}
sizeOfSockAddr :: SockAddr -> Int
{-# LINE 1096 "Network/Socket/Types.hsc" #-}
sizeOfSockAddr (SockAddrUnix path) =
    case path of
        '\0':_ -> (2) + length path
{-# LINE 1110 "Network/Socket/Types.hsc" #-}
        _      -> 110
{-# LINE 1111 "Network/Socket/Types.hsc" #-}
{-# LINE 1114 "Network/Socket/Types.hsc" #-}
sizeOfSockAddr SockAddrInet{}  = 16
{-# LINE 1115 "Network/Socket/Types.hsc" #-}
sizeOfSockAddr SockAddrInet6{} = 28
{-# LINE 1116 "Network/Socket/Types.hsc" #-}
withSockAddr :: SockAddr -> (Ptr SockAddr -> Int -> IO a) -> IO a
withSockAddr addr f = do
    let sz = sizeOfSockAddr addr
    allocaBytes sz $ \p -> pokeSockAddr p addr >> f (castPtr p) sz
unixPathMax :: Int
unixPathMax = 108
{-# LINE 1130 "Network/Socket/Types.hsc" #-}
pokeSockAddr :: Ptr a -> SockAddr -> IO ()
pokeSockAddr p sa@(SockAddrUnix path) = do
    when (length path > unixPathMax) $ error
      $ "pokeSockAddr: path is too long in SockAddrUnix " <> show path
      <> ", length " <> show (length path) <> ", unixPathMax " <> show unixPathMax
    zeroMemory p $ fromIntegral $ sizeOfSockAddr sa
{-# LINE 1148 "Network/Socket/Types.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p ((1) :: CSaFamily)
{-# LINE 1149 "Network/Socket/Types.hsc" #-}
    let pathC = map castCharToCChar path
    
    pokeArray (((\hsc_ptr -> hsc_ptr `plusPtr` 2)) p) pathC
{-# LINE 1152 "Network/Socket/Types.hsc" #-}
pokeSockAddr p (SockAddrInet port addr) = do
    zeroMemory p (16)
{-# LINE 1154 "Network/Socket/Types.hsc" #-}
{-# LINE 1157 "Network/Socket/Types.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p ((2) :: CSaFamily)
{-# LINE 1158 "Network/Socket/Types.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 2)) p port
{-# LINE 1159 "Network/Socket/Types.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p addr
{-# LINE 1160 "Network/Socket/Types.hsc" #-}
pokeSockAddr p (SockAddrInet6 port flow addr scope) = do
    zeroMemory p (28)
{-# LINE 1162 "Network/Socket/Types.hsc" #-}
{-# LINE 1165 "Network/Socket/Types.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p ((10) :: CSaFamily)
{-# LINE 1166 "Network/Socket/Types.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 2)) p port
{-# LINE 1167 "Network/Socket/Types.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p flow
{-# LINE 1168 "Network/Socket/Types.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) p (In6Addr addr)
{-# LINE 1169 "Network/Socket/Types.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 24)) p scope
{-# LINE 1170 "Network/Socket/Types.hsc" #-}
peekSockAddr :: Ptr SockAddr -> IO SockAddr
peekSockAddr p = do
  family <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) p
{-# LINE 1175 "Network/Socket/Types.hsc" #-}
  case family :: CSaFamily of
    (1) -> do
{-# LINE 1177 "Network/Socket/Types.hsc" #-}
        str <- peekCAString (((\hsc_ptr -> hsc_ptr `plusPtr` 2)) p)
{-# LINE 1178 "Network/Socket/Types.hsc" #-}
        return (SockAddrUnix str)
    (2) -> do
{-# LINE 1180 "Network/Socket/Types.hsc" #-}
        addr <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 1181 "Network/Socket/Types.hsc" #-}
        port <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 1182 "Network/Socket/Types.hsc" #-}
        return (SockAddrInet port addr)
    (10) -> do
{-# LINE 1184 "Network/Socket/Types.hsc" #-}
        port <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 1185 "Network/Socket/Types.hsc" #-}
        flow <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 1186 "Network/Socket/Types.hsc" #-}
        In6Addr addr <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p
{-# LINE 1187 "Network/Socket/Types.hsc" #-}
        scope <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) p
{-# LINE 1188 "Network/Socket/Types.hsc" #-}
        return (SockAddrInet6 port flow addr scope)
    _ -> ioError $ userError $
      "Network.Socket.Types.peekSockAddr: address family '" ++
      show family ++ "' not supported."
type HostAddress = Word32
hostAddressToTuple :: HostAddress -> (Word8, Word8, Word8, Word8)
hostAddressToTuple ha' =
    let ha = htonl ha'
        byte i = fromIntegral (ha `shiftR` i) :: Word8
    in (byte 24, byte 16, byte 8, byte 0)
tupleToHostAddress :: (Word8, Word8, Word8, Word8) -> HostAddress
tupleToHostAddress (b3, b2, b1, b0) =
    let x `sl` i = fromIntegral x `shiftL` i :: Word32
    in ntohl $ (b3 `sl` 24) .|. (b2 `sl` 16) .|. (b1 `sl` 8) .|. (b0 `sl` 0)
type HostAddress6 = (Word32, Word32, Word32, Word32)
hostAddress6ToTuple :: HostAddress6 -> (Word16, Word16, Word16, Word16,
                                        Word16, Word16, Word16, Word16)
hostAddress6ToTuple (w3, w2, w1, w0) =
    let high, low :: Word32 -> Word16
        high w = fromIntegral (w `shiftR` 16)
        low w = fromIntegral w
    in (high w3, low w3, high w2, low w2, high w1, low w1, high w0, low w0)
tupleToHostAddress6 :: (Word16, Word16, Word16, Word16,
                        Word16, Word16, Word16, Word16) -> HostAddress6
tupleToHostAddress6 (w7, w6, w5, w4, w3, w2, w1, w0) =
    let add :: Word16 -> Word16 -> Word32
        high `add` low = (fromIntegral high `shiftL` 16) .|. (fromIntegral low)
    in (w7 `add` w6, w5 `add` w4, w3 `add` w2, w1 `add` w0)
s6_addr_offset :: Int
s6_addr_offset = ((0))
{-# LINE 1252 "Network/Socket/Types.hsc" #-}
peek32 :: Ptr a -> Int -> IO Word32
peek32 p i0 = do
    let i' = i0 * 4
        peekByte n = peekByteOff p (s6_addr_offset + i' + n) :: IO Word8
        a `sl` i = fromIntegral a `shiftL` i
    a0 <- peekByte 0
    a1 <- peekByte 1
    a2 <- peekByte 2
    a3 <- peekByte 3
    return ((a0 `sl` 24) .|. (a1 `sl` 16) .|. (a2 `sl` 8) .|. (a3 `sl` 0))
poke32 :: Ptr a -> Int -> Word32 -> IO ()
poke32 p i0 a = do
    let i' = i0 * 4
        pokeByte n = pokeByteOff p (s6_addr_offset + i' + n)
        x `sr` i = fromIntegral (x `shiftR` i) :: Word8
    pokeByte 0 (a `sr` 24)
    pokeByte 1 (a `sr` 16)
    pokeByte 2 (a `sr`  8)
    pokeByte 3 (a `sr`  0)
newtype In6Addr = In6Addr HostAddress6
{-# LINE 1280 "Network/Socket/Types.hsc" #-}
instance Storable In6Addr where
    sizeOf    _ = 16
{-# LINE 1283 "Network/Socket/Types.hsc" #-}
    alignment _ = 4
{-# LINE 1284 "Network/Socket/Types.hsc" #-}
    peek p = do
        a <- peek32 p 0
        b <- peek32 p 1
        c <- peek32 p 2
        d <- peek32 p 3
        return $ In6Addr (a, b, c, d)
    poke p (In6Addr (a, b, c, d)) = do
        poke32 p 0 a
        poke32 p 1 b
        poke32 p 2 c
        poke32 p 3 d
socktypeBijection :: Bijection SocketType String
socktypeBijection =
    [ (UnsupportedSocketType, "UnsupportedSocketType")
    , (Stream, "Stream")
    , (Datagram, "Datagram")
    , (Raw, "Raw")
    , (RDM, "RDM")
    , (SeqPacket, "SeqPacket")
    , (NoSocketType, "NoSocketType")
    ]
instance Show SocketType where
    showsPrec = bijectiveShow socktypeBijection def
      where
        gst = "GeneralSocketType"
        def = defShow gst packSocketType _showInt
instance Read SocketType where
    readPrec = bijectiveRead socktypeBijection def
      where
        gst = "GeneralSocketType"
        def = defRead gst unpackSocketType _readInt
familyBijection :: Bijection Family String
familyBijection =
    [ (UnsupportedFamily, "UnsupportedFamily")
    , (AF_UNSPEC, "AF_UNSPEC")
    , (AF_UNIX, "AF_UNIX")
    , (AF_INET, "AF_INET")
    , (AF_INET6, "AF_INET6")
    , (AF_IMPLINK, "AF_IMPLINK")
    , (AF_PUP, "AF_PUP")
    , (AF_CHAOS, "AF_CHAOS")
    , (AF_NS, "AF_NS")
    , (AF_NBS, "AF_NBS")
    , (AF_ECMA, "AF_ECMA")
    , (AF_DATAKIT, "AF_DATAKIT")
    , (AF_CCITT, "AF_CCITT")
    , (AF_SNA, "AF_SNA")
    , (AF_DECnet, "AF_DECnet")
    , (AF_DLI, "AF_DLI")
    , (AF_LAT, "AF_LAT")
    , (AF_HYLINK, "AF_HYLINK")
    , (AF_APPLETALK, "AF_APPLETALK")
    , (AF_ROUTE, "AF_ROUTE")
    , (AF_NETBIOS, "AF_NETBIOS")
    , (AF_NIT, "AF_NIT")
    , (AF_802, "AF_802")
    , (AF_ISO, "AF_ISO")
    , (AF_OSI, "AF_OSI")
    , (AF_NETMAN, "AF_NETMAN")
    , (AF_X25, "AF_X25")
    , (AF_AX25, "AF_AX25")
    , (AF_OSINET, "AF_OSINET")
    , (AF_GOSSIP, "AF_GOSSIP")
    , (AF_IPX, "AF_IPX")
    , (Pseudo_AF_XTP, "Pseudo_AF_XTP")
    , (AF_CTF, "AF_CTF")
    , (AF_WAN, "AF_WAN")
    , (AF_SDL, "AF_SDL")
    , (AF_NETWARE, "AF_NETWARE")
    , (AF_NDD, "AF_NDD")
    , (AF_INTF, "AF_INTF")
    , (AF_COIP, "AF_COIP")
    , (AF_CNT, "AF_CNT")
    , (Pseudo_AF_RTIP, "Pseudo_AF_RTIP")
    , (Pseudo_AF_PIP, "Pseudo_AF_PIP")
    , (AF_SIP, "AF_SIP")
    , (AF_ISDN, "AF_ISDN")
    , (Pseudo_AF_KEY, "Pseudo_AF_KEY")
    , (AF_NATM, "AF_NATM")
    , (AF_ARP, "AF_ARP")
    , (Pseudo_AF_HDRCMPLT, "Pseudo_AF_HDRCMPLT")
    , (AF_ENCAP, "AF_ENCAP")
    , (AF_LINK, "AF_LINK")
    , (AF_RAW, "AF_RAW")
    , (AF_RIF, "AF_RIF")
    , (AF_NETROM, "AF_NETROM")
    , (AF_BRIDGE, "AF_BRIDGE")
    , (AF_ATMPVC, "AF_ATMPVC")
    , (AF_ROSE, "AF_ROSE")
    , (AF_NETBEUI, "AF_NETBEUI")
    , (AF_SECURITY, "AF_SECURITY")
    , (AF_PACKET, "AF_PACKET")
    , (AF_ASH, "AF_ASH")
    , (AF_ECONET, "AF_ECONET")
    , (AF_ATMSVC, "AF_ATMSVC")
    , (AF_IRDA, "AF_IRDA")
    , (AF_PPPOX, "AF_PPPOX")
    , (AF_WANPIPE, "AF_WANPIPE")
    , (AF_BLUETOOTH, "AF_BLUETOOTH")
    , (AF_CAN, "AF_CAN")
    ]
instance Show Family where
    showsPrec = bijectiveShow familyBijection def
      where
        gf = "GeneralFamily"
        def = defShow gf packFamily _showInt
instance Read Family where
    readPrec = bijectiveRead familyBijection def
      where
        gf = "GeneralFamily"
        def = defRead gf unpackFamily _readInt
instance Show PortNumber where
  showsPrec p (PortNum pn) = showsPrec p pn
instance Read PortNumber where
  readPrec = safeInt
foreign import ccall unsafe "string.h" memset :: Ptr a -> CInt -> CSize -> IO ()
zeroMemory :: Ptr a -> CSize -> IO ()
zeroMemory dest nbytes = memset dest 0 (fromIntegral nbytes)