summaryrefslogtreecommitdiffhomepage
path: root/Network/DNS/Types.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Network/DNS/Types.hs')
-rw-r--r--Network/DNS/Types.hs92
1 files changed, 92 insertions, 0 deletions
diff --git a/Network/DNS/Types.hs b/Network/DNS/Types.hs
new file mode 100644
index 0000000..aa32431
--- /dev/null
+++ b/Network/DNS/Types.hs
@@ -0,0 +1,92 @@
+module Network.DNS.Types where
+
+import Data.Maybe
+import Data.IP
+
+data TYPE = A | AAAA | NS | TXT | MX | UNKNOWN deriving (Eq, Show)
+
+rrDB :: [(TYPE, Int)]
+rrDB = [
+ (A, 1)
+ , (NS, 2)
+ , (MX, 15)
+ , (TXT, 16)
+ , (AAAA, 28)
+ ]
+
+rookup :: (Eq b) => b -> [(a,b)] -> Maybe a
+rookup _ [] = Nothing
+rookup key ((x,y):xys)
+ | key == y = Just x
+ | otherwise = rookup key xys
+
+intToType :: Int -> TYPE
+intToType n = maybe UNKNOWN id $ rookup n rrDB
+typeToInt :: TYPE -> Int
+typeToInt t = maybe 0 id $ lookup t rrDB
+
+data QorR = QR_Query | QR_Response deriving (Eq, Show)
+
+data OPCODE = OP_STD | OP_INV | OP_SSR deriving (Eq, Show, Enum)
+
+data RCODE = NoErr | FormatErr | ServFail | NameErr | NotImpl | Refused deriving (Eq, Show, Enum)
+
+type Domain = String
+
+data Question = Question {
+ qname :: Domain
+ , qtype :: TYPE
+ } deriving (Eq, Show)
+
+data ResourceRecord = ResourceRecord {
+ rrname :: Domain
+ , rrtype :: TYPE
+ , rrttl :: Int
+ , rdlen :: Int
+ , rdata :: RDATA
+ } deriving (Eq, Show)
+
+data RDATA = RD_NS Domain | RD_A IPv4 | RD_AAAA IPv6 | RD_OTH [Int] deriving (Eq, Show)
+
+data DNSFlags = DNSFlags {
+ qOrR :: QorR
+ , opcode :: OPCODE
+ , authAnswer :: Bool
+ , trunCation :: Bool
+ , recDesired :: Bool
+ , recAvailable :: Bool
+ , rcode :: RCODE
+ } deriving (Eq, Show)
+
+data DNSHeader = DNSHeader {
+ identifier :: Int
+ , flags :: DNSFlags
+ , qdCount :: Int
+ , anCount :: Int
+ , nsCount :: Int
+ , arCount :: Int
+ } deriving (Eq, Show)
+
+data DNSFormat = DNSFormat {
+ header :: DNSHeader
+ , question :: [Question]
+ , answer :: [ResourceRecord]
+ , authority :: [ResourceRecord]
+ , additional :: [ResourceRecord]
+ } deriving (Eq, Show)
+
+defaultQuery :: DNSFormat
+defaultQuery = DNSFormat {
+ header = DNSHeader {
+ identifier = 0
+ , flags = undefined
+ , qdCount = 0
+ , anCount = 0
+ , nsCount = 0
+ , arCount = 0
+ }
+ , question = []
+ , answer = []
+ , authority = []
+ , additional = []
+ }