From 735fa5c892700efb78c7a9205b719f064ce429a6 Mon Sep 17 00:00:00 2001 From: joe Date: Sun, 27 May 2018 01:40:05 -0400 Subject: WIP: "lan" command to announce this Tox node on the lan. --- src/Network/QueryResponse.hs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/Network/QueryResponse.hs') diff --git a/src/Network/QueryResponse.hs b/src/Network/QueryResponse.hs index 0345dd88..4f65b886 100644 --- a/src/Network/QueryResponse.hs +++ b/src/Network/QueryResponse.hs @@ -519,14 +519,19 @@ saferSendTo sock bs saddr = void (B.sendTo sock bs saddr) -- low-level 'Transport' that can be transformed for higher-level protocols -- using 'layerTransport'. udpTransport :: SockAddr -> IO (Transport err SockAddr ByteString) -udpTransport bind_address = do +udpTransport bind_address = fst <$> udpTransport' bind_address + +-- | Like 'udpTransport' except also returns the raw socket (for broadcast use). +udpTransport' :: SockAddr -> IO (Transport err SockAddr ByteString, Socket) +udpTransport' bind_address = do let family = sockAddrFamily bind_address sock <- socket family Datagram defaultProtocol when (family == AF_INET6) $ do setSocketOption sock IPv6Only 0 + setSocketOption sock Broadcast 1 bind sock bind_address - return Transport - { awaitMessage = \kont -> do + let tr = Transport { + awaitMessage = \kont -> do r <- handle (ignoreEOF $ Just $ Right (B.empty, SockAddrInet 0 0)) $ do Just . Right <$!> B.recvFrom sock udpBufferSize kont $! r @@ -547,3 +552,4 @@ udpTransport bind_address = do _ -> \addr bs -> saferSendTo sock bs addr , closeTransport = close sock } + return (tr, sock) -- cgit v1.2.3