summaryrefslogtreecommitdiff
path: root/src/Network/BitTorrent/Exchange/Manager.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Network/BitTorrent/Exchange/Manager.hs')
-rw-r--r--src/Network/BitTorrent/Exchange/Manager.hs55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/Network/BitTorrent/Exchange/Manager.hs b/src/Network/BitTorrent/Exchange/Manager.hs
new file mode 100644
index 00000000..1ea9989f
--- /dev/null
+++ b/src/Network/BitTorrent/Exchange/Manager.hs
@@ -0,0 +1,55 @@
1module Network.BitTorrent.Exchange.Manager
2 ( Options (..)
3 , Manager
4 , Handler
5 , newManager
6 , closeManager
7 ) where
8
9import Control.Concurrent
10import Control.Exception hiding (Handler)
11import Control.Monad
12import Data.Default
13import Network.Socket
14
15import Network.BitTorrent.Core
16
17
18data Options = Options
19 { optBacklog :: Int
20 , optPeerAddr :: PeerAddr IP
21 } deriving (Show, Eq)
22
23instance Default Options where
24 def = Options
25 { optBacklog = maxListenQueue
26 , optPeerAddr = def
27 }
28
29data Manager = Manager
30 { listener :: !ThreadId
31 }
32
33type Handler = Socket -> PeerAddr IP -> IO ()
34
35listenIncoming :: Options -> Handler -> IO ()
36listenIncoming Options {..} handler = do
37 bracket (socket AF_INET Stream defaultProtocol) close $ \ sock -> do
38 bind sock (toSockAddr optPeerAddr)
39 listen sock optBacklog
40 forever $ do
41 (conn, addr) <- accept sock
42 case fromSockAddr addr of
43 Nothing -> return ()
44 Just paddr -> do
45 forkIO $ handler conn paddr
46 return ()
47
48newManager :: Options -> Handler -> IO Manager
49newManager opts handler = do
50 tid <- forkIO $ listenIncoming opts handler
51 return (Manager tid)
52
53closeManager :: Manager -> IO ()
54closeManager Manager {..} = do
55 killThread listener \ No newline at end of file