]> gitweb @ CieloNegro.org - haskell-dns.git/commitdiff
The server now accepts IPv6 connections.
authorPHO <pho@cielonegro.org>
Thu, 28 May 2009 03:06:34 +0000 (12:06 +0900)
committerPHO <pho@cielonegro.org>
Thu, 28 May 2009 03:06:34 +0000 (12:06 +0900)
ExampleDNSServer.hs
Network/DNS/Named.hs
Network/DNS/Named/Config.hs

index 9fb8ee6e7ca3765a23b23e173483c2de1ee0a0fc..428f261856dd892fa8d8a2862996239eb8b91f9d 100644 (file)
@@ -10,7 +10,7 @@ main = runNamed cnf (return . findZone)
     where
       cnf :: Config
       cnf = Config {
-              cnfServerAddress = SockAddrInet 9090 iNADDR_ANY
+              cnfServerPort    = "9090"
             , cnfAllowTransfer = True
             }
 
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
index 4985897bd86de3f1ebb86d21ae7c346909f91e41..febd5ba81208e57d2512ded051fc4644b32f612c 100644 (file)
@@ -9,13 +9,13 @@ import           Network.Socket
 
 data Config
     = Config {
-        cnfServerAddress :: !SockAddr
+        cnfServerPort    :: !ServiceName
       , cnfAllowTransfer :: !Bool
       }
     deriving Show
 
 defaultConfig :: Config
 defaultConfig = Config {
-                  cnfServerAddress = SockAddrInet 53 iNADDR_ANY
+                  cnfServerPort    = "domain"
                 , cnfAllowTransfer = False
                 }