on 4162113 help sign in
44 lines 1.3 kB history raw
1{-|
2Module : Util.Net
3Description : Utilities for Network IO.
5License : BSD3
6Maintainer : The Idris Community.
7-}
8module Util.Net (listenOnLocalhost, listenOnLocalhostAnyPort) where
10import Control.Exception (bracketOnError)
11import Network hiding (socketPort)
12import Network.BSD (getProtocolNumber)
13import Network.Socket hiding (sClose)
15-- Copied from upstream impl of listenOn
16-- bound to localhost interface instead of iNADDR_ANY
17listenOnLocalhost :: PortNumber -> IO Socket
18listenOnLocalhost port = do
19 proto <- getProtocolNumber "tcp"
20 localhost <- inet_addr "127.0.0.1"
21 bracketOnError
22 (socket AF_INET Stream proto)
23 (close)
24 (\sock -> do
25 setSocketOption sock ReuseAddr 1
26 bind sock (SockAddrInet port localhost)
27 listen sock maxListenQueue
28 return sock
29 )
31listenOnLocalhostAnyPort :: IO (Socket, PortNumber)
32listenOnLocalhostAnyPort = do
33 proto <- getProtocolNumber "tcp"
34 localhost <- inet_addr "127.0.0.1"
35 bracketOnError
36 (socket AF_INET Stream proto)
37 (close)
38 (\sock -> do
39 setSocketOption sock ReuseAddr 1
40 bind sock (SockAddrInet aNY_PORT localhost)
41 listen sock maxListenQueue
42 port <- socketPort sock
43 return (sock, port)
44 )