]> gitweb @ CieloNegro.org - haskell-dns.git/blobdiff - Network/DNS/Named.hs
The server now accepts IPv6 connections.
[haskell-dns.git] / Network / DNS / Named.hs
index 4a9eaed2fa26eda15576a94673deead4c5d42a82..3d0a6dc7841096ca1803fac1bb0a5c4ef32d6273 100644 (file)
@@ -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