X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=haskell-dns.git;a=blobdiff_plain;f=Network%2FDNS%2FNamed.hs;fp=Network%2FDNS%2FNamed.hs;h=3d0a6dc7841096ca1803fac1bb0a5c4ef32d6273;hp=4a9eaed2fa26eda15576a94673deead4c5d42a82;hb=826401d22c87d6c5d77ad4f427d28d6b97a9d12f;hpb=248b1c63284bbe00550bf2402ee6a9da6997143e diff --git a/Network/DNS/Named.hs b/Network/DNS/Named.hs index 4a9eaed..3d0a6dc 100644 --- a/Network/DNS/Named.hs +++ b/Network/DNS/Named.hs @@ -27,14 +27,23 @@ runNamed :: Config -> (DomainName -> IO (Maybe Zone)) -> IO () runNamed cnf findZone = withSocketsDo $ do installHandler sigPIPE Ignore Nothing - _tcpListenerTID <- forkIO $ tcpListen - udpListen + + let hint = defaultHints { + addrFlags = [AI_PASSIVE, AI_V4MAPPED] + , addrFamily = AF_INET6 + , addrSocketType = NoSocketType + , addrProtocol = defaultProtocol + } + (ai:_) <- getAddrInfo (Just hint) Nothing (Just $ cnfServerPort cnf) + + _tcpListenerTID <- forkIO $ tcpListen ai + udpListen ai where - udpListen :: IO () - udpListen = do -- FIXME: we should support IPv6 when the network package supports it. - so <- socket AF_INET Datagram defaultProtocol - bindSocket so $ cnfServerAddress cnf - udpLoop so + udpListen :: AddrInfo -> IO () + udpListen ai + = do so <- socket (addrFamily ai) Datagram defaultProtocol + bindSocket so (addrAddress ai) + udpLoop so udpLoop :: Socket -> IO () udpLoop so @@ -42,11 +51,12 @@ runNamed cnf findZone _handlerTID <- forkIO $ udpHandler so packet cameFrom udpLoop so - tcpListen :: IO () - tcpListen = do so <- socket AF_INET Stream defaultProtocol - bindSocket so $ cnfServerAddress cnf - listen so 255 - tcpLoop so + tcpListen :: AddrInfo -> IO () + tcpListen ai + = do so <- socket (addrFamily ai) Stream defaultProtocol + bindSocket so (addrAddress ai) + listen so 255 + tcpLoop so tcpLoop :: Socket -> IO () tcpLoop so