Safe Haskell | None |
---|---|
Language | Haskell2010 |
Cardano.BM.Snocket
Synopsis
- newtype Accept addr fd = Accept {}
- fmapAccept :: (addr -> addr') -> Accept addr fd -> Accept addr' fd
- mkListeningSocket :: Snocket IO fd addr -> Maybe addr -> AddressFamily addr -> IO fd
- data AddressFamily addr where
- data Snocket m fd addr = Snocket {
- getLocalAddr :: fd -> m addr
- getRemoteAddr :: fd -> m addr
- addrFamily :: addr -> AddressFamily addr
- open :: AddressFamily addr -> m fd
- openToConnect :: addr -> m fd
- connect :: fd -> addr -> m ()
- bind :: fd -> addr -> m ()
- listen :: fd -> m ()
- accept :: fd -> Accept addr fd
- close :: fd -> m ()
- type SocketSnocket = Snocket IO Socket SockAddr
- socketSnocket :: IOManager -> SocketSnocket
- type LocalSnocket = Snocket IO Socket LocalAddress
- localSnocket :: IOManager -> FilePath -> LocalSnocket
- newtype LocalAddress = LocalAddress {}
- type LocalFD = Socket
- localAddressFromPath :: FilePath -> LocalAddress
- localFDToHandle :: LocalFD -> IO Handle
Snocket Interface
newtype Accept addr fd Source #
Named pipes and Berkeley sockets have different API when accepting
a connection. For named pipes the file descriptor created by createNamedPipe
is
supposed to be used for the first connected client. Named pipe accept loop
looks this way:
acceptLoop k = do h <- createNamedPipe name connectNamedPipe h -- h is now in connected state forkIO (k h) acceptLoop k
For Berkeley sockets equivalent loop starts by creating a socket which accepts connections and accept returns a new socket in connected state
acceptLoop k = do s <- socket ... bind s address listen s loop s where loop s = do (s' , _addr') <- accept s -- s' is in connected state forkIO (k s') loop s
To make common API for both we use a recursive type Accept
, see
berkeleyAccept
below. Creation of a socket / named pipe is part of
Snocket
, but this means we need to have different recursion step for named
pipe & sockets. For sockets its recursion step will always return accept
syscall; for named pipes the first callback will reuse the file descriptor
created by open
and only subsequent calls will create a new file
descriptor by createNamedPipe
, see namedPipeSnocket
.
fmapAccept :: (addr -> addr') -> Accept addr fd -> Accept addr' fd Source #
Arguments of Accept
are in the wrong order.
TODO: this can be fixed later.
mkListeningSocket :: Snocket IO fd addr -> Maybe addr -> AddressFamily addr -> IO fd Source #
data AddressFamily addr where Source #
We support either sockets or named pipes.
Constructors
SocketFamily :: !Family -> AddressFamily SockAddr | |
LocalFamily :: AddressFamily LocalAddress |
Instances
Eq (AddressFamily addr) Source # | |
Defined in Cardano.BM.Snocket Methods (==) :: AddressFamily addr -> AddressFamily addr -> Bool # (/=) :: AddressFamily addr -> AddressFamily addr -> Bool # | |
Show (AddressFamily addr) Source # | |
Defined in Cardano.BM.Snocket Methods showsPrec :: Int -> AddressFamily addr -> ShowS # show :: AddressFamily addr -> String # showList :: [AddressFamily addr] -> ShowS # |
data Snocket m fd addr Source #
Abstract communication interface that can be used by more than
Socket
. Snockets are polymorphic over monad which is used, this feature
is useful for testing and/or simulations.
Constructors
Snocket | |
Fields
|
Socket based Snocktes
Arguments
:: IOManager |
Though it could be used in |
-> SocketSnocket |
Local Snockets
type LocalSnocket = Snocket IO Socket LocalAddress Source #
System dependent LocalSnocket type
localSnocket :: IOManager -> FilePath -> LocalSnocket Source #
newtype LocalAddress Source #
Local address, on Unix is associated with AF_UNIX
family, on
Windows with `named-pipes`.
Constructors
LocalAddress | |
Fields |
Instances
Eq LocalAddress Source # | |
Defined in Cardano.BM.Snocket | |
Ord LocalAddress Source # | |
Defined in Cardano.BM.Snocket Methods compare :: LocalAddress -> LocalAddress -> Ordering # (<) :: LocalAddress -> LocalAddress -> Bool # (<=) :: LocalAddress -> LocalAddress -> Bool # (>) :: LocalAddress -> LocalAddress -> Bool # (>=) :: LocalAddress -> LocalAddress -> Bool # max :: LocalAddress -> LocalAddress -> LocalAddress # min :: LocalAddress -> LocalAddress -> LocalAddress # | |
Show LocalAddress Source # | |
Defined in Cardano.BM.Snocket Methods showsPrec :: Int -> LocalAddress -> ShowS # show :: LocalAddress -> String # showList :: [LocalAddress] -> ShowS # |