From 8923a95ae272bb6565962803d533f26a52b6463c Mon Sep 17 00:00:00 2001 From: Kazu Yamamoto Date: Wed, 17 Mar 2010 18:05:25 +0900 Subject: supporting CNAME --- Network/DNS/Internal.hs | 14 ++++++++++++-- Network/DNS/Response.hs | 3 ++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Network/DNS/Internal.hs b/Network/DNS/Internal.hs index ceedb2b..ac6b8ba 100644 --- a/Network/DNS/Internal.hs +++ b/Network/DNS/Internal.hs @@ -5,12 +5,13 @@ import Data.IP ---------------------------------------------------------------- -data TYPE = A | AAAA | NS | TXT | MX | UNKNOWN deriving (Eq, Show, Read) +data TYPE = A | AAAA | NS | TXT | MX | CNAME | UNKNOWN deriving (Eq, Show, Read) rrDB :: [(TYPE, Int)] rrDB = [ (A, 1) , (NS, 2) + , (CNAME, 5) , (MX, 15) , (TXT, 16) , (AAAA, 28) @@ -59,7 +60,16 @@ data ResourceRecord = ResourceRecord { , rdata :: RDATA } deriving (Eq, Show) -data RDATA = RD_NS Domain | RD_A IPv4 | RD_AAAA IPv6 | RD_OTH [Int] deriving (Eq, Show) +data RDATA = RD_NS Domain | RD_CNAME Domain + | RD_A IPv4 | RD_AAAA IPv6 + | RD_OTH [Int] deriving (Eq) + +instance Show RDATA where + show (RD_NS dom) = dom + show (RD_CNAME dom) = dom + show (RD_A a) = show a + show (RD_AAAA aaaa) = show aaaa + show (RD_OTH is) = show is ---------------------------------------------------------------- diff --git a/Network/DNS/Response.hs b/Network/DNS/Response.hs index d3a7a22..1ef8973 100644 --- a/Network/DNS/Response.hs +++ b/Network/DNS/Response.hs @@ -99,6 +99,7 @@ decodeRData AAAA len = (RD_AAAA . toIPv6 . combine) <$> getNBytes len combine [] = [] combine [_] = error "combine" combine (a:b:cs) = a * 256 + b : combine cs +decodeRData CNAME _ = RD_CNAME <$> decodeDomain decodeRData _ len = RD_OTH <$> getNBytes len ---------------------------------------------------------------- @@ -115,7 +116,7 @@ decodeDomain = do then do d <- getInt8 let offset = n * 256 + d - maybe (error "decodeDomain") id <$> pop offset + maybe (error $ "decodeDomain: " ++ show offset) id <$> pop offset else do hs <- decodeString n ds <- decodeDomain -- cgit v1.2.3