{-# LINE 1 "Network/Socket/Types.hsc" #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
#include "HsNetDef.h"
module Network.Socket.Types
(
Socket(..)
, fdSocket
, sockFamily
, sockType
, sockProtocol
, sockStatus
, SocketStatus(..)
, SocketType(..)
, isSupportedSocketType
, packSocketType
, packSocketType'
, packSocketTypeOrThrow
, unpackSocketType
, unpackSocketType'
, Family(..)
, isSupportedFamily
, packFamily
, unpackFamily
, SockAddr(..)
, isSupportedSockAddr
, HostAddress
, hostAddressToTuple
, tupleToHostAddress
{-# LINE 42 "Network/Socket/Types.hsc" #-}
, HostAddress6
, hostAddress6ToTuple
, tupleToHostAddress6
, FlowInfo
, ScopeID
{-# LINE 48 "Network/Socket/Types.hsc" #-}
, peekSockAddr
, pokeSockAddr
, sizeOfSockAddr
, sizeOfSockAddrByFamily
, withSockAddr
, withNewSockAddr
, ProtocolNumber
, PortNumber(..)
, zeroMemory
) where
import Control.Concurrent.MVar
import Control.Monad
import Data.Bits
import Data.Maybe
import Data.Typeable
import Data.Word
import Data.Int
import Foreign.C
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Ptr
import Foreign.Storable
data Socket
= MkSocket
CInt
Family
SocketType
ProtocolNumber
(MVar SocketStatus)
deriving Typeable
{-# DEPRECATED MkSocket "'MkSocket' will not be available in version 3.0.0.0 or later. Use fdSocket instead" #-}
fdSocket :: Socket -> CInt
fdSocket (MkSocket fd _ _ _ _) = fd
sockFamily :: Socket -> Family
sockFamily (MkSocket _ f _ _ _) = f
sockType :: Socket -> SocketType
sockType (MkSocket _ _ t _ _) = t
sockProtocol :: Socket -> ProtocolNumber
sockProtocol (MkSocket _ _ _ p _) = p
sockStatus :: Socket -> MVar SocketStatus
sockStatus (MkSocket _ _ _ _ s) = s
instance Eq Socket where
(MkSocket _ _ _ _ m1) == (MkSocket _ _ _ _ m2) = m1 == m2
instance Show Socket where
showsPrec _n (MkSocket fd _ _ _ _) =
showString "<socket: " . shows fd . showString ">"
type ProtocolNumber = CInt
data SocketStatus
= NotConnected
| Bound
| Listening
| Connected
| ConvertedToHandle
| Closed
deriving (Eq, Show, Typeable)
{-# DEPRECATED SocketStatus "SocketStatus will be removed" #-}
data SocketType
= NoSocketType
| Stream
| Datagram
| Raw
| RDM
| SeqPacket
deriving (Eq, Ord, Read, Show, Typeable)
isSupportedSocketType :: SocketType -> Bool
isSupportedSocketType = isJust . packSocketType'
packSocketType' :: SocketType -> Maybe CInt
packSocketType' stype = case Just stype of
Just NoSocketType -> Just 0
{-# LINE 188 "Network/Socket/Types.hsc" #-}
Just Stream -> Just 1
{-# LINE 189 "Network/Socket/Types.hsc" #-}
{-# LINE 190 "Network/Socket/Types.hsc" #-}
{-# LINE 191 "Network/Socket/Types.hsc" #-}
Just Datagram -> Just 2
{-# LINE 192 "Network/Socket/Types.hsc" #-}
{-# LINE 193 "Network/Socket/Types.hsc" #-}
{-# LINE 194 "Network/Socket/Types.hsc" #-}
Just Raw -> Just 3
{-# LINE 195 "Network/Socket/Types.hsc" #-}
{-# LINE 196 "Network/Socket/Types.hsc" #-}
{-# LINE 197 "Network/Socket/Types.hsc" #-}
Just RDM -> Just 4
{-# LINE 198 "Network/Socket/Types.hsc" #-}
{-# LINE 199 "Network/Socket/Types.hsc" #-}
{-# LINE 200 "Network/Socket/Types.hsc" #-}
Just SeqPacket -> Just 5
{-# LINE 201 "Network/Socket/Types.hsc" #-}
{-# LINE 202 "Network/Socket/Types.hsc" #-}
_ -> Nothing
{-# DEPRECATED packSocketType "packSocketType will not be available in version 3.0.0.0 or later." #-}
packSocketType :: SocketType -> CInt
packSocketType stype = fromMaybe (error errMsg) (packSocketType' stype)
where
errMsg = concat ["Network.Socket.packSocketType: ",
"socket type ", show stype, " unsupported on this system"]
packSocketTypeOrThrow :: String -> SocketType -> IO CInt
packSocketTypeOrThrow caller stype = maybe err return (packSocketType' stype)
where
err = ioError . userError . concat $ ["Network.Socket.", caller, ": ",
"socket type ", show stype, " unsupported on this system"]
unpackSocketType:: CInt -> Maybe SocketType
unpackSocketType t = case t of
0 -> Just NoSocketType
{-# LINE 225 "Network/Socket/Types.hsc" #-}
(1) -> Just Stream
{-# LINE 226 "Network/Socket/Types.hsc" #-}
{-# LINE 227 "Network/Socket/Types.hsc" #-}
{-# LINE 228 "Network/Socket/Types.hsc" #-}
(2) -> Just Datagram
{-# LINE 229 "Network/Socket/Types.hsc" #-}
{-# LINE 230 "Network/Socket/Types.hsc" #-}
{-# LINE 231 "Network/Socket/Types.hsc" #-}
(3) -> Just Raw
{-# LINE 232 "Network/Socket/Types.hsc" #-}
{-# LINE 233 "Network/Socket/Types.hsc" #-}
{-# LINE 234 "Network/Socket/Types.hsc" #-}
(4) -> Just RDM
{-# LINE 235 "Network/Socket/Types.hsc" #-}
{-# LINE 236 "Network/Socket/Types.hsc" #-}
{-# LINE 237 "Network/Socket/Types.hsc" #-}
(5) -> Just SeqPacket
{-# LINE 238 "Network/Socket/Types.hsc" #-}
{-# LINE 239 "Network/Socket/Types.hsc" #-}
_ -> Nothing
unpackSocketType' :: String -> CInt -> IO SocketType
unpackSocketType' caller ty = maybe err return (unpackSocketType ty)
where
err = ioError . userError . concat $ ["Network.Socket.", caller, ": ",
"socket type ", show ty, " unsupported on this system"]
data Family
= 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
deriving (Eq, Ord, Read, Show)
packFamily :: Family -> CInt
packFamily f = case packFamily' f of
Just fam -> fam
Nothing -> error $
"Network.Socket.packFamily: unsupported address family: " ++
show f
isSupportedFamily :: Family -> Bool
isSupportedFamily = isJust . packFamily'
packFamily' :: Family -> Maybe CInt
packFamily' f = case Just f of
Just AF_UNSPEC -> Just 0
{-# LINE 342 "Network/Socket/Types.hsc" #-}
{-# LINE 343 "Network/Socket/Types.hsc" #-}
Just AF_UNIX -> Just 1
{-# LINE 344 "Network/Socket/Types.hsc" #-}
{-# LINE 345 "Network/Socket/Types.hsc" #-}
{-# LINE 346 "Network/Socket/Types.hsc" #-}
Just AF_INET -> Just 2
{-# LINE 347 "Network/Socket/Types.hsc" #-}
{-# LINE 348 "Network/Socket/Types.hsc" #-}
{-# LINE 349 "Network/Socket/Types.hsc" #-}
Just AF_INET6 -> Just 10
{-# LINE 350 "Network/Socket/Types.hsc" #-}
{-# LINE 351 "Network/Socket/Types.hsc" #-}
{-# LINE 354 "Network/Socket/Types.hsc" #-}
{-# LINE 357 "Network/Socket/Types.hsc" #-}
{-# LINE 360 "Network/Socket/Types.hsc" #-}
{-# LINE 363 "Network/Socket/Types.hsc" #-}
{-# LINE 366 "Network/Socket/Types.hsc" #-}
{-# LINE 369 "Network/Socket/Types.hsc" #-}
{-# LINE 372 "Network/Socket/Types.hsc" #-}
{-# LINE 375 "Network/Socket/Types.hsc" #-}
{-# LINE 376 "Network/Socket/Types.hsc" #-}
Just AF_SNA -> Just 22
{-# LINE 377 "Network/Socket/Types.hsc" #-}
{-# LINE 378 "Network/Socket/Types.hsc" #-}
{-# LINE 379 "Network/Socket/Types.hsc" #-}
Just AF_DECnet -> Just 12
{-# LINE 380 "Network/Socket/Types.hsc" #-}
{-# LINE 381 "Network/Socket/Types.hsc" #-}
{-# LINE 384 "Network/Socket/Types.hsc" #-}
{-# LINE 387 "Network/Socket/Types.hsc" #-}
{-# LINE 390 "Network/Socket/Types.hsc" #-}
{-# LINE 391 "Network/Socket/Types.hsc" #-}
Just AF_APPLETALK -> Just 5
{-# LINE 392 "Network/Socket/Types.hsc" #-}
{-# LINE 393 "Network/Socket/Types.hsc" #-}
{-# LINE 394 "Network/Socket/Types.hsc" #-}
Just AF_ROUTE -> Just 16
{-# LINE 395 "Network/Socket/Types.hsc" #-}
{-# LINE 396 "Network/Socket/Types.hsc" #-}
{-# LINE 399 "Network/Socket/Types.hsc" #-}
{-# LINE 402 "Network/Socket/Types.hsc" #-}
{-# LINE 405 "Network/Socket/Types.hsc" #-}
{-# LINE 408 "Network/Socket/Types.hsc" #-}
{-# LINE 411 "Network/Socket/Types.hsc" #-}
{-# LINE 414 "Network/Socket/Types.hsc" #-}
{-# LINE 415 "Network/Socket/Types.hsc" #-}
Just AF_X25 -> Just 9
{-# LINE 416 "Network/Socket/Types.hsc" #-}
{-# LINE 417 "Network/Socket/Types.hsc" #-}
{-# LINE 418 "Network/Socket/Types.hsc" #-}
Just AF_AX25 -> Just 3
{-# LINE 419 "Network/Socket/Types.hsc" #-}
{-# LINE 420 "Network/Socket/Types.hsc" #-}
{-# LINE 423 "Network/Socket/Types.hsc" #-}
{-# LINE 426 "Network/Socket/Types.hsc" #-}
{-# LINE 427 "Network/Socket/Types.hsc" #-}
Just AF_IPX -> Just 4
{-# LINE 428 "Network/Socket/Types.hsc" #-}
{-# LINE 429 "Network/Socket/Types.hsc" #-}
{-# LINE 432 "Network/Socket/Types.hsc" #-}
{-# LINE 435 "Network/Socket/Types.hsc" #-}
{-# LINE 438 "Network/Socket/Types.hsc" #-}
{-# LINE 441 "Network/Socket/Types.hsc" #-}
{-# LINE 444 "Network/Socket/Types.hsc" #-}
{-# LINE 447 "Network/Socket/Types.hsc" #-}
{-# LINE 450 "Network/Socket/Types.hsc" #-}
{-# LINE 453 "Network/Socket/Types.hsc" #-}
{-# LINE 456 "Network/Socket/Types.hsc" #-}
{-# LINE 459 "Network/Socket/Types.hsc" #-}
{-# LINE 462 "Network/Socket/Types.hsc" #-}
{-# LINE 465 "Network/Socket/Types.hsc" #-}
{-# LINE 466 "Network/Socket/Types.hsc" #-}
Just AF_ISDN -> Just 34
{-# LINE 467 "Network/Socket/Types.hsc" #-}
{-# LINE 468 "Network/Socket/Types.hsc" #-}
{-# LINE 471 "Network/Socket/Types.hsc" #-}
{-# LINE 474 "Network/Socket/Types.hsc" #-}
{-# LINE 477 "Network/Socket/Types.hsc" #-}
{-# LINE 480 "Network/Socket/Types.hsc" #-}
{-# LINE 483 "Network/Socket/Types.hsc" #-}
{-# LINE 486 "Network/Socket/Types.hsc" #-}
{-# LINE 489 "Network/Socket/Types.hsc" #-}
{-# LINE 492 "Network/Socket/Types.hsc" #-}
{-# LINE 493 "Network/Socket/Types.hsc" #-}
Just AF_NETROM -> Just 6
{-# LINE 494 "Network/Socket/Types.hsc" #-}
{-# LINE 495 "Network/Socket/Types.hsc" #-}
{-# LINE 496 "Network/Socket/Types.hsc" #-}
Just AF_BRIDGE -> Just 7
{-# LINE 497 "Network/Socket/Types.hsc" #-}
{-# LINE 498 "Network/Socket/Types.hsc" #-}
{-# LINE 499 "Network/Socket/Types.hsc" #-}
Just AF_ATMPVC -> Just 8
{-# LINE 500 "Network/Socket/Types.hsc" #-}
{-# LINE 501 "Network/Socket/Types.hsc" #-}
{-# LINE 502 "Network/Socket/Types.hsc" #-}
Just AF_ROSE -> Just 11
{-# LINE 503 "Network/Socket/Types.hsc" #-}
{-# LINE 504 "Network/Socket/Types.hsc" #-}
{-# LINE 505 "Network/Socket/Types.hsc" #-}
Just AF_NETBEUI -> Just 13
{-# LINE 506 "Network/Socket/Types.hsc" #-}
{-# LINE 507 "Network/Socket/Types.hsc" #-}
{-# LINE 508 "Network/Socket/Types.hsc" #-}
Just AF_SECURITY -> Just 14
{-# LINE 509 "Network/Socket/Types.hsc" #-}
{-# LINE 510 "Network/Socket/Types.hsc" #-}
{-# LINE 511 "Network/Socket/Types.hsc" #-}
Just AF_PACKET -> Just 17
{-# LINE 512 "Network/Socket/Types.hsc" #-}
{-# LINE 513 "Network/Socket/Types.hsc" #-}
{-# LINE 514 "Network/Socket/Types.hsc" #-}
Just AF_ASH -> Just 18
{-# LINE 515 "Network/Socket/Types.hsc" #-}
{-# LINE 516 "Network/Socket/Types.hsc" #-}
{-# LINE 517 "Network/Socket/Types.hsc" #-}
Just AF_ECONET -> Just 19
{-# LINE 518 "Network/Socket/Types.hsc" #-}
{-# LINE 519 "Network/Socket/Types.hsc" #-}
{-# LINE 520 "Network/Socket/Types.hsc" #-}
Just AF_ATMSVC -> Just 20
{-# LINE 521 "Network/Socket/Types.hsc" #-}
{-# LINE 522 "Network/Socket/Types.hsc" #-}
{-# LINE 523 "Network/Socket/Types.hsc" #-}
Just AF_IRDA -> Just 23
{-# LINE 524 "Network/Socket/Types.hsc" #-}
{-# LINE 525 "Network/Socket/Types.hsc" #-}
{-# LINE 526 "Network/Socket/Types.hsc" #-}
Just AF_PPPOX -> Just 24
{-# LINE 527 "Network/Socket/Types.hsc" #-}
{-# LINE 528 "Network/Socket/Types.hsc" #-}
{-# LINE 529 "Network/Socket/Types.hsc" #-}
Just AF_WANPIPE -> Just 25
{-# LINE 530 "Network/Socket/Types.hsc" #-}
{-# LINE 531 "Network/Socket/Types.hsc" #-}
{-# LINE 532 "Network/Socket/Types.hsc" #-}
Just AF_BLUETOOTH -> Just 31
{-# LINE 533 "Network/Socket/Types.hsc" #-}
{-# LINE 534 "Network/Socket/Types.hsc" #-}
{-# LINE 535 "Network/Socket/Types.hsc" #-}
Just AF_CAN -> Just 29
{-# LINE 536 "Network/Socket/Types.hsc" #-}
{-# LINE 537 "Network/Socket/Types.hsc" #-}
_ -> Nothing
unpackFamily :: CInt -> Family
unpackFamily f = case f of
(0) -> AF_UNSPEC
{-# LINE 544 "Network/Socket/Types.hsc" #-}
{-# LINE 545 "Network/Socket/Types.hsc" #-}
(1) -> AF_UNIX
{-# LINE 546 "Network/Socket/Types.hsc" #-}
{-# LINE 547 "Network/Socket/Types.hsc" #-}
{-# LINE 548 "Network/Socket/Types.hsc" #-}
(2) -> AF_INET
{-# LINE 549 "Network/Socket/Types.hsc" #-}
{-# LINE 550 "Network/Socket/Types.hsc" #-}
{-# LINE 551 "Network/Socket/Types.hsc" #-}
(10) -> AF_INET6
{-# LINE 552 "Network/Socket/Types.hsc" #-}
{-# LINE 553 "Network/Socket/Types.hsc" #-}
{-# LINE 556 "Network/Socket/Types.hsc" #-}
{-# LINE 559 "Network/Socket/Types.hsc" #-}
{-# LINE 562 "Network/Socket/Types.hsc" #-}
{-# LINE 565 "Network/Socket/Types.hsc" #-}
{-# LINE 568 "Network/Socket/Types.hsc" #-}
{-# LINE 571 "Network/Socket/Types.hsc" #-}
{-# LINE 574 "Network/Socket/Types.hsc" #-}
{-# LINE 577 "Network/Socket/Types.hsc" #-}
{-# LINE 578 "Network/Socket/Types.hsc" #-}
(22) -> AF_SNA
{-# LINE 579 "Network/Socket/Types.hsc" #-}
{-# LINE 580 "Network/Socket/Types.hsc" #-}
{-# LINE 581 "Network/Socket/Types.hsc" #-}
(12) -> AF_DECnet
{-# LINE 582 "Network/Socket/Types.hsc" #-}
{-# LINE 583 "Network/Socket/Types.hsc" #-}
{-# LINE 586 "Network/Socket/Types.hsc" #-}
{-# LINE 589 "Network/Socket/Types.hsc" #-}
{-# LINE 592 "Network/Socket/Types.hsc" #-}
{-# LINE 593 "Network/Socket/Types.hsc" #-}
(5) -> AF_APPLETALK
{-# LINE 594 "Network/Socket/Types.hsc" #-}
{-# LINE 595 "Network/Socket/Types.hsc" #-}
{-# LINE 596 "Network/Socket/Types.hsc" #-}
(16) -> AF_ROUTE
{-# LINE 597 "Network/Socket/Types.hsc" #-}
{-# LINE 598 "Network/Socket/Types.hsc" #-}
{-# LINE 601 "Network/Socket/Types.hsc" #-}
{-# LINE 604 "Network/Socket/Types.hsc" #-}
{-# LINE 607 "Network/Socket/Types.hsc" #-}
{-# LINE 610 "Network/Socket/Types.hsc" #-}
{-# LINE 615 "Network/Socket/Types.hsc" #-}
{-# LINE 618 "Network/Socket/Types.hsc" #-}
{-# LINE 619 "Network/Socket/Types.hsc" #-}
(9) -> AF_X25
{-# LINE 620 "Network/Socket/Types.hsc" #-}
{-# LINE 621 "Network/Socket/Types.hsc" #-}
{-# LINE 622 "Network/Socket/Types.hsc" #-}
(3) -> AF_AX25
{-# LINE 623 "Network/Socket/Types.hsc" #-}
{-# LINE 624 "Network/Socket/Types.hsc" #-}
{-# LINE 627 "Network/Socket/Types.hsc" #-}
{-# LINE 630 "Network/Socket/Types.hsc" #-}
{-# LINE 631 "Network/Socket/Types.hsc" #-}
(4) -> AF_IPX
{-# LINE 632 "Network/Socket/Types.hsc" #-}
{-# LINE 633 "Network/Socket/Types.hsc" #-}
{-# LINE 636 "Network/Socket/Types.hsc" #-}
{-# LINE 639 "Network/Socket/Types.hsc" #-}
{-# LINE 642 "Network/Socket/Types.hsc" #-}
{-# LINE 645 "Network/Socket/Types.hsc" #-}
{-# LINE 648 "Network/Socket/Types.hsc" #-}
{-# LINE 651 "Network/Socket/Types.hsc" #-}
{-# LINE 654 "Network/Socket/Types.hsc" #-}
{-# LINE 657 "Network/Socket/Types.hsc" #-}
{-# LINE 660 "Network/Socket/Types.hsc" #-}
{-# LINE 663 "Network/Socket/Types.hsc" #-}
{-# LINE 666 "Network/Socket/Types.hsc" #-}
{-# LINE 669 "Network/Socket/Types.hsc" #-}
{-# LINE 670 "Network/Socket/Types.hsc" #-}
(34) -> AF_ISDN
{-# LINE 671 "Network/Socket/Types.hsc" #-}
{-# LINE 672 "Network/Socket/Types.hsc" #-}
{-# LINE 675 "Network/Socket/Types.hsc" #-}
{-# LINE 678 "Network/Socket/Types.hsc" #-}
{-# LINE 681 "Network/Socket/Types.hsc" #-}
{-# LINE 684 "Network/Socket/Types.hsc" #-}
{-# LINE 687 "Network/Socket/Types.hsc" #-}
{-# LINE 690 "Network/Socket/Types.hsc" #-}
{-# LINE 693 "Network/Socket/Types.hsc" #-}
{-# LINE 696 "Network/Socket/Types.hsc" #-}
{-# LINE 697 "Network/Socket/Types.hsc" #-}
(6) -> AF_NETROM
{-# LINE 698 "Network/Socket/Types.hsc" #-}
{-# LINE 699 "Network/Socket/Types.hsc" #-}
{-# LINE 700 "Network/Socket/Types.hsc" #-}
(7) -> AF_BRIDGE
{-# LINE 701 "Network/Socket/Types.hsc" #-}
{-# LINE 702 "Network/Socket/Types.hsc" #-}
{-# LINE 703 "Network/Socket/Types.hsc" #-}
(8) -> AF_ATMPVC
{-# LINE 704 "Network/Socket/Types.hsc" #-}
{-# LINE 705 "Network/Socket/Types.hsc" #-}
{-# LINE 706 "Network/Socket/Types.hsc" #-}
(11) -> AF_ROSE
{-# LINE 707 "Network/Socket/Types.hsc" #-}
{-# LINE 708 "Network/Socket/Types.hsc" #-}
{-# LINE 709 "Network/Socket/Types.hsc" #-}
(13) -> AF_NETBEUI
{-# LINE 710 "Network/Socket/Types.hsc" #-}
{-# LINE 711 "Network/Socket/Types.hsc" #-}
{-# LINE 712 "Network/Socket/Types.hsc" #-}
(14) -> AF_SECURITY
{-# LINE 713 "Network/Socket/Types.hsc" #-}
{-# LINE 714 "Network/Socket/Types.hsc" #-}
{-# LINE 715 "Network/Socket/Types.hsc" #-}
(17) -> AF_PACKET
{-# LINE 716 "Network/Socket/Types.hsc" #-}
{-# LINE 717 "Network/Socket/Types.hsc" #-}
{-# LINE 718 "Network/Socket/Types.hsc" #-}
(18) -> AF_ASH
{-# LINE 719 "Network/Socket/Types.hsc" #-}
{-# LINE 720 "Network/Socket/Types.hsc" #-}
{-# LINE 721 "Network/Socket/Types.hsc" #-}
(19) -> AF_ECONET
{-# LINE 722 "Network/Socket/Types.hsc" #-}
{-# LINE 723 "Network/Socket/Types.hsc" #-}
{-# LINE 724 "Network/Socket/Types.hsc" #-}
(20) -> AF_ATMSVC
{-# LINE 725 "Network/Socket/Types.hsc" #-}
{-# LINE 726 "Network/Socket/Types.hsc" #-}
{-# LINE 727 "Network/Socket/Types.hsc" #-}
(23) -> AF_IRDA
{-# LINE 728 "Network/Socket/Types.hsc" #-}
{-# LINE 729 "Network/Socket/Types.hsc" #-}
{-# LINE 730 "Network/Socket/Types.hsc" #-}
(24) -> AF_PPPOX
{-# LINE 731 "Network/Socket/Types.hsc" #-}
{-# LINE 732 "Network/Socket/Types.hsc" #-}
{-# LINE 733 "Network/Socket/Types.hsc" #-}
(25) -> AF_WANPIPE
{-# LINE 734 "Network/Socket/Types.hsc" #-}
{-# LINE 735 "Network/Socket/Types.hsc" #-}
{-# LINE 736 "Network/Socket/Types.hsc" #-}
(31) -> AF_BLUETOOTH
{-# LINE 737 "Network/Socket/Types.hsc" #-}
{-# LINE 738 "Network/Socket/Types.hsc" #-}
{-# LINE 739 "Network/Socket/Types.hsc" #-}
(29) -> AF_CAN
{-# LINE 740 "Network/Socket/Types.hsc" #-}
{-# LINE 741 "Network/Socket/Types.hsc" #-}
unknown -> error $
"Network.Socket.Types.unpackFamily: unknown address family: " ++
show unknown
newtype PortNumber = PortNum Word16 deriving (Eq, Ord, Typeable, Num, Enum, Real, Integral)
instance Show PortNumber where
showsPrec p (PortNum pn) = showsPrec p (fromIntegral pn :: Int)
instance Read PortNumber where
readsPrec n = map (\(x,y) -> (fromIntegral (x :: Int), y)) . readsPrec n
foreign import CALLCONV unsafe "ntohs" ntohs :: Word16 -> Word16
foreign import CALLCONV unsafe "htons" htons :: Word16 -> Word16
foreign import CALLCONV unsafe "ntohl" ntohl :: Word32 -> Word32
foreign import CALLCONV unsafe "htonl" htonl :: Word32 -> Word32
instance Storable PortNumber where
sizeOf _ = sizeOf (undefined :: Word16)
alignment _ = alignment (undefined :: Word16)
poke p (PortNum po) = poke (castPtr p) (htons po)
peek p = (PortNum . ntohs) `liftM` peek (castPtr p)
type FlowInfo = Word32
type ScopeID = Word32
data SockAddr
= SockAddrInet
PortNumber
HostAddress
| SockAddrInet6
PortNumber
FlowInfo
HostAddress6
ScopeID
| SockAddrUnix
String
| SockAddrCan
Int32
deriving (Eq, Ord, Typeable)
isSupportedSockAddr :: SockAddr -> Bool
isSupportedSockAddr addr = case addr of
SockAddrInet {} -> True
{-# LINE 831 "Network/Socket/Types.hsc" #-}
SockAddrInet6 {} -> True
{-# LINE 833 "Network/Socket/Types.hsc" #-}
{-# LINE 834 "Network/Socket/Types.hsc" #-}
SockAddrUnix{} -> True
{-# LINE 836 "Network/Socket/Types.hsc" #-}
{-# LINE 837 "Network/Socket/Types.hsc" #-}
SockAddrCan{} -> True
{-# LINE 839 "Network/Socket/Types.hsc" #-}
{-# LINE 843 "Network/Socket/Types.hsc" #-}
{-# DEPRECATED SockAddrCan "This will be removed in 3.0" #-}
{-# LINE 851 "Network/Socket/Types.hsc" #-}
type CSaFamily = (Word16)
{-# LINE 852 "Network/Socket/Types.hsc" #-}
{-# LINE 853 "Network/Socket/Types.hsc" #-}
sizeOfSockAddr :: SockAddr -> Int
{-# LINE 859 "Network/Socket/Types.hsc" #-}
sizeOfSockAddr (SockAddrUnix path) =
case path of
'\0':_ -> (2) + length path
{-# LINE 862 "Network/Socket/Types.hsc" #-}
_ -> 110
{-# LINE 863 "Network/Socket/Types.hsc" #-}
{-# LINE 864 "Network/Socket/Types.hsc" #-}
sizeOfSockAddr (SockAddrInet _ _) = 16
{-# LINE 865 "Network/Socket/Types.hsc" #-}
{-# LINE 866 "Network/Socket/Types.hsc" #-}
sizeOfSockAddr (SockAddrInet6 _ _ _ _) = 28
{-# LINE 867 "Network/Socket/Types.hsc" #-}
{-# LINE 868 "Network/Socket/Types.hsc" #-}
{-# LINE 869 "Network/Socket/Types.hsc" #-}
sizeOfSockAddr (SockAddrCan _) = 16
{-# LINE 870 "Network/Socket/Types.hsc" #-}
{-# LINE 871 "Network/Socket/Types.hsc" #-}
{-# LINE 875 "Network/Socket/Types.hsc" #-}
sizeOfSockAddrByFamily :: Family -> Int
{-# LINE 880 "Network/Socket/Types.hsc" #-}
sizeOfSockAddrByFamily AF_UNIX = 110
{-# LINE 881 "Network/Socket/Types.hsc" #-}
{-# LINE 882 "Network/Socket/Types.hsc" #-}
{-# LINE 883 "Network/Socket/Types.hsc" #-}
sizeOfSockAddrByFamily AF_INET6 = 28
{-# LINE 884 "Network/Socket/Types.hsc" #-}
{-# LINE 885 "Network/Socket/Types.hsc" #-}
sizeOfSockAddrByFamily AF_INET = 16
{-# LINE 886 "Network/Socket/Types.hsc" #-}
{-# LINE 887 "Network/Socket/Types.hsc" #-}
sizeOfSockAddrByFamily AF_CAN = 16
{-# LINE 888 "Network/Socket/Types.hsc" #-}
{-# LINE 889 "Network/Socket/Types.hsc" #-}
sizeOfSockAddrByFamily family = error $
"Network.Socket.Types.sizeOfSockAddrByFamily: address family '" ++
show family ++ "' not supported."
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
withNewSockAddr :: Family -> (Ptr SockAddr -> Int -> IO a) -> IO a
withNewSockAddr family f = do
let sz = sizeOfSockAddrByFamily family
allocaBytes sz $ \ptr -> f ptr sz
{-# LINE 912 "Network/Socket/Types.hsc" #-}
unixPathMax :: Int
unixPathMax = 108
{-# LINE 914 "Network/Socket/Types.hsc" #-}
{-# LINE 915 "Network/Socket/Types.hsc" #-}
pokeSockAddr :: Ptr a -> SockAddr -> IO ()
{-# LINE 926 "Network/Socket/Types.hsc" #-}
pokeSockAddr p sa@(SockAddrUnix path) = do
when (length path > unixPathMax) $ error "pokeSockAddr: path is too long"
zeroMemory p $ fromIntegral $ sizeOfSockAddr sa
{-# LINE 932 "Network/Socket/Types.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p ((1) :: CSaFamily)
{-# LINE 933 "Network/Socket/Types.hsc" #-}
let pathC = map castCharToCChar path
pokeArray (((\hsc_ptr -> hsc_ptr `plusPtr` 2)) p) pathC
{-# LINE 935 "Network/Socket/Types.hsc" #-}
{-# LINE 936 "Network/Socket/Types.hsc" #-}
pokeSockAddr p (SockAddrInet port addr) = do
{-# LINE 940 "Network/Socket/Types.hsc" #-}
{-# LINE 943 "Network/Socket/Types.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p ((2) :: CSaFamily)
{-# LINE 944 "Network/Socket/Types.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 2)) p port
{-# LINE 945 "Network/Socket/Types.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p addr
{-# LINE 946 "Network/Socket/Types.hsc" #-}
{-# LINE 947 "Network/Socket/Types.hsc" #-}
pokeSockAddr p (SockAddrInet6 port flow addr scope) = do
{-# LINE 951 "Network/Socket/Types.hsc" #-}
{-# LINE 954 "Network/Socket/Types.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p ((10) :: CSaFamily)
{-# LINE 955 "Network/Socket/Types.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 2)) p port
{-# LINE 956 "Network/Socket/Types.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p flow
{-# LINE 957 "Network/Socket/Types.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 8)) p (In6Addr addr)
{-# LINE 958 "Network/Socket/Types.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 24)) p scope
{-# LINE 959 "Network/Socket/Types.hsc" #-}
{-# LINE 960 "Network/Socket/Types.hsc" #-}
{-# LINE 961 "Network/Socket/Types.hsc" #-}
pokeSockAddr p (SockAddrCan ifIndex) = do
{-# LINE 965 "Network/Socket/Types.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p ifIndex
{-# LINE 966 "Network/Socket/Types.hsc" #-}
{-# LINE 967 "Network/Socket/Types.hsc" #-}
{-# LINE 971 "Network/Socket/Types.hsc" #-}
peekSockAddr :: Ptr SockAddr -> IO SockAddr
peekSockAddr p = do
family <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) p
{-# LINE 976 "Network/Socket/Types.hsc" #-}
case family :: CSaFamily of
{-# LINE 978 "Network/Socket/Types.hsc" #-}
(1) -> do
{-# LINE 979 "Network/Socket/Types.hsc" #-}
str <- peekCString (((\hsc_ptr -> hsc_ptr `plusPtr` 2)) p)
{-# LINE 980 "Network/Socket/Types.hsc" #-}
return (SockAddrUnix str)
{-# LINE 982 "Network/Socket/Types.hsc" #-}
(2) -> do
{-# LINE 983 "Network/Socket/Types.hsc" #-}
addr <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 984 "Network/Socket/Types.hsc" #-}
port <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 985 "Network/Socket/Types.hsc" #-}
return (SockAddrInet port addr)
{-# LINE 987 "Network/Socket/Types.hsc" #-}
(10) -> do
{-# LINE 988 "Network/Socket/Types.hsc" #-}
port <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 989 "Network/Socket/Types.hsc" #-}
flow <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 990 "Network/Socket/Types.hsc" #-}
In6Addr addr <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p
{-# LINE 991 "Network/Socket/Types.hsc" #-}
scope <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) p
{-# LINE 992 "Network/Socket/Types.hsc" #-}
return (SockAddrInet6 port flow addr scope)
{-# LINE 994 "Network/Socket/Types.hsc" #-}
{-# LINE 995 "Network/Socket/Types.hsc" #-}
(29) -> do
{-# LINE 996 "Network/Socket/Types.hsc" #-}
ifidx <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 997 "Network/Socket/Types.hsc" #-}
return (SockAddrCan ifidx)
{-# LINE 999 "Network/Socket/Types.hsc" #-}
_ -> 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)
{-# LINE 1036 "Network/Socket/Types.hsc" #-}
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 1057 "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 1085 "Network/Socket/Types.hsc" #-}
instance Storable In6Addr where
sizeOf _ = 16
{-# LINE 1088 "Network/Socket/Types.hsc" #-}
alignment _ = 4
{-# LINE 1089 "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
{-# LINE 1103 "Network/Socket/Types.hsc" #-}
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)