diff options
author | jim@bo <jim@bo> | 2018-06-20 22:40:37 -0400 |
---|---|---|
committer | jim@bo <jim@bo> | 2018-06-20 22:43:47 -0400 |
commit | 825962518c6ad00279fc23e8e1dec746980e483f (patch) | |
tree | 68c135bdffd879835c48cce3d397e8edf99b53f4 /src/Network | |
parent | 09aa079fbab069f177e08b5239bf684d312eb00a (diff) |
More DPut stuff
* verbose/quiet without args shows report
* verbose all - sets all tags verbose
* quiet all - sets all tags quiet
* XMisc defaults to verbose, everything else quiet
* new XMan tag for ToxManager related stuff
* s/hputStrLn stderr/dput XMisc/ in daemon code
Diffstat (limited to 'src/Network')
-rw-r--r-- | src/Network/Address.hs | 3 | ||||
-rw-r--r-- | src/Network/BitTorrent/MainlineDHT.hs | 19 | ||||
-rw-r--r-- | src/Network/Kademlia/Bootstrap.hs | 22 | ||||
-rw-r--r-- | src/Network/QueryResponse.hs | 15 | ||||
-rw-r--r-- | src/Network/StreamServer.hs | 3 | ||||
-rw-r--r-- | src/Network/Tox.hs | 44 | ||||
-rw-r--r-- | src/Network/Tox/ContactInfo.hs | 3 | ||||
-rw-r--r-- | src/Network/Tox/DHT/Handlers.hs | 14 | ||||
-rw-r--r-- | src/Network/Tox/Onion/Transport.hs | 12 | ||||
-rw-r--r-- | src/Network/UPNP.hs | 3 |
10 files changed, 77 insertions, 61 deletions
diff --git a/src/Network/Address.hs b/src/Network/Address.hs index 3766d614..367f608b 100644 --- a/src/Network/Address.hs +++ b/src/Network/Address.hs | |||
@@ -131,6 +131,7 @@ import System.Locale (defaultTimeLocale) | |||
131 | #endif | 131 | #endif |
132 | import System.Entropy | 132 | import System.Entropy |
133 | import System.IO (stderr) | 133 | import System.IO (stderr) |
134 | import DPut | ||
134 | 135 | ||
135 | -- import Paths_bittorrent (version) | 136 | -- import Paths_bittorrent (version) |
136 | 137 | ||
@@ -1193,7 +1194,7 @@ getBindAddress bindspec enabled6 = do | |||
1193 | then SockAddrInet6 (parsePort listenPortString) 0 iN6ADDR_ANY 0 | 1194 | then SockAddrInet6 (parsePort listenPortString) 0 iN6ADDR_ANY 0 |
1194 | else SockAddrInet (parsePort listenPortString) iNADDR_ANY | 1195 | else SockAddrInet (parsePort listenPortString) iNADDR_ANY |
1195 | where parsePort s = fromMaybe 0 $ readMaybe s | 1196 | where parsePort s = fromMaybe 0 $ readMaybe s |
1196 | hPutStrLn stderr $ BS8.pack $ "Listening on " ++ show listenAddr | 1197 | dput XMisc $ "Listening on " ++ show listenAddr |
1197 | return listenAddr | 1198 | return listenAddr |
1198 | 1199 | ||
1199 | -- | True if the argument is an IPv4-mapped address with prefix ::FFFF:0:0/96 | 1200 | -- | True if the argument is an IPv4-mapped address with prefix ::FFFF:0:0/96 |
diff --git a/src/Network/BitTorrent/MainlineDHT.hs b/src/Network/BitTorrent/MainlineDHT.hs index 847d820b..626f980f 100644 --- a/src/Network/BitTorrent/MainlineDHT.hs +++ b/src/Network/BitTorrent/MainlineDHT.hs | |||
@@ -87,6 +87,7 @@ import qualified Data.Aeson as JSON | |||
87 | import Text.Read | 87 | import Text.Read |
88 | import System.Global6 | 88 | import System.Global6 |
89 | import Control.TriadCommittee | 89 | import Control.TriadCommittee |
90 | import DPut | ||
90 | 91 | ||
91 | newtype NodeId = NodeId ByteString | 92 | newtype NodeId = NodeId ByteString |
92 | deriving (Eq,Ord,ByteArrayAccess, Bits, Hashable) | 93 | deriving (Eq,Ord,ByteArrayAccess, Bits, Hashable) |
@@ -431,10 +432,10 @@ addVerbosity :: Transport err SockAddr ByteString -> Transport err SockAddr Byte | |||
431 | addVerbosity tr = | 432 | addVerbosity tr = |
432 | tr { awaitMessage = \kont -> awaitMessage tr $ \m -> do | 433 | tr { awaitMessage = \kont -> awaitMessage tr $ \m -> do |
433 | forM_ m $ mapM_ $ \(msg,addr) -> do | 434 | forM_ m $ mapM_ $ \(msg,addr) -> do |
434 | hPutStrLn stderr (showPacket id addr " --> " msg) | 435 | dput XBitTorrent (showPacket id addr " --> " msg) |
435 | kont m | 436 | kont m |
436 | , sendMessage = \addr msg -> do | 437 | , sendMessage = \addr msg -> do |
437 | hPutStrLn stderr (showPacket id addr " <-- " msg) | 438 | dput XBitTorrent (showPacket id addr " <-- " msg) |
438 | sendMessage tr addr msg | 439 | sendMessage tr addr msg |
439 | } | 440 | } |
440 | 441 | ||
@@ -642,18 +643,18 @@ newClient swarms addr = do | |||
642 | fork $ fix $ \again -> do | 643 | fork $ fix $ \again -> do |
643 | myThreadId >>= flip labelThread "addr4" | 644 | myThreadId >>= flip labelThread "addr4" |
644 | (addr, ns) <- atomically $ readTChan addr4 | 645 | (addr, ns) <- atomically $ readTChan addr4 |
645 | hPutStrLn stderr $ "External IPv4: "++show (addr, length ns) | 646 | dput XBitTorrent $ "External IPv4: "++show (addr, length ns) |
646 | forM_ ns $ \n -> do | 647 | forM_ ns $ \n -> do |
647 | hPutStrLn stderr $ "Change IP, ping: "++show n | 648 | dput XBitTorrent $ "Change IP, ping: "++show n |
648 | ping outgoingClient n | 649 | ping outgoingClient n |
649 | -- TODO: trigger bootstrap ipv4 | 650 | -- TODO: trigger bootstrap ipv4 |
650 | again | 651 | again |
651 | fork $ fix $ \again -> do | 652 | fork $ fix $ \again -> do |
652 | myThreadId >>= flip labelThread "addr6" | 653 | myThreadId >>= flip labelThread "addr6" |
653 | (addr,ns) <- atomically $ readTChan addr6 | 654 | (addr,ns) <- atomically $ readTChan addr6 |
654 | hPutStrLn stderr $ "External IPv6: "++show (addr, length ns) | 655 | dput XBitTorrent $ "External IPv6: "++show (addr, length ns) |
655 | forM_ ns $ \n -> do | 656 | forM_ ns $ \n -> do |
656 | hPutStrLn stderr $ "Change IP, ping: "++show n | 657 | dput XBitTorrent $ "Change IP, ping: "++show n |
657 | ping outgoingClient n | 658 | ping outgoingClient n |
658 | -- TODO: trigger bootstrap ipv6 | 659 | -- TODO: trigger bootstrap ipv6 |
659 | again | 660 | again |
@@ -734,7 +735,7 @@ mainlineKademlia client committee refresher | |||
734 | return $ do | 735 | return $ do |
735 | io1 >> io2 | 736 | io1 >> io2 |
736 | {- noisy (timestamp updates are currently reported as transitions to Accepted) | 737 | {- noisy (timestamp updates are currently reported as transitions to Accepted) |
737 | hPutStrLn stderr $ unwords | 738 | dput XBitTorrent $ unwords |
738 | [ show (transitionedTo tr) | 739 | [ show (transitionedTo tr) |
739 | , show (transitioningNode tr) | 740 | , show (transitioningNode tr) |
740 | ] -} | 741 | ] -} |
@@ -753,7 +754,7 @@ transitionCommittee :: TriadCommittee NodeId SockAddr -> RoutingTransition NodeI | |||
753 | transitionCommittee committee (RoutingTransition ni Stranger) = do | 754 | transitionCommittee committee (RoutingTransition ni Stranger) = do |
754 | delVote committee (nodeId ni) | 755 | delVote committee (nodeId ni) |
755 | return $ do | 756 | return $ do |
756 | hPutStrLn stderr $ "delVote "++show (nodeId ni) | 757 | dput XBitTorrent $ "delVote "++show (nodeId ni) |
757 | transitionCommittee committee _ = return $ return () | 758 | transitionCommittee committee _ = return $ return () |
758 | 759 | ||
759 | updateRouting :: MainlineClient -> Routing -> NodeInfo -> Message BValue -> IO () | 760 | updateRouting :: MainlineClient -> Routing -> NodeInfo -> Message BValue -> IO () |
@@ -768,7 +769,7 @@ updateRouting client routing naddr msg = do | |||
768 | case msg of | 769 | case msg of |
769 | R { rspReflectedIP = Just sockaddr } | 770 | R { rspReflectedIP = Just sockaddr } |
770 | -> do | 771 | -> do |
771 | -- hPutStrLn stderr $ "External: "++show (nodeId naddr,sockaddr) | 772 | -- dput XBitTorrent $ "External: "++show (nodeId naddr,sockaddr) |
772 | atomically $ addVote committee (nodeId naddr) sockaddr | 773 | atomically $ addVote committee (nodeId naddr) sockaddr |
773 | _ -> return () | 774 | _ -> return () |
774 | insertNode (mainlineKademlia client committee refresher) naddr | 775 | insertNode (mainlineKademlia client committee refresher) naddr |
diff --git a/src/Network/Kademlia/Bootstrap.hs b/src/Network/Kademlia/Bootstrap.hs index d77f524c..4197e06e 100644 --- a/src/Network/Kademlia/Bootstrap.hs +++ b/src/Network/Kademlia/Bootstrap.hs | |||
@@ -143,7 +143,7 @@ forkPollForRefresh r@BucketRefresher{ refreshInterval | |||
143 | where | 143 | where |
144 | refresh :: Int -> IO Int | 144 | refresh :: Int -> IO Int |
145 | refresh n = do | 145 | refresh n = do |
146 | -- hPutStrLn stderr $ "Refresh time! "++ show n | 146 | -- dput XRefresh $ "Refresh time! "++ show n |
147 | refreshBucket r n | 147 | refreshBucket r n |
148 | 148 | ||
149 | go again ( bktnum :-> refresh_time ) = do | 149 | go again ( bktnum :-> refresh_time ) = do |
@@ -162,7 +162,7 @@ forkPollForRefresh r@BucketRefresher{ refreshInterval | |||
162 | return () | 162 | return () |
163 | return () | 163 | return () |
164 | picoseconds -> do | 164 | picoseconds -> do |
165 | -- hPutStrLn stderr $ show (picoseconds `div` 10^12) ++ " seconds until refresh " ++ show bktnum | 165 | -- dput XRefresh $ show (picoseconds `div` 10^12) ++ " seconds until refresh " ++ show bktnum |
166 | threadDelay ( picoseconds `div` 10^6 ) | 166 | threadDelay ( picoseconds `div` 10^6 ) |
167 | again | 167 | again |
168 | 168 | ||
@@ -202,13 +202,13 @@ onFinishedRefresh BucketRefresher { bootstrapCountdown | |||
202 | , refreshQueue | 202 | , refreshQueue |
203 | , refreshBuckets } num now = do | 203 | , refreshBuckets } num now = do |
204 | bootstrapping <- readTVar bootstrapMode | 204 | bootstrapping <- readTVar bootstrapMode |
205 | if not bootstrapping then return $ return () -- hPutStrLn stderr $ "Finished non-boostrapping refresh: "++show num | 205 | if not bootstrapping then return $ return () -- dput XRefresh $ "Finished non-boostrapping refresh: "++show num |
206 | else do | 206 | else do |
207 | tbl <- readTVar refreshBuckets | 207 | tbl <- readTVar refreshBuckets |
208 | action <- | 208 | action <- |
209 | if num /= R.bktCount tbl - 1 | 209 | if num /= R.bktCount tbl - 1 |
210 | then do modifyTVar' bootstrapCountdown (fmap pred) | 210 | then do modifyTVar' bootstrapCountdown (fmap pred) |
211 | return $ return () -- hPutStrLn stderr $ "BOOTSTRAP decrement" | 211 | return $ return () -- dput XRefresh $ "BOOTSTRAP decrement" |
212 | else do | 212 | else do |
213 | -- The last bucket finished. | 213 | -- The last bucket finished. |
214 | cnt <- readTVar bootstrapCountdown | 214 | cnt <- readTVar bootstrapCountdown |
@@ -225,17 +225,17 @@ onFinishedRefresh BucketRefresher { bootstrapCountdown | |||
225 | -- Schedule immediate refresh for unfull buckets (other than this one). | 225 | -- Schedule immediate refresh for unfull buckets (other than this one). |
226 | modifyTVar' refreshQueue $ Int.insert n (now - 1) | 226 | modifyTVar' refreshQueue $ Int.insert n (now - 1) |
227 | writeTVar bootstrapCountdown $! Just $! length unfull | 227 | writeTVar bootstrapCountdown $! Just $! length unfull |
228 | return $ return () -- hPutStrLn stderr $ "BOOTSTRAP scheduling: "++show unfull | 228 | return $ return () -- dput XRefresh $ "BOOTSTRAP scheduling: "++show unfull |
229 | Just n -> do writeTVar bootstrapCountdown $! Just $! pred n | 229 | Just n -> do writeTVar bootstrapCountdown $! Just $! pred n |
230 | return $ return () -- hPutStrLn stderr "BOOTSTRAP decrement (last bucket)" | 230 | return $ return () -- dput XRefresh "BOOTSTRAP decrement (last bucket)" |
231 | cnt <- readTVar bootstrapCountdown | 231 | cnt <- readTVar bootstrapCountdown |
232 | if (cnt == Just 0) | 232 | if (cnt == Just 0) |
233 | then do | 233 | then do |
234 | -- Boostrap finished! | 234 | -- Boostrap finished! |
235 | writeTVar bootstrapMode False | 235 | writeTVar bootstrapMode False |
236 | writeTVar bootstrapCountdown Nothing | 236 | writeTVar bootstrapCountdown Nothing |
237 | return $ do action ; hPutStrLn stderr $ "BOOTSTRAP complete (" ++ show (R.shape tbl) ++ ")." | 237 | return $ do action ; dput XRefresh $ "BOOTSTRAP complete (" ++ show (R.shape tbl) ++ ")." |
238 | else return $ do action ; hPutStrLn stderr $ "BOOTSTRAP progress " ++ show (num,R.shape tbl,cnt) | 238 | else return $ do action ; dput XRefresh $ "BOOTSTRAP progress " ++ show (num,R.shape tbl,cnt) |
239 | 239 | ||
240 | refreshBucket :: (Show nid, Ord ni, Ord nid, Hashable nid, Hashable ni) => | 240 | refreshBucket :: (Show nid, Ord ni, Ord nid, Hashable nid, Hashable ni) => |
241 | BucketRefresher nid ni -> Int -> IO Int | 241 | BucketRefresher nid ni -> Int -> IO Int |
@@ -254,7 +254,7 @@ refreshBucket r@BucketRefresher{ refreshSearch = sch | |||
254 | fin <- atomically $ newTVar False | 254 | fin <- atomically $ newTVar False |
255 | resultCounter <- atomically $ newTVar Set.empty | 255 | resultCounter <- atomically $ newTVar Set.empty |
256 | 256 | ||
257 | hPutStrLn stderr $ "Start refresh " ++ show (n,sample) | 257 | dput XRefresh $ "Start refresh " ++ show (n,sample) |
258 | 258 | ||
259 | -- Set 15 minute timeout in order to avoid overlapping refreshes. | 259 | -- Set 15 minute timeout in order to avoid overlapping refreshes. |
260 | s <- search sch tbl sample $ if n+1 == R.defaultBucketCount | 260 | s <- search sch tbl sample $ if n+1 == R.defaultBucketCount |
@@ -289,9 +289,9 @@ restartBootstrap r@BucketRefresher{ bootstrapMode, bootstrapCountdown } = do | |||
289 | writeTVar bootstrapMode True | 289 | writeTVar bootstrapMode True |
290 | writeTVar bootstrapCountdown Nothing | 290 | writeTVar bootstrapCountdown Nothing |
291 | if not unchanged then return $ do | 291 | if not unchanged then return $ do |
292 | hPutStrLn stderr "BOOTSTRAP entered bootstrap mode" | 292 | dput XRefresh "BOOTSTRAP entered bootstrap mode" |
293 | refreshLastBucket r | 293 | refreshLastBucket r |
294 | else return $ hPutStrLn stderr "BOOTSTRAP already bootstrapping" | 294 | else return $ dput XRefresh "BOOTSTRAP already bootstrapping" |
295 | 295 | ||
296 | bootstrap :: (Ord ni, Ord nid, Hashable nid, Hashable ni, Foldable t, Foldable t1, Show nid) => | 296 | bootstrap :: (Ord ni, Ord nid, Hashable nid, Hashable ni, Foldable t, Foldable t1, Show nid) => |
297 | BucketRefresher nid ni | 297 | BucketRefresher nid ni |
diff --git a/src/Network/QueryResponse.hs b/src/Network/QueryResponse.hs index 4e697109..3ee6d945 100644 --- a/src/Network/QueryResponse.hs +++ b/src/Network/QueryResponse.hs | |||
@@ -37,6 +37,7 @@ import System.Endian | |||
37 | import System.IO | 37 | import System.IO |
38 | import System.IO.Error | 38 | import System.IO.Error |
39 | import System.Timeout | 39 | import System.Timeout |
40 | import DPut | ||
40 | 41 | ||
41 | -- | Three methods are required to implement a datagram based query\/response protocol. | 42 | -- | Three methods are required to implement a datagram based query\/response protocol. |
42 | data Transport err addr x = Transport | 43 | data Transport err addr x = Transport |
@@ -426,6 +427,16 @@ ignoreErrors = ErrorReporter | |||
426 | , reportTimeout = \_ _ _ -> return () | 427 | , reportTimeout = \_ _ _ -> return () |
427 | } | 428 | } |
428 | 429 | ||
430 | logErrors :: ( Show addr | ||
431 | , Show meth | ||
432 | ) => ErrorReporter addr x meth tid String | ||
433 | logErrors = ErrorReporter | ||
434 | { reportParseError = \err -> dput XMisc err | ||
435 | , reportMissingHandler = \meth addr x -> dput XMisc $ show addr ++ " --> Missing handler ("++show meth++")" | ||
436 | , reportUnknown = \addr x err -> dput XMisc $ show addr ++ " --> " ++ err | ||
437 | , reportTimeout = \meth tid addr -> dput XMisc $ show addr ++ " --> Timeout ("++show meth++")" | ||
438 | } | ||
439 | |||
429 | printErrors :: ( Show addr | 440 | printErrors :: ( Show addr |
430 | , Show meth | 441 | , Show meth |
431 | ) => Handle -> ErrorReporter addr x meth tid String | 442 | ) => Handle -> ErrorReporter addr x meth tid String |
@@ -550,9 +561,9 @@ udpTransport' bind_address = do | |||
550 | (SockAddrInet6 port 0 (0,0,0x0000ffff,raw4) 0) -> \bs -> do | 561 | (SockAddrInet6 port 0 (0,0,0x0000ffff,raw4) 0) -> \bs -> do |
551 | let host4 = toBE32 raw4 | 562 | let host4 = toBE32 raw4 |
552 | -- Change 4mapped6 to ordinary IPv4. | 563 | -- Change 4mapped6 to ordinary IPv4. |
553 | -- hPutStrLn stderr $ "4mapped6 -> "++show (SockAddrInet port host4) | 564 | -- dput XMisc $ "4mapped6 -> "++show (SockAddrInet port host4) |
554 | saferSendTo sock bs (SockAddrInet port host4) | 565 | saferSendTo sock bs (SockAddrInet port host4) |
555 | addr@(SockAddrInet6 {}) -> \bs -> hPutStrLn stderr ("Discarding packet to "++show addr) | 566 | addr@(SockAddrInet6 {}) -> \bs -> dput XMisc ("Discarding packet to "++show addr) |
556 | addr4 -> \bs -> saferSendTo sock bs addr4 | 567 | addr4 -> \bs -> saferSendTo sock bs addr4 |
557 | _ -> \addr bs -> saferSendTo sock bs addr | 568 | _ -> \addr bs -> saferSendTo sock bs addr |
558 | , closeTransport = close sock | 569 | , closeTransport = close sock |
diff --git a/src/Network/StreamServer.hs b/src/Network/StreamServer.hs index 6a36ed00..01680b77 100644 --- a/src/Network/StreamServer.hs +++ b/src/Network/StreamServer.hs | |||
@@ -57,6 +57,7 @@ import System.IO (Handle) | |||
57 | import Control.Concurrent.MVar (newMVar) | 57 | import Control.Concurrent.MVar (newMVar) |
58 | 58 | ||
59 | import Network.SocketLike | 59 | import Network.SocketLike |
60 | import DPut | ||
60 | 61 | ||
61 | data ServerHandle = ServerHandle Socket (Weak ThreadId) | 62 | data ServerHandle = ServerHandle Socket (Weak ThreadId) |
62 | 63 | ||
@@ -89,7 +90,7 @@ bshow e = show e | |||
89 | -- | Send a string to stderr. Not exported. Default 'serverWarn' when | 90 | -- | Send a string to stderr. Not exported. Default 'serverWarn' when |
90 | -- 'withSession' is used to configure the server. | 91 | -- 'withSession' is used to configure the server. |
91 | warnStderr :: String -> IO () | 92 | warnStderr :: String -> IO () |
92 | warnStderr str = hPutStrLn stderr str >> hFlush stderr | 93 | warnStderr str = dput XMisc str >> hFlush stderr |
93 | 94 | ||
94 | data ServerConfig = ServerConfig | 95 | data ServerConfig = ServerConfig |
95 | { serverWarn :: String -> IO () | 96 | { serverWarn :: String -> IO () |
diff --git a/src/Network/Tox.hs b/src/Network/Tox.hs index a13a4f10..efddc2a0 100644 --- a/src/Network/Tox.hs +++ b/src/Network/Tox.hs | |||
@@ -141,9 +141,9 @@ newCrypto = do | |||
141 | noncevar <- atomically $ newTVar $ fst $ withDRG drg drgNew | 141 | noncevar <- atomically $ newTVar $ fst $ withDRG drg drgNew |
142 | cookieKeys <- atomically $ newTVar [] | 142 | cookieKeys <- atomically $ newTVar [] |
143 | cache <- newSecretsCache | 143 | cache <- newSecretsCache |
144 | hPutStrLn stderr $ "secret(tox) = " ++ DHT.showHex secret | 144 | dput XNetCrypto $ "secret(tox) = " ++ DHT.showHex secret |
145 | hPutStrLn stderr $ "public(tox) = " ++ DHT.showHex pubkey | 145 | dput XNetCrypto $ "public(tox) = " ++ DHT.showHex pubkey |
146 | hPutStrLn stderr $ "symmetric(tox) = " ++ DHT.showHex symkey | 146 | dput XNetCrypto $ "symmetric(tox) = " ++ DHT.showHex symkey |
147 | return TransportCrypto | 147 | return TransportCrypto |
148 | { transportSecret = secret | 148 | { transportSecret = secret |
149 | , transportPublic = pubkey | 149 | , transportPublic = pubkey |
@@ -233,7 +233,7 @@ newClient drg net classify selfAddr handlers modifytbl modifynet = do | |||
233 | , lookupHandler = handlers -- var | 233 | , lookupHandler = handlers -- var |
234 | , tableMethods = modifytbl tbl | 234 | , tableMethods = modifytbl tbl |
235 | } | 235 | } |
236 | eprinter = printErrors stderr | 236 | eprinter = logErrors -- printErrors stderr |
237 | mkclient (tbl,var) handlers = | 237 | mkclient (tbl,var) handlers = |
238 | let client = Client | 238 | let client = Client |
239 | { clientNet = addHandler (reportParseError eprinter) (handleMessage client) $ modifynet client net | 239 | { clientNet = addHandler (reportParseError eprinter) (handleMessage client) $ modifynet client net |
@@ -277,7 +277,7 @@ netCryptoWithBackoff millisecs tox myseckey theirpubkey = do | |||
277 | mbContactsVar <- fmap contacts . HashMap.lookup mykeyAsId <$> atomically (readTVar (accounts (toxContactInfo tox))) | 277 | mbContactsVar <- fmap contacts . HashMap.lookup mykeyAsId <$> atomically (readTVar (accounts (toxContactInfo tox))) |
278 | case mbContactsVar of | 278 | case mbContactsVar of |
279 | Nothing -> do | 279 | Nothing -> do |
280 | hPutStrLn stderr ("netCrypto: (" ++ show mykeyAsId ++") accounts lookup failed.") | 280 | dput XNetCrypto ("netCrypto: (" ++ show mykeyAsId ++") accounts lookup failed.") |
281 | return [] | 281 | return [] |
282 | 282 | ||
283 | Just contactsVar -> do | 283 | Just contactsVar -> do |
@@ -292,13 +292,13 @@ netCryptoWithBackoff millisecs tox myseckey theirpubkey = do | |||
292 | return (kp,sa,fr,cp) | 292 | return (kp,sa,fr,cp) |
293 | case tup of | 293 | case tup of |
294 | (Nothing,Nothing,Nothing,Nothing) -> do | 294 | (Nothing,Nothing,Nothing,Nothing) -> do |
295 | hPutStrLn stderr ("netCrypto: (" ++ show mykeyAsId ++") friend not found (" ++ show theirkeyAsId ++ ").") | 295 | dput XNetCrypto ("netCrypto: (" ++ show mykeyAsId ++") friend not found (" ++ show theirkeyAsId ++ ").") |
296 | return [] | 296 | return [] |
297 | (mbKeyPkt,Nothing,mbFR,mbPolicy) -> do | 297 | (mbKeyPkt,Nothing,mbFR,mbPolicy) -> do |
298 | hPutStrLn stderr ("netCrypto: (" ++ show mykeyAsId ++") no SockAddr for friend (" ++ show theirkeyAsId ++ "). TODO: search their node?") | 298 | dput XNetCrypto ("netCrypto: (" ++ show mykeyAsId ++") no SockAddr for friend (" ++ show theirkeyAsId ++ "). TODO: search their node?") |
299 | return [] | 299 | return [] |
300 | (Nothing,_,_,_) -> do | 300 | (Nothing,_,_,_) -> do |
301 | hPutStrLn stderr ("netCrypto: (" ++ show mykeyAsId ++") no DHT-key for friend (" ++ show theirkeyAsId ++ "). TODO: what?") | 301 | dput XNetCrypto ("netCrypto: (" ++ show mykeyAsId ++") no DHT-key for friend (" ++ show theirkeyAsId ++ "). TODO: what?") |
302 | return [] | 302 | return [] |
303 | (Just (stamp_theirDhtKey,keyPkt),Just (stamp_saddr,saddr),mbFR,mbPolicy) | 303 | (Just (stamp_theirDhtKey,keyPkt),Just (stamp_saddr,saddr),mbFR,mbPolicy) |
304 | | theirDhtKey <- DHT.dhtpk keyPkt -> do | 304 | | theirDhtKey <- DHT.dhtpk keyPkt -> do |
@@ -310,7 +310,7 @@ netCryptoWithBackoff millisecs tox myseckey theirpubkey = do | |||
310 | Just sessions | matchedSessions <- filter (sessionUsesIdentity (toPublic myseckey)) sessions | 310 | Just sessions | matchedSessions <- filter (sessionUsesIdentity (toPublic myseckey)) sessions |
311 | , not (null matchedSessions) | 311 | , not (null matchedSessions) |
312 | -> do | 312 | -> do |
313 | hPutStrLn stderr ("netCrypto: Already have a session for " ++ show mykeyAsId ++ "<-->" ++ show theirkeyAsId) | 313 | dput XNetCrypto ("netCrypto: Already have a session for " ++ show mykeyAsId ++ "<-->" ++ show theirkeyAsId) |
314 | return matchedSessions | 314 | return matchedSessions |
315 | -- if not, send handshake, this is separate session | 315 | -- if not, send handshake, this is separate session |
316 | _ -> do | 316 | _ -> do |
@@ -319,16 +319,16 @@ netCryptoWithBackoff millisecs tox myseckey theirpubkey = do | |||
319 | let crypto = toxCryptoKeys tox | 319 | let crypto = toxCryptoKeys tox |
320 | client = toxDHT tox | 320 | client = toxDHT tox |
321 | case nodeInfo (key2id theirDhtKey) saddr of | 321 | case nodeInfo (key2id theirDhtKey) saddr of |
322 | Left e -> hPutStrLn stderr ("netCrypto: nodeInfo fail... " ++ e) >> return [] | 322 | Left e -> dput XNetCrypto ("netCrypto: nodeInfo fail... " ++ e) >> return [] |
323 | Right ni -> do | 323 | Right ni -> do |
324 | mbCookie <- DHT.cookieRequest crypto client (toPublic myseckey) ni | 324 | mbCookie <- DHT.cookieRequest crypto client (toPublic myseckey) ni |
325 | case mbCookie of | 325 | case mbCookie of |
326 | Nothing -> do | 326 | Nothing -> do |
327 | hPutStrLn stderr ("netCrypto: (" ++ show mykeyAsId ++") <--> (" ++ show theirkeyAsId ++ ").") | 327 | dput XNetCrypto ("netCrypto: (" ++ show mykeyAsId ++") <--> (" ++ show theirkeyAsId ++ ").") |
328 | hPutStrLn stderr ("netCrypto: CookieRequest failed. TODO: dhtpkNodes thingy") | 328 | dput XNetCrypto ("netCrypto: CookieRequest failed. TODO: dhtpkNodes thingy") |
329 | return [] | 329 | return [] |
330 | Just cookie -> do | 330 | Just cookie -> do |
331 | hPutStrLn stderr "Have cookie, creating handshake packet..." | 331 | dput XNetCrypto "Have cookie, creating handshake packet..." |
332 | let hp = HParam { hpOtherCookie = cookie | 332 | let hp = HParam { hpOtherCookie = cookie |
333 | , hpMySecretKey = myseckey | 333 | , hpMySecretKey = myseckey |
334 | , hpCookieRemotePubkey = theirpubkey | 334 | , hpCookieRemotePubkey = theirpubkey |
@@ -349,12 +349,12 @@ netCryptoWithBackoff millisecs tox myseckey theirpubkey = do | |||
349 | delay = (millisecs * 5 `div` 4) | 349 | delay = (millisecs * 5 `div` 4) |
350 | if secnum < 20000000 | 350 | if secnum < 20000000 |
351 | then do | 351 | then do |
352 | hPutStrLn stderr $ "sent handshake, now delaying " ++ show (secnum * 1.25) ++ " second(s).." | 352 | dput XNetCrypto $ "sent handshake, now delaying " ++ show (secnum * 1.25) ++ " second(s).." |
353 | -- threadDelay delay | 353 | -- threadDelay delay |
354 | -- Commenting loop for simpler debugging | 354 | -- Commenting loop for simpler debugging |
355 | return [] -- netCryptoWithBackoff delay tox myseckey theirpubkey -- hopefully it will find an active session this time. | 355 | return [] -- netCryptoWithBackoff delay tox myseckey theirpubkey -- hopefully it will find an active session this time. |
356 | else do | 356 | else do |
357 | hPutStrLn stderr "Unable to establish session..." | 357 | dput XNetCrypto "Unable to establish session..." |
358 | return [] | 358 | return [] |
359 | 359 | ||
360 | -- | Create a DHTPublicKey packet to send to a remote contact. | 360 | -- | Create a DHTPublicKey packet to send to a remote contact. |
@@ -387,12 +387,12 @@ addVerbosity tr = | |||
387 | tr { awaitMessage = \kont -> awaitMessage tr $ \m -> do | 387 | tr { awaitMessage = \kont -> awaitMessage tr $ \m -> do |
388 | forM_ m $ mapM_ $ \(msg,addr) -> do | 388 | forM_ m $ mapM_ $ \(msg,addr) -> do |
389 | when (not (B.null msg || elem (B.head msg) [0,1,2,4,0x81,0x82,0x8c,0x8d])) $ do | 389 | when (not (B.null msg || elem (B.head msg) [0,1,2,4,0x81,0x82,0x8c,0x8d])) $ do |
390 | mapM_ (\x -> hPutStrLn stderr ( (show addr) ++ " --> " ++ x)) | 390 | mapM_ (\x -> dput XMisc ( (show addr) ++ " --> " ++ x)) |
391 | $ xxd 0 msg | 391 | $ xxd 0 msg |
392 | kont m | 392 | kont m |
393 | , sendMessage = \addr msg -> do | 393 | , sendMessage = \addr msg -> do |
394 | when (not (B.null msg || elem (B.head msg) [0,1,2,4,0x81,0x8c,0x8d])) $ do | 394 | when (not (B.null msg || elem (B.head msg) [0,1,2,4,0x81,0x8c,0x8d])) $ do |
395 | mapM_ (\x -> hPutStrLn stderr ( (show addr) ++ " <-- " ++ x)) | 395 | mapM_ (\x -> dput XMisc ( (show addr) ++ " <-- " ++ x)) |
396 | $ xxd 0 msg | 396 | $ xxd 0 msg |
397 | sendMessage tr addr msg | 397 | sendMessage tr addr msg |
398 | } | 398 | } |
@@ -437,15 +437,15 @@ newTox keydb addr mbSessionsState suppliedDHTKey = do | |||
437 | -- patch in newly allocated roster state. | 437 | -- patch in newly allocated roster state. |
438 | crypto = crypto1 { userKeys = myKeyPairs roster } | 438 | crypto = crypto1 { userKeys = myKeyPairs roster } |
439 | forM_ suppliedDHTKey $ \k -> do | 439 | forM_ suppliedDHTKey $ \k -> do |
440 | maybe (hPutStrLn stderr "failed to encode suppliedDHTKey") | 440 | maybe (dput XMisc "failed to encode suppliedDHTKey") |
441 | (C8.hPutStrLn stderr . C8.append "Using suppliedDHTKey: ") | 441 | (dputB XMisc . C8.append "Using suppliedDHTKey: ") |
442 | $ encodeSecret k | 442 | $ encodeSecret k |
443 | 443 | ||
444 | drg <- drgNew | 444 | drg <- drgNew |
445 | let lookupClose _ = return Nothing | 445 | let lookupClose _ = return Nothing |
446 | 446 | ||
447 | mkrouting <- DHT.newRouting addr crypto updateIP updateIP | 447 | mkrouting <- DHT.newRouting addr crypto updateIP updateIP |
448 | let ignoreErrors _ = return () -- Set this to (hPutStrLn stderr) to debug onion route building. | 448 | let ignoreErrors _ = return () -- Set this to (dput XMisc) to debug onion route building. |
449 | orouter <- newOnionRouter ignoreErrors | 449 | orouter <- newOnionRouter ignoreErrors |
450 | (cryptonet,dhtcrypt,onioncrypt,dtacrypt,handshakes) <- toxTransport crypto orouter lookupClose udp | 450 | (cryptonet,dhtcrypt,onioncrypt,dtacrypt,handshakes) <- toxTransport crypto orouter lookupClose udp |
451 | 451 | ||
@@ -493,8 +493,8 @@ newTox keydb addr mbSessionsState suppliedDHTKey = do | |||
493 | { toxDHT = dhtclient | 493 | { toxDHT = dhtclient |
494 | , toxOnion = onionclient | 494 | , toxOnion = onionclient |
495 | , toxToRoute = onInbound (updateContactInfo roster) dtacrypt | 495 | , toxToRoute = onInbound (updateContactInfo roster) dtacrypt |
496 | , toxCrypto = addHandler (hPutStrLn stderr) (sessionPacketH sessionsState) cryptonet | 496 | , toxCrypto = addHandler (dput XMisc) (sessionPacketH sessionsState) cryptonet |
497 | , toxHandshakes = addHandler (hPutStrLn stderr) (handshakeH sessionsState) handshakes | 497 | , toxHandshakes = addHandler (dput XMisc) (handshakeH sessionsState) handshakes |
498 | , toxCryptoSessions = sessionsState | 498 | , toxCryptoSessions = sessionsState |
499 | , toxCryptoKeys = crypto | 499 | , toxCryptoKeys = crypto |
500 | , toxRouting = mkrouting dhtclient | 500 | , toxRouting = mkrouting dhtclient |
diff --git a/src/Network/Tox/ContactInfo.hs b/src/Network/Tox/ContactInfo.hs index 64ea861b..5135813a 100644 --- a/src/Network/Tox/ContactInfo.hs +++ b/src/Network/Tox/ContactInfo.hs | |||
@@ -18,6 +18,7 @@ import Network.Tox.DHT.Transport as DHT | |||
18 | import Network.Tox.NodeId (id2key) | 18 | import Network.Tox.NodeId (id2key) |
19 | import Network.Tox.Onion.Transport as Onion | 19 | import Network.Tox.Onion.Transport as Onion |
20 | import System.IO | 20 | import System.IO |
21 | import DPut | ||
21 | 22 | ||
22 | newtype ContactInfo extra = ContactInfo | 23 | newtype ContactInfo extra = ContactInfo |
23 | -- | Map our toxid public key to an Account record. | 24 | -- | Map our toxid public key to an Account record. |
@@ -55,7 +56,7 @@ myKeyPairs (ContactInfo accounts) = do | |||
55 | 56 | ||
56 | updateContactInfo :: ContactInfo extra -> Onion.AnnouncedRendezvous -> (PublicKey,Onion.OnionData) -> IO () | 57 | updateContactInfo :: ContactInfo extra -> Onion.AnnouncedRendezvous -> (PublicKey,Onion.OnionData) -> IO () |
57 | updateContactInfo roster Onion.AnnouncedRendezvous{remoteUserKey} (localUserKey,omsg) = do | 58 | updateContactInfo roster Onion.AnnouncedRendezvous{remoteUserKey} (localUserKey,omsg) = do |
58 | hPutStrLn stderr "updateContactInfo!!!" | 59 | dput XMisc "updateContactInfo!!!" |
59 | now <- getPOSIXTime | 60 | now <- getPOSIXTime |
60 | atomically $ do | 61 | atomically $ do |
61 | as <- readTVar (accounts roster) | 62 | as <- readTVar (accounts roster) |
diff --git a/src/Network/Tox/DHT/Handlers.hs b/src/Network/Tox/DHT/Handlers.hs index 43169fa0..58a29c3e 100644 --- a/src/Network/Tox/DHT/Handlers.hs +++ b/src/Network/Tox/DHT/Handlers.hs | |||
@@ -404,9 +404,9 @@ unwrapNodes (SendNodes ns) = (ns,ns,Just ()) | |||
404 | 404 | ||
405 | getNodes :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> NodeInfo -> IO (Maybe ([NodeInfo],[NodeInfo],Maybe ())) | 405 | getNodes :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> NodeInfo -> IO (Maybe ([NodeInfo],[NodeInfo],Maybe ())) |
406 | getNodes client cbvar nid addr = do | 406 | getNodes client cbvar nid addr = do |
407 | -- hPutStrLn stderr $ show addr ++ " <-- getnodes " ++ show nid | 407 | -- dput XMisc $ show addr ++ " <-- getnodes " ++ show nid |
408 | reply <- QR.sendQuery client (serializer GetNodesType DHTGetNodes unsendNodes) (GetNodes nid) addr | 408 | reply <- QR.sendQuery client (serializer GetNodesType DHTGetNodes unsendNodes) (GetNodes nid) addr |
409 | -- hPutStrLn stderr $ show addr ++ " -sendnodes-> " ++ show reply | 409 | -- dput XMisc $ show addr ++ " -sendnodes-> " ++ show reply |
410 | forM_ (join reply) $ \(SendNodes ns) -> | 410 | forM_ (join reply) $ \(SendNodes ns) -> |
411 | forM_ ns $ \n -> do | 411 | forM_ ns $ \n -> do |
412 | now <- getPOSIXTime | 412 | now <- getPOSIXTime |
@@ -430,13 +430,13 @@ updateRouting client routing orouter naddr msg | |||
430 | case prefer4or6 naddr Nothing of | 430 | case prefer4or6 naddr Nothing of |
431 | Want_IP4 -> updateTable client naddr orouter (committee4 routing) (refresher4 routing) | 431 | Want_IP4 -> updateTable client naddr orouter (committee4 routing) (refresher4 routing) |
432 | Want_IP6 -> updateTable client naddr orouter (committee6 routing) (refresher6 routing) | 432 | Want_IP6 -> updateTable client naddr orouter (committee6 routing) (refresher6 routing) |
433 | Want_Both -> do hPutStrLn stderr "BUG:unreachable" | 433 | Want_Both -> do dput XMisc "BUG:unreachable" |
434 | error $ "BUG:unreachable at " ++ __FILE__ ++ ":" ++ show __LINE__ | 434 | error $ "BUG:unreachable at " ++ __FILE__ ++ ":" ++ show __LINE__ |
435 | 435 | ||
436 | updateTable :: Client -> NodeInfo -> OnionRouter -> TriadCommittee NodeId SockAddr -> BucketRefresher NodeId NodeInfo -> IO () | 436 | updateTable :: Client -> NodeInfo -> OnionRouter -> TriadCommittee NodeId SockAddr -> BucketRefresher NodeId NodeInfo -> IO () |
437 | updateTable client naddr orouter committee refresher = do | 437 | updateTable client naddr orouter committee refresher = do |
438 | self <- atomically $ R.thisNode <$> readTVar (refreshBuckets refresher) | 438 | self <- atomically $ R.thisNode <$> readTVar (refreshBuckets refresher) |
439 | -- hPutStrLn stderr $ "(tox)updateRouting: " ++ show (nodeIP self, nodeIP naddr) | 439 | -- dput XMisc $ "(tox)updateRouting: " ++ show (nodeIP self, nodeIP naddr) |
440 | when (self /= naddr) $ do | 440 | when (self /= naddr) $ do |
441 | -- TODO: IP address vote? | 441 | -- TODO: IP address vote? |
442 | insertNode (toxKademlia client committee orouter refresher) naddr | 442 | insertNode (toxKademlia client committee orouter refresher) naddr |
@@ -455,7 +455,7 @@ toxKademlia client committee orouter refresher | |||
455 | return $ do | 455 | return $ do |
456 | io1 >> io2 | 456 | io1 >> io2 |
457 | {- | 457 | {- |
458 | hPutStrLn stderr $ unwords | 458 | dput XMisc $ unwords |
459 | [ show (transitionedTo tr) | 459 | [ show (transitionedTo tr) |
460 | , show (transitioningNode tr) | 460 | , show (transitioningNode tr) |
461 | ] | 461 | ] |
@@ -467,7 +467,7 @@ transitionCommittee :: TriadCommittee NodeId SockAddr -> RoutingTransition NodeI | |||
467 | transitionCommittee committee (RoutingTransition ni Stranger) = do | 467 | transitionCommittee committee (RoutingTransition ni Stranger) = do |
468 | delVote committee (nodeId ni) | 468 | delVote committee (nodeId ni) |
469 | return $ do | 469 | return $ do |
470 | -- hPutStrLn stderr $ "delVote "++show (nodeId ni) | 470 | -- dput XMisc $ "delVote "++show (nodeId ni) |
471 | return () | 471 | return () |
472 | transitionCommittee committee _ = return $ return () | 472 | transitionCommittee committee _ = return $ return () |
473 | 473 | ||
@@ -500,7 +500,7 @@ isDHTRequest _ _ = Left "Bad dht relay request" | |||
500 | 500 | ||
501 | dhtRequestH :: NodeInfo -> DHTRequest -> IO () | 501 | dhtRequestH :: NodeInfo -> DHTRequest -> IO () |
502 | dhtRequestH ni req = do | 502 | dhtRequestH ni req = do |
503 | hPutStrLn stderr $ "Unhandled DHT Request: " ++ show req | 503 | dput XMisc $ "Unhandled DHT Request: " ++ show req |
504 | 504 | ||
505 | handlers :: TransportCrypto -> Routing -> PacketKind -> Maybe Handler | 505 | handlers :: TransportCrypto -> Routing -> PacketKind -> Maybe Handler |
506 | handlers _ routing PingType = Just $ MethodHandler (isPing snd) mkPong $ pingH | 506 | handlers _ routing PingType = Just $ MethodHandler (isPing snd) mkPong $ pingH |
diff --git a/src/Network/Tox/Onion/Transport.hs b/src/Network/Tox/Onion/Transport.hs index 8a66f2b2..70714465 100644 --- a/src/Network/Tox/Onion/Transport.hs +++ b/src/Network/Tox/Onion/Transport.hs | |||
@@ -246,7 +246,7 @@ encodeOnionAddr crypto _ (msg,OnionToOwner ni p) = | |||
246 | , nodeAddr ni ) | 246 | , nodeAddr ni ) |
247 | encodeOnionAddr crypto getRoute (msg,OnionDestination x ni Nothing) = do | 247 | encodeOnionAddr crypto getRoute (msg,OnionDestination x ni Nothing) = do |
248 | encodeOnionAddr crypto getRoute (msg,OnionDestination x ni (Just $ routeId $ nodeId ni) ) | 248 | encodeOnionAddr crypto getRoute (msg,OnionDestination x ni (Just $ routeId $ nodeId ni) ) |
249 | -- hPutStrLn stderr $ "ONION encode missing routeid" | 249 | -- dput XMisc $ "ONION encode missing routeid" |
250 | -- return Nothing | 250 | -- return Nothing |
251 | encodeOnionAddr crypto getRoute (msg,OnionDestination _ ni (Just rid)) = do | 251 | encodeOnionAddr crypto getRoute (msg,OnionDestination _ ni (Just rid)) = do |
252 | let go route = do | 252 | let go route = do |
@@ -255,8 +255,8 @@ encodeOnionAddr crypto getRoute (msg,OnionDestination _ ni (Just rid)) = do | |||
255 | , nodeAddr $ routeNodeA route) | 255 | , nodeAddr $ routeNodeA route) |
256 | mapM' f x = do | 256 | mapM' f x = do |
257 | let _ = x :: Maybe OnionRoute | 257 | let _ = x :: Maybe OnionRoute |
258 | -- hPutStrLn stderr $ "ONION encode sending to " ++ show ni | 258 | -- dput XMisc $ "ONION encode sending to " ++ show ni |
259 | -- hPutStrLn stderr $ "ONION encode getRoute -> " ++ show (fmap (\y -> map ($ y) [routeNodeA,routeNodeB,routeNodeC]) x) | 259 | -- dput XMisc $ "ONION encode getRoute -> " ++ show (fmap (\y -> map ($ y) [routeNodeA,routeNodeB,routeNodeC]) x) |
260 | mapM f x -- ONION encode getRoute -> Nothing | 260 | mapM f x -- ONION encode getRoute -> Nothing |
261 | getRoute ni rid >>= mapM' go | 261 | getRoute ni rid >>= mapM' go |
262 | 262 | ||
@@ -525,7 +525,7 @@ handleOnionResponse proxy crypto saddr udp kont (OnionResponse path msg) = do | |||
525 | Left e -> do | 525 | Left e -> do |
526 | -- todo report encryption error | 526 | -- todo report encryption error |
527 | let n = peanoVal path | 527 | let n = peanoVal path |
528 | hPutStrLn stderr $ unwords [ "peelSymmetric:", show n, either show show (either4or6 saddr), e] | 528 | dput XMisc $ unwords [ "peelSymmetric:", show n, either show show (either4or6 saddr), e] |
529 | kont | 529 | kont |
530 | Right (Addressed dst path') -> do | 530 | Right (Addressed dst path') -> do |
531 | sendMessage udp dst (runPut $ putResponse $ OnionResponse path' msg) | 531 | sendMessage udp dst (runPut $ putResponse $ OnionResponse path' msg) |
@@ -897,9 +897,9 @@ parseDataToRoute crypto (OnionToRouteResponse dta, od) = do | |||
897 | r = either (const $ Right (OnionToRouteResponse dta,od)) Left e | 897 | r = either (const $ Right (OnionToRouteResponse dta,od)) Left e |
898 | -- parseDataToRoute OnionToRouteResponse decipherAndAuth: auth fail | 898 | -- parseDataToRoute OnionToRouteResponse decipherAndAuth: auth fail |
899 | case e of | 899 | case e of |
900 | Left _ -> hPutStrLn stderr $ "Failed keys: " ++ show (map (key2id . snd) ks) | 900 | Left _ -> dput XMisc $ "Failed keys: " ++ show (map (key2id . snd) ks) |
901 | Right _ -> return () | 901 | Right _ -> return () |
902 | hPutStrLn stderr $ unlines | 902 | dput XMisc $ unlines |
903 | [ "parseDataToRoute " ++ either id (const "Right") e | 903 | [ "parseDataToRoute " ++ either id (const "Right") e |
904 | , " crypto inner.me = " ++ either id (\(pk,_,_) -> show $ key2id pk) eInner | 904 | , " crypto inner.me = " ++ either id (\(pk,_,_) -> show $ key2id pk) eInner |
905 | , " inner.them = " ++ either id (show . key2id . dataFromKey) eOuter | 905 | , " inner.them = " ++ either id (show . key2id . dataFromKey) eOuter |
diff --git a/src/Network/UPNP.hs b/src/Network/UPNP.hs index ed6b4777..f053369f 100644 --- a/src/Network/UPNP.hs +++ b/src/Network/UPNP.hs | |||
@@ -6,6 +6,7 @@ import Network.Socket | |||
6 | import System.Directory | 6 | import System.Directory |
7 | import System.IO | 7 | import System.IO |
8 | import System.Process as Process | 8 | import System.Process as Process |
9 | import DPut | ||
9 | 10 | ||
10 | protocols :: SocketType -> [String] | 11 | protocols :: SocketType -> [String] |
11 | protocols Stream = ["tcp"] | 12 | protocols Stream = ["tcp"] |
@@ -35,5 +36,5 @@ requestPorts description binds = do | |||
35 | phandle <- spawnProcess upnpc $ "-e": description : "-r" : requests | 36 | phandle <- spawnProcess upnpc $ "-e": description : "-r" : requests |
36 | return $ Just phandle | 37 | return $ Just phandle |
37 | else do | 38 | else do |
38 | hPutStrLn stderr $ "Warning: unable to find miniupnpc client at "++upnpc++"." | 39 | dput XMisc $ "Warning: unable to find miniupnpc client at "++upnpc++"." |
39 | bail | 40 | bail |