- -> do allRecords <- zoneResponder zone name
-
- let filtered = filterRecords (SomeQ q') allRecords
- q' = Question {
- qName = name
- , qType = A
- , qClass = IN
- }
- return filtered
-
- filterRecords :: SomeQ -> [SomeRR] -> [SomeRR]
- filterRecords (SomeQ q)
- | Just (qType q) == cast ANY &&
- Just (qClass q) == cast ANY = id
- | Just (qType q) == cast ANY = filter matchClass
- | Just (qClass q) == cast ANY = filter matchType
- | otherwise = filter matchBoth
- where
- matchClass (SomeRR rr)
- = Just (qClass q) == cast (rrClass rr)
-
- matchType (SomeRR rr)
- = Just (qType q) == cast (rrType rr) ||
- Just CNAME == cast (rrType rr)
-
- matchBoth rr
- = matchType rr && matchClass rr
-
- handleAXFR :: SomeQ -> Zone -> IO (Builder ())
- handleAXFR (SomeQ q) zone
- | qName q == zoneName zone &&
- isJust (zoneSOA zone) &&
- cnfAllowTransfer cnf
- = do names <- zoneRecordNames zone
- allRecords <- liftM concat $ mapM (zoneResponder zone) names
- return $ do addAnswer $ fromJust $ zoneSOARecord zone
- addAnswer $ fromJust $ zoneNSRecord zone
- mapM_ addAnswer allRecords
- addAnswerNonuniquely $ fromJust $ zoneSOARecord zone
+ -> do rrA <- getRecords zone (Question name A IN)
+ rrAAAA <- getRecords zone (Question name AAAA IN)
+ return (rrA ++ rrAAAA)
+
+ handleAXFR :: (Zone z, QueryType qt, QueryClass qc) => Question qt qc -> z -> IO (Builder ())
+ handleAXFR q zone
+ | cnfAllowTransfer cnf
+ = do rs <- getRecords zone q
+ return $ mapM_ addAnswerNonuniquely rs