summaryrefslogtreecommitdiffhomepage
path: root/Network/DNS
diff options
context:
space:
mode:
authorGravatar Kazu Yamamoto <kazu@iij.ad.jp>2010-03-17 22:25:49 +0900
committerGravatar Kazu Yamamoto <kazu@iij.ad.jp>2010-03-17 22:25:49 +0900
commit825e27472ab361f9fdb46146c44cd56a571ed947 (patch)
treef1bb569356a69887e6e229c9601dee7a2709c2f4 /Network/DNS
parent8923a95ae272bb6565962803d533f26a52b6463c (diff)
adding API
Diffstat (limited to 'Network/DNS')
-rw-r--r--Network/DNS/Internal.hs30
-rw-r--r--Network/DNS/Response.hs14
-rw-r--r--Network/DNS/Types.hs2
3 files changed, 33 insertions, 13 deletions
diff --git a/Network/DNS/Internal.hs b/Network/DNS/Internal.hs
index ac6b8ba..f29ed3e 100644
--- a/Network/DNS/Internal.hs
+++ b/Network/DNS/Internal.hs
@@ -1,20 +1,23 @@
module Network.DNS.Internal where
-import Data.Maybe
+import Data.Char
import Data.IP
+import Data.Maybe
----------------------------------------------------------------
-data TYPE = A | AAAA | NS | TXT | MX | CNAME | UNKNOWN deriving (Eq, Show, Read)
+data TYPE = A | AAAA | NS | TXT | MX | CNAME | SOA
+ | UNKNOWN Int deriving (Eq, Show, Read)
rrDB :: [(TYPE, Int)]
rrDB = [
- (A, 1)
- , (NS, 2)
- , (CNAME, 5)
- , (MX, 15)
- , (TXT, 16)
- , (AAAA, 28)
+ (A, 1)
+ , (NS, 2)
+ , (CNAME, 5)
+ , (SOA, 6)
+ , (MX, 15)
+ , (TXT, 16)
+ , (AAAA, 28)
]
rookup :: (Eq b) => b -> [(a,b)] -> Maybe a
@@ -24,10 +27,14 @@ rookup key ((x,y):xys)
| otherwise = rookup key xys
intToType :: Int -> TYPE
-intToType n = maybe UNKNOWN id $ rookup n rrDB
+intToType n = maybe (UNKNOWN n) id $ rookup n rrDB
typeToInt :: TYPE -> Int
+typeToInt (UNKNOWN x) = x
typeToInt t = maybe 0 id $ lookup t rrDB
+toType :: String -> TYPE
+toType = read . map toUpper
+
----------------------------------------------------------------
data QorR = QR_Query | QR_Response deriving (Eq, Show)
@@ -60,15 +67,18 @@ data ResourceRecord = ResourceRecord {
, rdata :: RDATA
} deriving (Eq, Show)
-data RDATA = RD_NS Domain | RD_CNAME Domain
+data RDATA = RD_NS Domain | RD_CNAME Domain | RD_MX Int Domain
+ | RD_SOA Domain Domain Int Int Int Int Int
| RD_A IPv4 | RD_AAAA IPv6
| RD_OTH [Int] deriving (Eq)
instance Show RDATA where
show (RD_NS dom) = dom
+ show (RD_MX prf dom) = dom ++ " " ++ show prf
show (RD_CNAME dom) = dom
show (RD_A a) = show a
show (RD_AAAA aaaa) = show aaaa
+ show (RD_SOA mn _ _ _ _ _ mi) = mn ++ " " ++ show mi
show (RD_OTH is) = show is
----------------------------------------------------------------
diff --git a/Network/DNS/Response.hs b/Network/DNS/Response.hs
index 1ef8973..fa4cdf4 100644
--- a/Network/DNS/Response.hs
+++ b/Network/DNS/Response.hs
@@ -92,14 +92,24 @@ decodeRR = do
decodeRLen = getInt16
decodeRData :: TYPE -> Int -> SGet RDATA
-decodeRData NS _ = RD_NS <$> decodeDomain
+decodeRData NS _ = RD_NS <$> decodeDomain
+decodeRData MX _ = RD_MX <$> decodePreference <*> decodeDomain
+ where
+ decodePreference = getInt16
+decodeRData CNAME _ = RD_CNAME <$> decodeDomain
decodeRData A len = (RD_A . toIPv4) <$> getNBytes len
decodeRData AAAA len = (RD_AAAA . toIPv6 . combine) <$> getNBytes len
where
combine [] = []
combine [_] = error "combine"
combine (a:b:cs) = a * 256 + b : combine cs
-decodeRData CNAME _ = RD_CNAME <$> decodeDomain
+decodeRData SOA _ = RD_SOA <$> decodeDomain
+ <*> decodeDomain
+ <*> getInt32
+ <*> getInt32
+ <*> getInt32
+ <*> getInt32
+ <*> getInt32
decodeRData _ len = RD_OTH <$> getNBytes len
----------------------------------------------------------------
diff --git a/Network/DNS/Types.hs b/Network/DNS/Types.hs
index fe1f1be..906fc08 100644
--- a/Network/DNS/Types.hs
+++ b/Network/DNS/Types.hs
@@ -1,5 +1,5 @@
module Network.DNS.Types (
- TYPE (..), intToType, typeToInt
+ TYPE (..), intToType, typeToInt, toType
, QorR (..)
, OPCODE (..)
, RCODE (..)