]> gitweb @ CieloNegro.org - haskell-dns.git/blob - ExampleDNSServer.hs
The server started somewhat working...
[haskell-dns.git] / ExampleDNSServer.hs
1 import           Network.DNS.Message
2 import           Network.DNS.Named
3 import           Network.DNS.Named.Config
4 import           Network.DNS.Named.Responder
5 import           Network.DNS.Named.Zone
6 import           Network.Socket
7 import           System.IO.Unsafe
8
9 main :: IO ()
10 main = runNamed cnf zoneFor
11     where
12       cnf :: Config
13       cnf = Config {
14               cnfServerAddress = SockAddrInet 9090 iNADDR_ANY
15             }
16
17       zoneFor :: DomainName -> Maybe Zone
18       zoneFor name
19           | name `isInZone` zone = Just zone
20           | otherwise            = Nothing
21
22       zone :: Zone
23       zone = Zone {
24                zoneName       = mkDN "cielonegro.org."
25              , zoneResponders = [ wrapResponder' $
26                                   do name <- getQueryName
27                                      if name == mkDN "ns.cielonegro.org." then
28                                          respond ResourceRecord {
29                                                        rrName  = name
30                                                      , rrType  = A
31                                                      , rrClass = IN
32                                                      , rrTTL   = 9600
33                                                      , rrData  = inetAddr "127.0.0.1"
34                                                      }
35                                        else
36                                          fail "FIXME: we want to throw NameError but we can't for now"
37                                 ]
38              , zoneIsAuthoritative = True
39              }
40
41       wrapResponder' :: Responder A IN () -> SomeResponder
42       wrapResponder' = wrapResponder
43
44
45 inetAddr :: String -> HostAddress
46 inetAddr = unsafePerformIO . inet_addr