diff options
Diffstat (limited to 'src/Network/BitTorrent/Exchange/Manager.hs')
-rw-r--r-- | src/Network/BitTorrent/Exchange/Manager.hs | 55 |
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 @@ | |||
1 | module Network.BitTorrent.Exchange.Manager | ||
2 | ( Options (..) | ||
3 | , Manager | ||
4 | , Handler | ||
5 | , newManager | ||
6 | , closeManager | ||
7 | ) where | ||
8 | |||
9 | import Control.Concurrent | ||
10 | import Control.Exception hiding (Handler) | ||
11 | import Control.Monad | ||
12 | import Data.Default | ||
13 | import Network.Socket | ||
14 | |||
15 | import Network.BitTorrent.Core | ||
16 | |||
17 | |||
18 | data Options = Options | ||
19 | { optBacklog :: Int | ||
20 | , optPeerAddr :: PeerAddr IP | ||
21 | } deriving (Show, Eq) | ||
22 | |||
23 | instance Default Options where | ||
24 | def = Options | ||
25 | { optBacklog = maxListenQueue | ||
26 | , optPeerAddr = def | ||
27 | } | ||
28 | |||
29 | data Manager = Manager | ||
30 | { listener :: !ThreadId | ||
31 | } | ||
32 | |||
33 | type Handler = Socket -> PeerAddr IP -> IO () | ||
34 | |||
35 | listenIncoming :: Options -> Handler -> IO () | ||
36 | listenIncoming 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 | |||
48 | newManager :: Options -> Handler -> IO Manager | ||
49 | newManager opts handler = do | ||
50 | tid <- forkIO $ listenIncoming opts handler | ||
51 | return (Manager tid) | ||
52 | |||
53 | closeManager :: Manager -> IO () | ||
54 | closeManager Manager {..} = do | ||
55 | killThread listener \ No newline at end of file | ||