exit :: IO ByteString
exit = exitSuccess
-usage :: IO ()
-usage = putStrLn "usage: functorrent torrent-file"
+usage :: String
+usage = "usage: functorrent torrent-file"
parse :: [String] -> IO ByteString
parse [] = getContents
logR <- initLogger
peerId <- mkPeerID
let log = logMessage logR
- log "Starting up functorrent"
- log $ "Parsing arguments " ++ concat args
- torrentStr <- parse args
- case torrentToMetainfo torrentStr of
- Left e -> logError e log
- Right m -> do
- -- if we had downloaded the file before (partly or completely)
- -- then we should check the current directory for the existence
- -- of the file and then update the map of each piece' availability.
- -- This can be done by reading each piece and verifying the checksum.
- -- If the checksum does not match, we don't have that piece.
- let filePath = name (info m) -- really this is just the file name, not file path
- fileLen = lengthInBytes (info m)
- pieceHash = pieces (info m)
- pLen = pieceLength (info m)
- infohash = infoHash m
- defaultPieceMap = initPieceMap pieceHash fileLen pLen
- log $ "create FS msg channel"
- fsMsgChannel <- FS.createMsgChannel
- log $ "Downloading file : " ++ filePath
- pieceMap <- FS.pieceMapFromFile filePath fileLen defaultPieceMap
- log $ "start filesystem manager thread"
- fsTid <- forkIO $ withFile filePath ReadWriteMode (FS.run pieceMap fsMsgChannel)
- log $ "starting server"
- (serverSock, (PortNumber portnum)) <- Server.start
- log $ "server started on " ++ show portnum
- log "Trying to fetch peers"
- _ <- forkIO $ Server.run serverSock peerId m pieceMap fsMsgChannel
- log $ "Trackers: " ++ head (announceList m)
- trackerMsgChan <- newTracker
- _ <- forkIO $ runTracker trackerMsgChan fsMsgChannel infohash portnum peerId (announceList m) fileLen
- ps <- getConnectedPeers trackerMsgChan
- log $ "Peers List : " ++ (show ps)
- let p1 = head ps
- handlePeerMsgs p1 peerId m pieceMap True fsMsgChannel
- logStop logR
- killThread fsTid
+ case args of
+ [] -> do
+ log usage
+ _ -> do
+ log "Starting up functorrent"
+ log $ "Parsing arguments " ++ concat args
+ torrentStr <- parse args
+ case torrentToMetainfo torrentStr of
+ Left e -> logError e log
+ Right m -> do
+ -- if we had downloaded the file before (partly or completely)
+ -- then we should check the current directory for the existence
+ -- of the file and then update the map of each piece' availability.
+ -- This can be done by reading each piece and verifying the checksum.
+ -- If the checksum does not match, we don't have that piece.
+ let filePath = name (info m) -- really this is just the file name, not file path
+ fileLen = lengthInBytes (info m)
+ pieceHash = pieces (info m)
+ pLen = pieceLength (info m)
+ infohash = infoHash m
+ defaultPieceMap = initPieceMap pieceHash fileLen pLen
+ log $ "create FS msg channel"
+ fsMsgChannel <- FS.createMsgChannel
+ log $ "Downloading file : " ++ filePath
+ pieceMap <- FS.pieceMapFromFile filePath fileLen defaultPieceMap
+ log $ "start filesystem manager thread"
+ fsTid <- forkIO $ withFile filePath ReadWriteMode (FS.run pieceMap fsMsgChannel)
+ log $ "starting server"
+ (serverSock, (PortNumber portnum)) <- Server.start
+ log $ "server started on " ++ show portnum
+ log "Trying to fetch peers"
+ _ <- forkIO $ Server.run serverSock peerId m pieceMap fsMsgChannel
+ log $ "Trackers: " ++ head (announceList m)
+ trackerMsgChan <- newTracker
+ _ <- forkIO $ runTracker trackerMsgChan fsMsgChannel infohash portnum peerId (announceList m) fileLen
+ ps <- getConnectedPeers trackerMsgChan
+ log $ "Peers List : " ++ (show ps)
+ let p1 = head ps
+ handlePeerMsgs p1 peerId m pieceMap True fsMsgChannel
+ logStop logR
+ killThread fsTid