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