import Network.DNS.Message import Network.DNS.Named import Network.DNS.Named.Config import Network.DNS.Named.Responder import Network.DNS.Named.Zone import Network.Socket import System.IO.Unsafe main :: IO () main = runNamed cnf zoneFor where cnf :: Config cnf = Config { cnfServerAddress = SockAddrInet 9090 iNADDR_ANY } zoneFor :: DomainName -> Maybe Zone zoneFor name | name `isInZone` zone = Just zone | otherwise = Nothing zone :: Zone zone = Zone { zoneName = mkDN "cielonegro.org." , zoneResponders = [ wrapResponder responderA ] , zoneIsAuthoritative = True } responderA :: Responder A IN () responderA = do name <- getQueryName if name == mkDN "ns.cielonegro.org." then respond ResourceRecord { rrName = name , rrType = A , rrClass = IN , rrTTL = 9600 , rrData = inetAddr "127.0.0.1" } else fail "FIXME: we want to throw NameError but we can't for now" inetAddr :: String -> HostAddress inetAddr = unsafePerformIO . inet_addr