diff options
Diffstat (limited to 'Network/DNS/Types.hs')
-rw-r--r-- | Network/DNS/Types.hs | 92 |
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 = [] + } |