{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE CPP #-}
module Network.DNS.Types.Internal where
import Control.Exception (Exception, IOException)
import qualified Data.ByteString as B
import qualified Data.ByteString.Base16 as B16
import qualified Data.ByteString.Base64 as B64
import qualified Data.ByteString.Char8 as BS
import Data.CaseInsensitive (CI)
import qualified Data.CaseInsensitive as CI
import Data.Char (intToDigit)
import qualified Data.Hourglass as H
import Data.IP (IP(..), IPv4, IPv6)
import qualified Data.Semigroup as Sem
import qualified Network.DNS.Base32Hex as B32
import Network.DNS.Imports
type Domain = ByteString
type Mailbox = ByteString
newtype TYPE = TYPE {
TYPE -> Word16
fromTYPE :: Word16
} deriving (TYPE -> TYPE -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TYPE -> TYPE -> Bool
$c/= :: TYPE -> TYPE -> Bool
== :: TYPE -> TYPE -> Bool
$c== :: TYPE -> TYPE -> Bool
Eq, Eq TYPE
TYPE -> TYPE -> Bool
TYPE -> TYPE -> Ordering
TYPE -> TYPE -> TYPE
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: TYPE -> TYPE -> TYPE
$cmin :: TYPE -> TYPE -> TYPE
max :: TYPE -> TYPE -> TYPE
$cmax :: TYPE -> TYPE -> TYPE
>= :: TYPE -> TYPE -> Bool
$c>= :: TYPE -> TYPE -> Bool
> :: TYPE -> TYPE -> Bool
$c> :: TYPE -> TYPE -> Bool
<= :: TYPE -> TYPE -> Bool
$c<= :: TYPE -> TYPE -> Bool
< :: TYPE -> TYPE -> Bool
$c< :: TYPE -> TYPE -> Bool
compare :: TYPE -> TYPE -> Ordering
$ccompare :: TYPE -> TYPE -> Ordering
Ord)
pattern A :: TYPE
pattern $bA :: TYPE
$mA :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
A = TYPE 1
pattern NS :: TYPE
pattern $bNS :: TYPE
$mNS :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
NS = TYPE 2
pattern CNAME :: TYPE
pattern $bCNAME :: TYPE
$mCNAME :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
CNAME = TYPE 5
pattern SOA :: TYPE
pattern $bSOA :: TYPE
$mSOA :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
SOA = TYPE 6
pattern NULL :: TYPE
pattern $bNULL :: TYPE
$mNULL :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
NULL = TYPE 10
pattern PTR :: TYPE
pattern $bPTR :: TYPE
$mPTR :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
PTR = TYPE 12
pattern MX :: TYPE
pattern $bMX :: TYPE
$mMX :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
MX = TYPE 15
pattern TXT :: TYPE
pattern $bTXT :: TYPE
$mTXT :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
TXT = TYPE 16
pattern RP :: TYPE
pattern $bRP :: TYPE
$mRP :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
RP = TYPE 17
pattern AAAA :: TYPE
pattern $bAAAA :: TYPE
$mAAAA :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
AAAA = TYPE 28
pattern SRV :: TYPE
pattern $bSRV :: TYPE
$mSRV :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
SRV = TYPE 33
pattern DNAME :: TYPE
pattern $bDNAME :: TYPE
$mDNAME :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
DNAME = TYPE 39
pattern OPT :: TYPE
pattern $bOPT :: TYPE
$mOPT :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
OPT = TYPE 41
pattern DS :: TYPE
pattern $bDS :: TYPE
$mDS :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
DS = TYPE 43
pattern RRSIG :: TYPE
pattern $bRRSIG :: TYPE
$mRRSIG :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
RRSIG = TYPE 46
pattern NSEC :: TYPE
pattern $bNSEC :: TYPE
$mNSEC :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
NSEC = TYPE 47
pattern DNSKEY :: TYPE
pattern $bDNSKEY :: TYPE
$mDNSKEY :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
DNSKEY = TYPE 48
pattern NSEC3 :: TYPE
pattern $bNSEC3 :: TYPE
$mNSEC3 :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
NSEC3 = TYPE 50
pattern NSEC3PARAM :: TYPE
pattern $bNSEC3PARAM :: TYPE
$mNSEC3PARAM :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
NSEC3PARAM = TYPE 51
pattern TLSA :: TYPE
pattern $bTLSA :: TYPE
$mTLSA :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
TLSA = TYPE 52
pattern CDS :: TYPE
pattern $bCDS :: TYPE
$mCDS :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
CDS = TYPE 59
pattern CDNSKEY :: TYPE
pattern $bCDNSKEY :: TYPE
$mCDNSKEY :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
CDNSKEY = TYPE 60
pattern CSYNC :: TYPE
pattern $bCSYNC :: TYPE
$mCSYNC :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
CSYNC = TYPE 62
pattern AXFR :: TYPE
pattern $bAXFR :: TYPE
$mAXFR :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
AXFR = TYPE 252
pattern ANY :: TYPE
pattern $bANY :: TYPE
$mANY :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
ANY = TYPE 255
pattern CAA :: TYPE
pattern $bCAA :: TYPE
$mCAA :: forall {r}. TYPE -> ((# #) -> r) -> ((# #) -> r) -> r
CAA = TYPE 257
toTYPE :: Word16 -> TYPE
toTYPE :: Word16 -> TYPE
toTYPE = Word16 -> TYPE
TYPE
instance Show TYPE where
show :: TYPE -> [Char]
show TYPE
A = [Char]
"A"
show TYPE
NS = [Char]
"NS"
show TYPE
CNAME = [Char]
"CNAME"
show TYPE
SOA = [Char]
"SOA"
show TYPE
NULL = [Char]
"NULL"
show TYPE
PTR = [Char]
"PTR"
show TYPE
MX = [Char]
"MX"
show TYPE
TXT = [Char]
"TXT"
show TYPE
RP = [Char]
"RP"
show TYPE
AAAA = [Char]
"AAAA"
show TYPE
SRV = [Char]
"SRV"
show TYPE
DNAME = [Char]
"DNAME"
show TYPE
OPT = [Char]
"OPT"
show TYPE
DS = [Char]
"DS"
show TYPE
RRSIG = [Char]
"RRSIG"
show TYPE
NSEC = [Char]
"NSEC"
show TYPE
DNSKEY = [Char]
"DNSKEY"
show TYPE
NSEC3 = [Char]
"NSEC3"
show TYPE
NSEC3PARAM = [Char]
"NSEC3PARAM"
show TYPE
TLSA = [Char]
"TLSA"
show TYPE
CDS = [Char]
"CDS"
show TYPE
CDNSKEY = [Char]
"CDNSKEY"
show TYPE
CSYNC = [Char]
"CSYNC"
show TYPE
AXFR = [Char]
"AXFR"
show TYPE
ANY = [Char]
"ANY"
show TYPE
CAA = [Char]
"CAA"
show TYPE
x = [Char]
"TYPE" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show (TYPE -> Word16
fromTYPE TYPE
x)
data DNSError =
SequenceNumberMismatch
| QuestionMismatch
| InvalidAXFRLookup
| RetryLimitExceeded
| TimeoutExpired
| UnexpectedRDATA
| IllegalDomain
| FormatError
| ServerFailure
| NameError
| NotImplemented
| OperationRefused
| BadOptRecord
| BadConfiguration
| NetworkFailure IOException
| DecodeError String
| UnknownDNSError
deriving (DNSError -> DNSError -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DNSError -> DNSError -> Bool
$c/= :: DNSError -> DNSError -> Bool
== :: DNSError -> DNSError -> Bool
$c== :: DNSError -> DNSError -> Bool
Eq, Int -> DNSError -> ShowS
[DNSError] -> ShowS
DNSError -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [DNSError] -> ShowS
$cshowList :: [DNSError] -> ShowS
show :: DNSError -> [Char]
$cshow :: DNSError -> [Char]
showsPrec :: Int -> DNSError -> ShowS
$cshowsPrec :: Int -> DNSError -> ShowS
Show, Typeable)
instance Exception DNSError
data = EDNS
| NoEDNS
| InvalidEDNS
deriving (EDNSheader -> EDNSheader -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EDNSheader -> EDNSheader -> Bool
$c/= :: EDNSheader -> EDNSheader -> Bool
== :: EDNSheader -> EDNSheader -> Bool
$c== :: EDNSheader -> EDNSheader -> Bool
Eq, Int -> EDNSheader -> ShowS
[EDNSheader] -> ShowS
EDNSheader -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [EDNSheader] -> ShowS
$cshowList :: [EDNSheader] -> ShowS
show :: EDNSheader -> [Char]
$cshow :: EDNSheader -> [Char]
showsPrec :: Int -> EDNSheader -> ShowS
$cshowsPrec :: Int -> EDNSheader -> ShowS
Show)
ifEDNS :: EDNSheader
-> a
-> a
-> a
ifEDNS :: forall a. EDNSheader -> a -> a -> a
ifEDNS (EDNSheader EDNS
_) a
a a
_ = a
a
ifEDNS EDNSheader
_ a
_ a
b = a
b
{-# INLINE ifEDNS #-}
mapEDNS :: EDNSheader
-> (EDNS -> a)
-> a
-> a
mapEDNS :: forall a. EDNSheader -> (EDNS -> a) -> a -> a
mapEDNS (EDNSheader EDNS
eh) EDNS -> a
f a
_ = EDNS -> a
f EDNS
eh
mapEDNS EDNSheader
_ EDNS -> a
_ a
a = a
a
{-# INLINE mapEDNS #-}
data DNSMessage = DNSMessage {
:: !DNSHeader
, :: EDNSheader
, DNSMessage -> [Question]
question :: [Question]
, DNSMessage -> Answers
answer :: Answers
, DNSMessage -> Answers
authority :: AuthorityRecords
, DNSMessage -> Answers
additional :: AdditionalRecords
} deriving (DNSMessage -> DNSMessage -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DNSMessage -> DNSMessage -> Bool
$c/= :: DNSMessage -> DNSMessage -> Bool
== :: DNSMessage -> DNSMessage -> Bool
$c== :: DNSMessage -> DNSMessage -> Bool
Eq, Int -> DNSMessage -> ShowS
[DNSMessage] -> ShowS
DNSMessage -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [DNSMessage] -> ShowS
$cshowList :: [DNSMessage] -> ShowS
show :: DNSMessage -> [Char]
$cshow :: DNSMessage -> [Char]
showsPrec :: Int -> DNSMessage -> ShowS
$cshowsPrec :: Int -> DNSMessage -> ShowS
Show)
type Identifier = Word16
data = {
DNSHeader -> Word16
identifier :: !Identifier
, DNSHeader -> DNSFlags
flags :: !DNSFlags
} deriving (DNSHeader -> DNSHeader -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DNSHeader -> DNSHeader -> Bool
$c/= :: DNSHeader -> DNSHeader -> Bool
== :: DNSHeader -> DNSHeader -> Bool
$c== :: DNSHeader -> DNSHeader -> Bool
Eq, Int -> DNSHeader -> ShowS
[DNSHeader] -> ShowS
DNSHeader -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [DNSHeader] -> ShowS
$cshowList :: [DNSHeader] -> ShowS
show :: DNSHeader -> [Char]
$cshow :: DNSHeader -> [Char]
showsPrec :: Int -> DNSHeader -> ShowS
$cshowsPrec :: Int -> DNSHeader -> ShowS
Show)
data DNSFlags = DNSFlags {
DNSFlags -> QorR
qOrR :: !QorR
, DNSFlags -> OPCODE
opcode :: !OPCODE
, DNSFlags -> Bool
authAnswer :: !Bool
, DNSFlags -> Bool
trunCation :: !Bool
, DNSFlags -> Bool
recDesired :: !Bool
, DNSFlags -> Bool
recAvailable :: !Bool
, DNSFlags -> RCODE
rcode :: !RCODE
, DNSFlags -> Bool
authenData :: !Bool
, DNSFlags -> Bool
chkDisable :: !Bool
} deriving (DNSFlags -> DNSFlags -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DNSFlags -> DNSFlags -> Bool
$c/= :: DNSFlags -> DNSFlags -> Bool
== :: DNSFlags -> DNSFlags -> Bool
$c== :: DNSFlags -> DNSFlags -> Bool
Eq, Int -> DNSFlags -> ShowS
[DNSFlags] -> ShowS
DNSFlags -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [DNSFlags] -> ShowS
$cshowList :: [DNSFlags] -> ShowS
show :: DNSFlags -> [Char]
$cshow :: DNSFlags -> [Char]
showsPrec :: Int -> DNSFlags -> ShowS
$cshowsPrec :: Int -> DNSFlags -> ShowS
Show)
defaultDNSFlags :: DNSFlags
defaultDNSFlags :: DNSFlags
defaultDNSFlags = DNSFlags
{ qOrR :: QorR
qOrR = QorR
QR_Query
, opcode :: OPCODE
opcode = OPCODE
OP_STD
, authAnswer :: Bool
authAnswer = Bool
False
, trunCation :: Bool
trunCation = Bool
False
, recDesired :: Bool
recDesired = Bool
True
, recAvailable :: Bool
recAvailable = Bool
False
, authenData :: Bool
authenData = Bool
False
, chkDisable :: Bool
chkDisable = Bool
False
, rcode :: RCODE
rcode = RCODE
NoErr
}
data FlagOp = FlagSet
| FlagClear
| FlagReset
| FlagKeep
deriving (FlagOp -> FlagOp -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FlagOp -> FlagOp -> Bool
$c/= :: FlagOp -> FlagOp -> Bool
== :: FlagOp -> FlagOp -> Bool
$c== :: FlagOp -> FlagOp -> Bool
Eq, Int -> FlagOp -> ShowS
[FlagOp] -> ShowS
FlagOp -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [FlagOp] -> ShowS
$cshowList :: [FlagOp] -> ShowS
show :: FlagOp -> [Char]
$cshow :: FlagOp -> [Char]
showsPrec :: Int -> FlagOp -> ShowS
$cshowsPrec :: Int -> FlagOp -> ShowS
Show)
instance Sem.Semigroup FlagOp where
FlagOp
FlagKeep <> :: FlagOp -> FlagOp -> FlagOp
<> FlagOp
op = FlagOp
op
FlagOp
op <> FlagOp
_ = FlagOp
op
instance Monoid FlagOp where
mempty :: FlagOp
mempty = FlagOp
FlagKeep
#if !(MIN_VERSION_base(4,11,0))
mappend = (Sem.<>)
#endif
_skipDefault :: String
_skipDefault :: [Char]
_skipDefault = [Char]
""
_showFlag :: String -> FlagOp -> String
_showFlag :: [Char] -> FlagOp -> [Char]
_showFlag [Char]
nm FlagOp
FlagSet = [Char]
nm forall a. [a] -> [a] -> [a]
++ [Char]
":1"
_showFlag [Char]
nm FlagOp
FlagClear = [Char]
nm forall a. [a] -> [a] -> [a]
++ [Char]
":0"
_showFlag [Char]
_ FlagOp
FlagReset = [Char]
_skipDefault
_showFlag [Char]
_ FlagOp
FlagKeep = [Char]
_skipDefault
_showOpts :: [String] -> String
_showOpts :: [[Char]] -> [Char]
_showOpts [[Char]]
os = forall a. [a] -> [[a]] -> [a]
intercalate [Char]
"," forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
filter (forall a. Eq a => a -> a -> Bool
/= [Char]
_skipDefault) [[Char]]
os
data =
{ HeaderControls -> FlagOp
rdBit :: !FlagOp
, HeaderControls -> FlagOp
adBit :: !FlagOp
, HeaderControls -> FlagOp
cdBit :: !FlagOp
}
deriving (HeaderControls -> HeaderControls -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HeaderControls -> HeaderControls -> Bool
$c/= :: HeaderControls -> HeaderControls -> Bool
== :: HeaderControls -> HeaderControls -> Bool
$c== :: HeaderControls -> HeaderControls -> Bool
Eq)
instance Sem.Semigroup HeaderControls where
(HeaderControls FlagOp
rd1 FlagOp
ad1 FlagOp
cd1) <> :: HeaderControls -> HeaderControls -> HeaderControls
<> (HeaderControls FlagOp
rd2 FlagOp
ad2 FlagOp
cd2) =
FlagOp -> FlagOp -> FlagOp -> HeaderControls
HeaderControls (FlagOp
rd1 forall a. Semigroup a => a -> a -> a
<> FlagOp
rd2) (FlagOp
ad1 forall a. Semigroup a => a -> a -> a
<> FlagOp
ad2) (FlagOp
cd1 forall a. Semigroup a => a -> a -> a
<> FlagOp
cd2)
instance Monoid HeaderControls where
mempty :: HeaderControls
mempty = FlagOp -> FlagOp -> FlagOp -> HeaderControls
HeaderControls FlagOp
FlagKeep FlagOp
FlagKeep FlagOp
FlagKeep
#if !(MIN_VERSION_base(4,11,0))
mappend = (Sem.<>)
#endif
instance Show HeaderControls where
show :: HeaderControls -> [Char]
show (HeaderControls FlagOp
rd FlagOp
ad FlagOp
cd) =
[[Char]] -> [Char]
_showOpts
[ [Char] -> FlagOp -> [Char]
_showFlag [Char]
"rd" FlagOp
rd
, [Char] -> FlagOp -> [Char]
_showFlag [Char]
"ad" FlagOp
ad
, [Char] -> FlagOp -> [Char]
_showFlag [Char]
"cd" FlagOp
cd ]
data ODataOp = ODataAdd [OData]
| ODataSet [OData]
deriving (ODataOp -> ODataOp -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ODataOp -> ODataOp -> Bool
$c/= :: ODataOp -> ODataOp -> Bool
== :: ODataOp -> ODataOp -> Bool
$c== :: ODataOp -> ODataOp -> Bool
Eq)
_odataDedup :: ODataOp -> [OData]
_odataDedup :: ODataOp -> [OData]
_odataDedup ODataOp
op =
forall a. (a -> a -> Bool) -> [a] -> [a]
nubBy (forall a. Eq a => a -> a -> Bool
(==) forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` OData -> OptCode
_odataToOptCode) forall a b. (a -> b) -> a -> b
$
case ODataOp
op of
ODataAdd [OData]
os -> [OData]
os
ODataSet [OData]
os -> [OData]
os
instance Sem.Semigroup ODataOp where
ODataAdd [OData]
as <> :: ODataOp -> ODataOp -> ODataOp
<> ODataAdd [OData]
bs = [OData] -> ODataOp
ODataAdd forall a b. (a -> b) -> a -> b
$ [OData]
as forall a. [a] -> [a] -> [a]
++ [OData]
bs
ODataAdd [OData]
as <> ODataSet [OData]
bs = [OData] -> ODataOp
ODataSet forall a b. (a -> b) -> a -> b
$ [OData]
as forall a. [a] -> [a] -> [a]
++ [OData]
bs
ODataSet [OData]
as <> ODataOp
_ = [OData] -> ODataOp
ODataSet [OData]
as
instance Monoid ODataOp where
mempty :: ODataOp
mempty = [OData] -> ODataOp
ODataAdd []
#if !(MIN_VERSION_base(4,11,0))
mappend = (Sem.<>)
#endif
data EdnsControls = EdnsControls
{ EdnsControls -> FlagOp
extEn :: !FlagOp
, EdnsControls -> Maybe Word8
extVn :: !(Maybe Word8)
, EdnsControls -> Maybe Word16
extSz :: !(Maybe Word16)
, EdnsControls -> FlagOp
extDO :: !FlagOp
, EdnsControls -> ODataOp
extOd :: !ODataOp
}
deriving (EdnsControls -> EdnsControls -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EdnsControls -> EdnsControls -> Bool
$c/= :: EdnsControls -> EdnsControls -> Bool
== :: EdnsControls -> EdnsControls -> Bool
$c== :: EdnsControls -> EdnsControls -> Bool
Eq)
instance Sem.Semigroup EdnsControls where
(EdnsControls FlagOp
en1 Maybe Word8
vn1 Maybe Word16
sz1 FlagOp
do1 ODataOp
od1) <> :: EdnsControls -> EdnsControls -> EdnsControls
<> (EdnsControls FlagOp
en2 Maybe Word8
vn2 Maybe Word16
sz2 FlagOp
do2 ODataOp
od2) =
FlagOp
-> Maybe Word8 -> Maybe Word16 -> FlagOp -> ODataOp -> EdnsControls
EdnsControls (FlagOp
en1 forall a. Semigroup a => a -> a -> a
<> FlagOp
en2) (Maybe Word8
vn1 forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Word8
vn2) (Maybe Word16
sz1 forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Word16
sz2)
(FlagOp
do1 forall a. Semigroup a => a -> a -> a
<> FlagOp
do2) (ODataOp
od1 forall a. Semigroup a => a -> a -> a
<> ODataOp
od2)
instance Monoid EdnsControls where
mempty :: EdnsControls
mempty = FlagOp
-> Maybe Word8 -> Maybe Word16 -> FlagOp -> ODataOp -> EdnsControls
EdnsControls FlagOp
FlagKeep forall a. Maybe a
Nothing forall a. Maybe a
Nothing FlagOp
FlagKeep forall a. Monoid a => a
mempty
#if !(MIN_VERSION_base(4,11,0))
mappend = (Sem.<>)
#endif
instance Show EdnsControls where
show :: EdnsControls -> [Char]
show (EdnsControls FlagOp
en Maybe Word8
vn Maybe Word16
sz FlagOp
d0 ODataOp
od) =
[[Char]] -> [Char]
_showOpts
[ [Char] -> FlagOp -> [Char]
_showFlag [Char]
"edns.enabled" FlagOp
en
, forall a. Show a => [Char] -> Maybe a -> [Char]
_showWord [Char]
"edns.version" Maybe Word8
vn
, forall a. Show a => [Char] -> Maybe a -> [Char]
_showWord [Char]
"edns.udpsize" Maybe Word16
sz
, [Char] -> FlagOp -> [Char]
_showFlag [Char]
"edns.dobit" FlagOp
d0
, [Char] -> [[Char]] -> [Char]
_showOdOp [Char]
"edns.options" forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a. Show a => a -> [Char]
showforall b c a. (b -> c) -> (a -> b) -> a -> c
. OData -> OptCode
_odataToOptCode)
forall a b. (a -> b) -> a -> b
$ ODataOp -> [OData]
_odataDedup ODataOp
od ]
where
_showWord :: Show a => String -> Maybe a -> String
_showWord :: forall a. Show a => [Char] -> Maybe a -> [Char]
_showWord [Char]
nm Maybe a
w = forall b a. b -> (a -> b) -> Maybe a -> b
maybe [Char]
_skipDefault (\a
s -> [Char]
nm forall a. [a] -> [a] -> [a]
++ [Char]
":" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
s) Maybe a
w
_showOdOp :: String -> [String] -> String
_showOdOp :: [Char] -> [[Char]] -> [Char]
_showOdOp [Char]
nm [[Char]]
os = case [[Char]]
os of
[] -> [Char]
""
[[Char]]
_ -> [Char]
nm forall a. [a] -> [a] -> [a]
++ [Char]
":[" forall a. [a] -> [a] -> [a]
++ forall a. [a] -> [[a]] -> [a]
intercalate [Char]
"," [[Char]]
os forall a. [a] -> [a] -> [a]
++ [Char]
"]"
data QueryControls = QueryControls
{ :: !HeaderControls
, QueryControls -> EdnsControls
qctlEdns :: !EdnsControls
}
deriving (QueryControls -> QueryControls -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: QueryControls -> QueryControls -> Bool
$c/= :: QueryControls -> QueryControls -> Bool
== :: QueryControls -> QueryControls -> Bool
$c== :: QueryControls -> QueryControls -> Bool
Eq)
instance Sem.Semigroup QueryControls where
(QueryControls HeaderControls
fl1 EdnsControls
ex1) <> :: QueryControls -> QueryControls -> QueryControls
<> (QueryControls HeaderControls
fl2 EdnsControls
ex2) =
HeaderControls -> EdnsControls -> QueryControls
QueryControls (HeaderControls
fl1 forall a. Semigroup a => a -> a -> a
<> HeaderControls
fl2) (EdnsControls
ex1 forall a. Semigroup a => a -> a -> a
<> EdnsControls
ex2)
instance Monoid QueryControls where
mempty :: QueryControls
mempty = HeaderControls -> EdnsControls -> QueryControls
QueryControls forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty
#if !(MIN_VERSION_base(4,11,0))
mappend = (Sem.<>)
#endif
instance Show QueryControls where
show :: QueryControls -> [Char]
show (QueryControls HeaderControls
fl EdnsControls
ex) = [[Char]] -> [Char]
_showOpts [ forall a. Show a => a -> [Char]
show HeaderControls
fl, forall a. Show a => a -> [Char]
show EdnsControls
ex ]
rdFlag :: FlagOp -> QueryControls
rdFlag :: FlagOp -> QueryControls
rdFlag FlagOp
rd = forall a. Monoid a => a
mempty { qctlHeader :: HeaderControls
qctlHeader = forall a. Monoid a => a
mempty { rdBit :: FlagOp
rdBit = FlagOp
rd } }
adFlag :: FlagOp -> QueryControls
adFlag :: FlagOp -> QueryControls
adFlag FlagOp
ad = forall a. Monoid a => a
mempty { qctlHeader :: HeaderControls
qctlHeader = forall a. Monoid a => a
mempty { adBit :: FlagOp
adBit = FlagOp
ad } }
cdFlag :: FlagOp -> QueryControls
cdFlag :: FlagOp -> QueryControls
cdFlag FlagOp
cd = forall a. Monoid a => a
mempty { qctlHeader :: HeaderControls
qctlHeader = forall a. Monoid a => a
mempty { cdBit :: FlagOp
cdBit = FlagOp
cd } }
ednsEnabled :: FlagOp -> QueryControls
ednsEnabled :: FlagOp -> QueryControls
ednsEnabled FlagOp
en = forall a. Monoid a => a
mempty { qctlEdns :: EdnsControls
qctlEdns = forall a. Monoid a => a
mempty { extEn :: FlagOp
extEn = FlagOp
en } }
ednsSetVersion :: Maybe Word8 -> QueryControls
ednsSetVersion :: Maybe Word8 -> QueryControls
ednsSetVersion Maybe Word8
vn = forall a. Monoid a => a
mempty { qctlEdns :: EdnsControls
qctlEdns = forall a. Monoid a => a
mempty { extVn :: Maybe Word8
extVn = Maybe Word8
vn } }
ednsSetUdpSize :: Maybe Word16 -> QueryControls
ednsSetUdpSize :: Maybe Word16 -> QueryControls
ednsSetUdpSize Maybe Word16
sz = forall a. Monoid a => a
mempty { qctlEdns :: EdnsControls
qctlEdns = forall a. Monoid a => a
mempty { extSz :: Maybe Word16
extSz = Maybe Word16
sz } }
doFlag :: FlagOp -> QueryControls
doFlag :: FlagOp -> QueryControls
doFlag FlagOp
d0 = forall a. Monoid a => a
mempty { qctlEdns :: EdnsControls
qctlEdns = forall a. Monoid a => a
mempty { extDO :: FlagOp
extDO = FlagOp
d0 } }
ednsSetOptions :: ODataOp -> QueryControls
ednsSetOptions :: ODataOp -> QueryControls
ednsSetOptions ODataOp
od = forall a. Monoid a => a
mempty { qctlEdns :: EdnsControls
qctlEdns = forall a. Monoid a => a
mempty { extOd :: ODataOp
extOd = ODataOp
od } }
data QorR = QR_Query
| QR_Response
deriving (QorR -> QorR -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: QorR -> QorR -> Bool
$c/= :: QorR -> QorR -> Bool
== :: QorR -> QorR -> Bool
$c== :: QorR -> QorR -> Bool
Eq, Int -> QorR -> ShowS
[QorR] -> ShowS
QorR -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [QorR] -> ShowS
$cshowList :: [QorR] -> ShowS
show :: QorR -> [Char]
$cshow :: QorR -> [Char]
showsPrec :: Int -> QorR -> ShowS
$cshowsPrec :: Int -> QorR -> ShowS
Show, Int -> QorR
QorR -> Int
QorR -> [QorR]
QorR -> QorR
QorR -> QorR -> [QorR]
QorR -> QorR -> QorR -> [QorR]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: QorR -> QorR -> QorR -> [QorR]
$cenumFromThenTo :: QorR -> QorR -> QorR -> [QorR]
enumFromTo :: QorR -> QorR -> [QorR]
$cenumFromTo :: QorR -> QorR -> [QorR]
enumFromThen :: QorR -> QorR -> [QorR]
$cenumFromThen :: QorR -> QorR -> [QorR]
enumFrom :: QorR -> [QorR]
$cenumFrom :: QorR -> [QorR]
fromEnum :: QorR -> Int
$cfromEnum :: QorR -> Int
toEnum :: Int -> QorR
$ctoEnum :: Int -> QorR
pred :: QorR -> QorR
$cpred :: QorR -> QorR
succ :: QorR -> QorR
$csucc :: QorR -> QorR
Enum, QorR
forall a. a -> a -> Bounded a
maxBound :: QorR
$cmaxBound :: QorR
minBound :: QorR
$cminBound :: QorR
Bounded)
data OPCODE
= OP_STD
| OP_INV
| OP_SSR
| OP_NOTIFY
| OP_UPDATE
deriving (OPCODE -> OPCODE -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OPCODE -> OPCODE -> Bool
$c/= :: OPCODE -> OPCODE -> Bool
== :: OPCODE -> OPCODE -> Bool
$c== :: OPCODE -> OPCODE -> Bool
Eq, Int -> OPCODE -> ShowS
[OPCODE] -> ShowS
OPCODE -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [OPCODE] -> ShowS
$cshowList :: [OPCODE] -> ShowS
show :: OPCODE -> [Char]
$cshow :: OPCODE -> [Char]
showsPrec :: Int -> OPCODE -> ShowS
$cshowsPrec :: Int -> OPCODE -> ShowS
Show, Int -> OPCODE
OPCODE -> Int
OPCODE -> [OPCODE]
OPCODE -> OPCODE
OPCODE -> OPCODE -> [OPCODE]
OPCODE -> OPCODE -> OPCODE -> [OPCODE]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: OPCODE -> OPCODE -> OPCODE -> [OPCODE]
$cenumFromThenTo :: OPCODE -> OPCODE -> OPCODE -> [OPCODE]
enumFromTo :: OPCODE -> OPCODE -> [OPCODE]
$cenumFromTo :: OPCODE -> OPCODE -> [OPCODE]
enumFromThen :: OPCODE -> OPCODE -> [OPCODE]
$cenumFromThen :: OPCODE -> OPCODE -> [OPCODE]
enumFrom :: OPCODE -> [OPCODE]
$cenumFrom :: OPCODE -> [OPCODE]
fromEnum :: OPCODE -> Int
$cfromEnum :: OPCODE -> Int
toEnum :: Int -> OPCODE
$ctoEnum :: Int -> OPCODE
pred :: OPCODE -> OPCODE
$cpred :: OPCODE -> OPCODE
succ :: OPCODE -> OPCODE
$csucc :: OPCODE -> OPCODE
Enum, OPCODE
forall a. a -> a -> Bounded a
maxBound :: OPCODE
$cmaxBound :: OPCODE
minBound :: OPCODE
$cminBound :: OPCODE
Bounded)
toOPCODE :: Word16 -> Maybe OPCODE
toOPCODE :: Word16 -> Maybe OPCODE
toOPCODE Word16
i = case Word16
i of
Word16
0 -> forall a. a -> Maybe a
Just OPCODE
OP_STD
Word16
1 -> forall a. a -> Maybe a
Just OPCODE
OP_INV
Word16
2 -> forall a. a -> Maybe a
Just OPCODE
OP_SSR
Word16
4 -> forall a. a -> Maybe a
Just OPCODE
OP_NOTIFY
Word16
5 -> forall a. a -> Maybe a
Just OPCODE
OP_UPDATE
Word16
_ -> forall a. Maybe a
Nothing
fromOPCODE :: OPCODE -> Word16
fromOPCODE :: OPCODE -> Word16
fromOPCODE OPCODE
OP_STD = Word16
0
fromOPCODE OPCODE
OP_INV = Word16
1
fromOPCODE OPCODE
OP_SSR = Word16
2
fromOPCODE OPCODE
OP_NOTIFY = Word16
4
fromOPCODE OPCODE
OP_UPDATE = Word16
5
newtype RCODE = RCODE {
RCODE -> Word16
fromRCODE :: Word16
} deriving (RCODE -> RCODE -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RCODE -> RCODE -> Bool
$c/= :: RCODE -> RCODE -> Bool
== :: RCODE -> RCODE -> Bool
$c== :: RCODE -> RCODE -> Bool
Eq)
instance Enum RCODE where
fromEnum :: RCODE -> Int
fromEnum = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. RCODE -> Word16
fromRCODE
toEnum :: Int -> RCODE
toEnum = Word16 -> RCODE
RCODE forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
pattern NoErr :: RCODE
pattern $bNoErr :: RCODE
$mNoErr :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
NoErr = RCODE 0
pattern FormatErr :: RCODE
pattern $bFormatErr :: RCODE
$mFormatErr :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
FormatErr = RCODE 1
pattern ServFail :: RCODE
pattern $bServFail :: RCODE
$mServFail :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
ServFail = RCODE 2
pattern NameErr :: RCODE
pattern $bNameErr :: RCODE
$mNameErr :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
NameErr = RCODE 3
pattern NotImpl :: RCODE
pattern $bNotImpl :: RCODE
$mNotImpl :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
NotImpl = RCODE 4
pattern Refused :: RCODE
pattern $bRefused :: RCODE
$mRefused :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
Refused = RCODE 5
pattern YXDomain :: RCODE
pattern $bYXDomain :: RCODE
$mYXDomain :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
YXDomain = RCODE 6
pattern YXRRSet :: RCODE
pattern $bYXRRSet :: RCODE
$mYXRRSet :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
YXRRSet = RCODE 7
pattern NXRRSet :: RCODE
pattern $bNXRRSet :: RCODE
$mNXRRSet :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
NXRRSet = RCODE 8
pattern NotAuth :: RCODE
pattern $bNotAuth :: RCODE
$mNotAuth :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
NotAuth = RCODE 9
pattern NotZone :: RCODE
pattern $bNotZone :: RCODE
$mNotZone :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
NotZone = RCODE 10
pattern BadVers :: RCODE
pattern $bBadVers :: RCODE
$mBadVers :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
BadVers = RCODE 16
pattern BadKey :: RCODE
pattern $bBadKey :: RCODE
$mBadKey :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
BadKey = RCODE 17
pattern BadTime :: RCODE
pattern $bBadTime :: RCODE
$mBadTime :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
BadTime = RCODE 18
pattern BadMode :: RCODE
pattern $bBadMode :: RCODE
$mBadMode :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
BadMode = RCODE 19
pattern BadName :: RCODE
pattern $bBadName :: RCODE
$mBadName :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
BadName = RCODE 20
pattern BadAlg :: RCODE
pattern $bBadAlg :: RCODE
$mBadAlg :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
BadAlg = RCODE 21
pattern BadTrunc :: RCODE
pattern $bBadTrunc :: RCODE
$mBadTrunc :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
BadTrunc = RCODE 22
pattern BadCookie :: RCODE
pattern $bBadCookie :: RCODE
$mBadCookie :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
BadCookie = RCODE 23
pattern BadRCODE :: RCODE
pattern $bBadRCODE :: RCODE
$mBadRCODE :: forall {r}. RCODE -> ((# #) -> r) -> ((# #) -> r) -> r
BadRCODE = RCODE 0x1001
instance Show RCODE where
show :: RCODE -> [Char]
show RCODE
NoErr = [Char]
"NoError"
show RCODE
FormatErr = [Char]
"FormErr"
show RCODE
ServFail = [Char]
"ServFail"
show RCODE
NameErr = [Char]
"NXDomain"
show RCODE
NotImpl = [Char]
"NotImp"
show RCODE
Refused = [Char]
"Refused"
show RCODE
YXDomain = [Char]
"YXDomain"
show RCODE
YXRRSet = [Char]
"YXRRSet"
show RCODE
NotAuth = [Char]
"NotAuth"
show RCODE
NotZone = [Char]
"NotZone"
show RCODE
BadVers = [Char]
"BadVers"
show RCODE
BadKey = [Char]
"BadKey"
show RCODE
BadTime = [Char]
"BadTime"
show RCODE
BadMode = [Char]
"BadMode"
show RCODE
BadName = [Char]
"BadName"
show RCODE
BadAlg = [Char]
"BadAlg"
show RCODE
BadTrunc = [Char]
"BadTrunc"
show RCODE
BadCookie = [Char]
"BadCookie"
show RCODE
x = [Char]
"RCODE " forall a. [a] -> [a] -> [a]
++ (forall a. Show a => a -> [Char]
show forall a b. (a -> b) -> a -> b
$ RCODE -> Word16
fromRCODE RCODE
x)
toRCODE :: Word16 -> RCODE
toRCODE :: Word16 -> RCODE
toRCODE = Word16 -> RCODE
RCODE
data Question = Question {
Question -> Domain
qname :: Domain
, Question -> TYPE
qtype :: TYPE
} deriving (Question -> Question -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Question -> Question -> Bool
$c/= :: Question -> Question -> Bool
== :: Question -> Question -> Bool
$c== :: Question -> Question -> Bool
Eq, Int -> Question -> ShowS
[Question] -> ShowS
Question -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Question] -> ShowS
$cshowList :: [Question] -> ShowS
show :: Question -> [Char]
$cshow :: Question -> [Char]
showsPrec :: Int -> Question -> ShowS
$cshowsPrec :: Int -> Question -> ShowS
Show)
type CLASS = Word16
classIN :: CLASS
classIN :: Word16
classIN = Word16
1
type TTL = Word32
data ResourceRecord = ResourceRecord {
ResourceRecord -> Domain
rrname :: !Domain
, ResourceRecord -> TYPE
rrtype :: !TYPE
, ResourceRecord -> Word16
rrclass :: !CLASS
, ResourceRecord -> Word32
rrttl :: !TTL
, ResourceRecord -> RData
rdata :: !RData
} deriving (ResourceRecord -> ResourceRecord -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ResourceRecord -> ResourceRecord -> Bool
$c/= :: ResourceRecord -> ResourceRecord -> Bool
== :: ResourceRecord -> ResourceRecord -> Bool
$c== :: ResourceRecord -> ResourceRecord -> Bool
Eq,Int -> ResourceRecord -> ShowS
Answers -> ShowS
ResourceRecord -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: Answers -> ShowS
$cshowList :: Answers -> ShowS
show :: ResourceRecord -> [Char]
$cshow :: ResourceRecord -> [Char]
showsPrec :: Int -> ResourceRecord -> ShowS
$cshowsPrec :: Int -> ResourceRecord -> ShowS
Show)
dnsTime :: Word32
-> Int64
-> Int64
dnsTime :: Word32 -> Int64 -> Int64
dnsTime Word32
tdns Int64
tnow =
let delta :: Word32
delta = Word32
tdns forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral Int64
tnow
in if Word32
delta forall a. Ord a => a -> a -> Bool
> Word32
0x7FFFFFFF
then Int64
tnow forall a. Num a => a -> a -> a
- (Int64
0x100000000 forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
delta)
else Int64
tnow forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
delta
data RD_RRSIG = RDREP_RRSIG
{ RD_RRSIG -> TYPE
rrsigType :: !TYPE
, RD_RRSIG -> Word8
rrsigKeyAlg :: !Word8
, RD_RRSIG -> Word8
rrsigNumLabels :: !Word8
, RD_RRSIG -> Word32
rrsigTTL :: !Word32
, RD_RRSIG -> Int64
rrsigExpiration :: !Int64
, RD_RRSIG -> Int64
rrsigInception :: !Int64
, RD_RRSIG -> Word16
rrsigKeyTag :: !Word16
, RD_RRSIG -> Domain
rrsigZone :: !Domain
, RD_RRSIG -> Domain
rrsigValue :: !ByteString
}
deriving (RD_RRSIG -> RD_RRSIG -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RD_RRSIG -> RD_RRSIG -> Bool
$c/= :: RD_RRSIG -> RD_RRSIG -> Bool
== :: RD_RRSIG -> RD_RRSIG -> Bool
$c== :: RD_RRSIG -> RD_RRSIG -> Bool
Eq, Eq RD_RRSIG
RD_RRSIG -> RD_RRSIG -> Bool
RD_RRSIG -> RD_RRSIG -> Ordering
RD_RRSIG -> RD_RRSIG -> RD_RRSIG
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: RD_RRSIG -> RD_RRSIG -> RD_RRSIG
$cmin :: RD_RRSIG -> RD_RRSIG -> RD_RRSIG
max :: RD_RRSIG -> RD_RRSIG -> RD_RRSIG
$cmax :: RD_RRSIG -> RD_RRSIG -> RD_RRSIG
>= :: RD_RRSIG -> RD_RRSIG -> Bool
$c>= :: RD_RRSIG -> RD_RRSIG -> Bool
> :: RD_RRSIG -> RD_RRSIG -> Bool
$c> :: RD_RRSIG -> RD_RRSIG -> Bool
<= :: RD_RRSIG -> RD_RRSIG -> Bool
$c<= :: RD_RRSIG -> RD_RRSIG -> Bool
< :: RD_RRSIG -> RD_RRSIG -> Bool
$c< :: RD_RRSIG -> RD_RRSIG -> Bool
compare :: RD_RRSIG -> RD_RRSIG -> Ordering
$ccompare :: RD_RRSIG -> RD_RRSIG -> Ordering
Ord)
instance Show RD_RRSIG where
show :: RD_RRSIG -> [Char]
show RDREP_RRSIG{Int64
Word8
Word16
Word32
Domain
TYPE
rrsigValue :: Domain
rrsigZone :: Domain
rrsigKeyTag :: Word16
rrsigInception :: Int64
rrsigExpiration :: Int64
rrsigTTL :: Word32
rrsigNumLabels :: Word8
rrsigKeyAlg :: Word8
rrsigType :: TYPE
rrsigValue :: RD_RRSIG -> Domain
rrsigZone :: RD_RRSIG -> Domain
rrsigKeyTag :: RD_RRSIG -> Word16
rrsigInception :: RD_RRSIG -> Int64
rrsigExpiration :: RD_RRSIG -> Int64
rrsigTTL :: RD_RRSIG -> Word32
rrsigNumLabels :: RD_RRSIG -> Word8
rrsigKeyAlg :: RD_RRSIG -> Word8
rrsigType :: RD_RRSIG -> TYPE
..} = [[Char]] -> [Char]
unwords
[ forall a. Show a => a -> [Char]
show TYPE
rrsigType
, forall a. Show a => a -> [Char]
show Word8
rrsigKeyAlg
, forall a. Show a => a -> [Char]
show Word8
rrsigNumLabels
, forall a. Show a => a -> [Char]
show Word32
rrsigTTL
, Int64 -> [Char]
showTime Int64
rrsigExpiration
, Int64 -> [Char]
showTime Int64
rrsigInception
, forall a. Show a => a -> [Char]
show Word16
rrsigKeyTag
, Domain -> [Char]
BS.unpack Domain
rrsigZone
, Domain -> [Char]
_b64encode Domain
rrsigValue
]
where
showTime :: Int64 -> String
showTime :: Int64 -> [Char]
showTime Int64
t = forall format t.
(TimeFormat format, Timeable t) =>
format -> t -> [Char]
H.timePrint [TimeFormatElem]
fmt forall a b. (a -> b) -> a -> b
$ Seconds -> Elapsed
H.Elapsed forall a b. (a -> b) -> a -> b
$ Int64 -> Seconds
H.Seconds Int64
t
where
fmt :: [TimeFormatElem]
fmt = [ TimeFormatElem
H.Format_Year4, TimeFormatElem
H.Format_Month2, TimeFormatElem
H.Format_Day2
, TimeFormatElem
H.Format_Hour, TimeFormatElem
H.Format_Minute, TimeFormatElem
H.Format_Second ]
data RData = RD_A IPv4
| RD_NS Domain
| RD_CNAME Domain
| RD_SOA Domain Mailbox Word32 Word32 Word32 Word32 Word32
| RD_NULL ByteString
| RD_PTR Domain
| RD_MX Word16 Domain
| RD_TXT ByteString
| RD_RP Mailbox Domain
| RD_AAAA IPv6
| RD_SRV Word16 Word16 Word16 Domain
| RD_DNAME Domain
| RD_OPT [OData]
| RD_DS Word16 Word8 Word8 ByteString
| RD_RRSIG RD_RRSIG
| RD_NSEC Domain [TYPE]
| RD_DNSKEY Word16 Word8 Word8 ByteString
| RD_NSEC3 Word8 Word8 Word16 ByteString ByteString [TYPE]
| RD_NSEC3PARAM Word8 Word8 Word16 ByteString
| RD_TLSA Word8 Word8 Word8 ByteString
| RD_CDS Word16 Word8 Word8 ByteString
| RD_CDNSKEY Word16 Word8 Word8 ByteString
| RD_CAA Word8 (CI ByteString) ByteString
| UnknownRData ByteString
deriving (RData -> RData -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RData -> RData -> Bool
$c/= :: RData -> RData -> Bool
== :: RData -> RData -> Bool
$c== :: RData -> RData -> Bool
Eq, Eq RData
RData -> RData -> Bool
RData -> RData -> Ordering
RData -> RData -> RData
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: RData -> RData -> RData
$cmin :: RData -> RData -> RData
max :: RData -> RData -> RData
$cmax :: RData -> RData -> RData
>= :: RData -> RData -> Bool
$c>= :: RData -> RData -> Bool
> :: RData -> RData -> Bool
$c> :: RData -> RData -> Bool
<= :: RData -> RData -> Bool
$c<= :: RData -> RData -> Bool
< :: RData -> RData -> Bool
$c< :: RData -> RData -> Bool
compare :: RData -> RData -> Ordering
$ccompare :: RData -> RData -> Ordering
Ord)
instance Show RData where
show :: RData -> [Char]
show RData
rd = case RData
rd of
RD_A IPv4
address -> forall a. Show a => a -> [Char]
show IPv4
address
RD_NS Domain
nsdname -> Domain -> [Char]
showDomain Domain
nsdname
RD_CNAME Domain
cname -> Domain -> [Char]
showDomain Domain
cname
RD_SOA Domain
a Domain
b Word32
c Word32
d Word32
e Word32
f Word32
g -> forall {a} {a} {a} {a} {a}.
(Show a, Show a, Show a, Show a, Show a) =>
Domain -> Domain -> a -> a -> a -> a -> a -> [Char]
showSOA Domain
a Domain
b Word32
c Word32
d Word32
e Word32
f Word32
g
RD_NULL Domain
bytes -> Domain -> [Char]
showOpaque Domain
bytes
RD_PTR Domain
ptrdname -> Domain -> [Char]
showDomain Domain
ptrdname
RD_MX Word16
pref Domain
exch -> forall {a}. Show a => a -> Domain -> [Char]
showMX Word16
pref Domain
exch
RD_TXT Domain
textstring -> Domain -> [Char]
showTXT Domain
textstring
RD_RP Domain
mbox Domain
dname -> Domain -> Domain -> [Char]
showRP Domain
mbox Domain
dname
RD_AAAA IPv6
address -> forall a. Show a => a -> [Char]
show IPv6
address
RD_SRV Word16
pri Word16
wei Word16
prt Domain
tgt -> forall {a} {a} {a}.
(Show a, Show a, Show a) =>
a -> a -> a -> Domain -> [Char]
showSRV Word16
pri Word16
wei Word16
prt Domain
tgt
RD_DNAME Domain
target -> Domain -> [Char]
showDomain Domain
target
RD_OPT [OData]
options -> forall a. Show a => a -> [Char]
show [OData]
options
RD_DS Word16
tag Word8
alg Word8
dalg Domain
d -> forall {a} {a} {a}.
(Show a, Show a, Show a) =>
a -> a -> a -> Domain -> [Char]
showDS Word16
tag Word8
alg Word8
dalg Domain
d
RD_RRSIG RD_RRSIG
rrsig -> forall a. Show a => a -> [Char]
show RD_RRSIG
rrsig
RD_NSEC Domain
next [TYPE]
types -> forall {a}. Show a => Domain -> [a] -> [Char]
showNSEC Domain
next [TYPE]
types
RD_DNSKEY Word16
f Word8
p Word8
a Domain
k -> forall {a} {a} {a}.
(Show a, Show a, Show a) =>
a -> a -> a -> Domain -> [Char]
showDNSKEY Word16
f Word8
p Word8
a Domain
k
RD_NSEC3 Word8
a Word8
f Word16
i Domain
s Domain
h [TYPE]
types -> forall {a} {a} {a} {a}.
(Show a, Show a, Show a, Show a) =>
a -> a -> a -> Domain -> Domain -> [a] -> [Char]
showNSEC3 Word8
a Word8
f Word16
i Domain
s Domain
h [TYPE]
types
RD_NSEC3PARAM Word8
a Word8
f Word16
i Domain
s -> forall {a} {a} {a}.
(Show a, Show a, Show a) =>
a -> a -> a -> Domain -> [Char]
showNSEC3PARAM Word8
a Word8
f Word16
i Domain
s
RD_TLSA Word8
u Word8
s Word8
m Domain
d -> forall {a} {a} {a}.
(Show a, Show a, Show a) =>
a -> a -> a -> Domain -> [Char]
showTLSA Word8
u Word8
s Word8
m Domain
d
RD_CDS Word16
tag Word8
alg Word8
dalg Domain
d -> forall {a} {a} {a}.
(Show a, Show a, Show a) =>
a -> a -> a -> Domain -> [Char]
showDS Word16
tag Word8
alg Word8
dalg Domain
d
RD_CDNSKEY Word16
f Word8
p Word8
a Domain
k -> forall {a} {a} {a}.
(Show a, Show a, Show a) =>
a -> a -> a -> Domain -> [Char]
showDNSKEY Word16
f Word8
p Word8
a Domain
k
RD_CAA Word8
f CI Domain
t Domain
v -> forall {a} {a}. (Show a, Show a) => a -> CI Domain -> a -> [Char]
showCAA Word8
f CI Domain
t Domain
v
UnknownRData Domain
bytes -> Domain -> [Char]
showOpaque Domain
bytes
where
showSalt :: Domain -> [Char]
showSalt Domain
"" = [Char]
"-"
showSalt Domain
salt = Domain -> [Char]
_b16encode Domain
salt
showDomain :: Domain -> [Char]
showDomain = Domain -> [Char]
BS.unpack
showSOA :: Domain -> Domain -> a -> a -> a -> a -> a -> [Char]
showSOA Domain
mname Domain
rname a
serial a
refresh a
retry a
expire a
minttl =
Domain -> [Char]
showDomain Domain
mname forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
showDomain Domain
rname forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++
forall a. Show a => a -> [Char]
show a
serial forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
refresh forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++
forall a. Show a => a -> [Char]
show a
retry forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
expire forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
minttl
showMX :: a -> Domain -> [Char]
showMX a
preference Domain
exchange =
forall a. Show a => a -> [Char]
show a
preference forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
showDomain Domain
exchange
showTXT :: Domain -> [Char]
showTXT Domain
bs = Char
'"' forall a. a -> [a] -> [a]
: forall a. (Word8 -> a -> a) -> a -> Domain -> a
B.foldr Word8 -> ShowS
dnsesc [Char
'"'] Domain
bs
where
c2w :: Char -> Word8
c2w = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Enum a => a -> Int
fromEnum
w2c :: Word8 -> Char
w2c = forall a. Enum a => Int -> a
toEnum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
doubleQuote :: Word8
doubleQuote = Char -> Word8
c2w Char
'"'
backSlash :: Word8
backSlash = Char -> Word8
c2w Char
'\\'
dnsesc :: Word8 -> ShowS
dnsesc Word8
c [Char]
s
| Word8
c forall a. Eq a => a -> a -> Bool
== Word8
doubleQuote = Char
'\\' forall a. a -> [a] -> [a]
: Word8 -> Char
w2c Word8
c forall a. a -> [a] -> [a]
: [Char]
s
| Word8
c forall a. Eq a => a -> a -> Bool
== Word8
backSlash = Char
'\\' forall a. a -> [a] -> [a]
: Word8 -> Char
w2c Word8
c forall a. a -> [a] -> [a]
: [Char]
s
| Word8
c forall a. Ord a => a -> a -> Bool
>= Word8
32 Bool -> Bool -> Bool
&& Word8
c forall a. Ord a => a -> a -> Bool
< Word8
127 = Word8 -> Char
w2c Word8
c forall a. a -> [a] -> [a]
: [Char]
s
| Bool
otherwise = Char
'\\' forall a. a -> [a] -> [a]
: forall {p}. Integral p => p -> ShowS
ddd Word8
c [Char]
s
ddd :: p -> ShowS
ddd p
c [Char]
s =
let (Int
q100, Int
r100) = forall a. Integral a => a -> a -> (a, a)
divMod (forall a b. (Integral a, Num b) => a -> b
fromIntegral p
c) Int
100
(Int
q10, Int
r10) = forall a. Integral a => a -> a -> (a, a)
divMod Int
r100 Int
10
in Int -> Char
intToDigit Int
q100 forall a. a -> [a] -> [a]
: Int -> Char
intToDigit Int
q10 forall a. a -> [a] -> [a]
: Int -> Char
intToDigit Int
r10 forall a. a -> [a] -> [a]
: [Char]
s
showRP :: Domain -> Domain -> [Char]
showRP Domain
mbox Domain
dname = Domain -> [Char]
showDomain Domain
mbox forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
showDomain Domain
dname
showSRV :: a -> a -> a -> Domain -> [Char]
showSRV a
priority a
weight a
port Domain
target =
forall a. Show a => a -> [Char]
show a
priority forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
weight forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++
forall a. Show a => a -> [Char]
show a
port forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
BS.unpack Domain
target
showDS :: a -> a -> a -> Domain -> [Char]
showDS a
keytag a
alg a
digestType Domain
digest =
forall a. Show a => a -> [Char]
show a
keytag forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
alg forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++
forall a. Show a => a -> [Char]
show a
digestType forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
_b16encode Domain
digest
showNSEC :: Domain -> [a] -> [Char]
showNSEC Domain
next [a]
types =
[[Char]] -> [Char]
unwords forall a b. (a -> b) -> a -> b
$ Domain -> [Char]
showDomain Domain
next forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show [a]
types
showDNSKEY :: a -> a -> a -> Domain -> [Char]
showDNSKEY a
flags a
protocol a
alg Domain
key =
forall a. Show a => a -> [Char]
show a
flags forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
protocol forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++
forall a. Show a => a -> [Char]
show a
alg forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
_b64encode Domain
key
showNSEC3 :: a -> a -> a -> Domain -> Domain -> [a] -> [Char]
showNSEC3 a
hashalg a
flags a
iterations Domain
salt Domain
nexthash [a]
types =
[[Char]] -> [Char]
unwords forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> [Char]
show a
hashalg forall a. a -> [a] -> [a]
: forall a. Show a => a -> [Char]
show a
flags forall a. a -> [a] -> [a]
: forall a. Show a => a -> [Char]
show a
iterations forall a. a -> [a] -> [a]
:
Domain -> [Char]
showSalt Domain
salt forall a. a -> [a] -> [a]
: Domain -> [Char]
_b32encode Domain
nexthash forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show [a]
types
showNSEC3PARAM :: a -> a -> a -> Domain -> [Char]
showNSEC3PARAM a
hashAlg a
flags a
iterations Domain
salt =
forall a. Show a => a -> [Char]
show a
hashAlg forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
flags forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++
forall a. Show a => a -> [Char]
show a
iterations forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
showSalt Domain
salt
showTLSA :: a -> a -> a -> Domain -> [Char]
showTLSA a
usage a
selector a
mtype Domain
digest =
forall a. Show a => a -> [Char]
show a
usage forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
selector forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++
forall a. Show a => a -> [Char]
show a
mtype forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
_b16encode Domain
digest
showCAA :: a -> CI Domain -> a -> [Char]
showCAA a
flags CI Domain
tag a
value =
forall a. Show a => a -> [Char]
show a
flags forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
BS.unpack (forall s. CI s -> s
CI.original CI Domain
tag) forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
value
showOpaque :: Domain -> [Char]
showOpaque Domain
bs = [[Char]] -> [Char]
unwords [[Char]
"\\#", forall a. Show a => a -> [Char]
show (Domain -> Int
BS.length Domain
bs), Domain -> [Char]
_b16encode Domain
bs]
_b16encode, _b32encode, _b64encode :: ByteString -> String
_b16encode :: Domain -> [Char]
_b16encode = Domain -> [Char]
BS.unpackforall b c a. (b -> c) -> (a -> b) -> a -> c
. Domain -> Domain
B16.encode
_b32encode :: Domain -> [Char]
_b32encode = Domain -> [Char]
BS.unpackforall b c a. (b -> c) -> (a -> b) -> a -> c
. Domain -> Domain
B32.encode
_b64encode :: Domain -> [Char]
_b64encode = Domain -> [Char]
BS.unpackforall b c a. (b -> c) -> (a -> b) -> a -> c
. Domain -> Domain
B64.encode
type Answers = [ResourceRecord]
type AuthorityRecords = [ResourceRecord]
type AdditionalRecords = [ResourceRecord]
defaultQuery :: DNSMessage
defaultQuery :: DNSMessage
defaultQuery = DNSMessage {
header :: DNSHeader
header = DNSHeader {
identifier :: Word16
identifier = Word16
0
, flags :: DNSFlags
flags = DNSFlags
defaultDNSFlags
}
, ednsHeader :: EDNSheader
ednsHeader = EDNS -> EDNSheader
EDNSheader EDNS
defaultEDNS
, question :: [Question]
question = []
, answer :: Answers
answer = []
, authority :: Answers
authority = []
, additional :: Answers
additional = []
}
defaultResponse :: DNSMessage
defaultResponse :: DNSMessage
defaultResponse = DNSMessage {
header :: DNSHeader
header = DNSHeader {
identifier :: Word16
identifier = Word16
0
, flags :: DNSFlags
flags = DNSFlags
defaultDNSFlags {
qOrR :: QorR
qOrR = QorR
QR_Response
, authAnswer :: Bool
authAnswer = Bool
True
, recAvailable :: Bool
recAvailable = Bool
True
, authenData :: Bool
authenData = Bool
False
}
}
, ednsHeader :: EDNSheader
ednsHeader = EDNSheader
NoEDNS
, question :: [Question]
question = []
, answer :: Answers
answer = []
, authority :: Answers
authority = []
, additional :: Answers
additional = []
}
makeEmptyQuery :: QueryControls
-> DNSMessage
makeEmptyQuery :: QueryControls -> DNSMessage
makeEmptyQuery QueryControls
ctls = DNSMessage
defaultQuery {
header :: DNSHeader
header = DNSHeader
header'
, ednsHeader :: EDNSheader
ednsHeader = EdnsControls -> EDNSheader
queryEdns EdnsControls
ehctls
}
where
hctls :: HeaderControls
hctls = QueryControls -> HeaderControls
qctlHeader QueryControls
ctls
ehctls :: EdnsControls
ehctls = QueryControls -> EdnsControls
qctlEdns QueryControls
ctls
header' :: DNSHeader
header' = (DNSMessage -> DNSHeader
header DNSMessage
defaultQuery) { flags :: DNSFlags
flags = HeaderControls -> DNSFlags
queryDNSFlags HeaderControls
hctls }
applyFlag :: FlagOp -> Bool -> Bool
applyFlag :: FlagOp -> Bool -> Bool
applyFlag FlagOp
FlagSet Bool
_ = Bool
True
applyFlag FlagOp
FlagClear Bool
_ = Bool
False
applyFlag FlagOp
_ Bool
v = Bool
v
queryEdns :: EdnsControls -> EDNSheader
queryEdns :: EdnsControls -> EDNSheader
queryEdns (EdnsControls FlagOp
en Maybe Word8
vn Maybe Word16
sz FlagOp
d0 ODataOp
od) =
let d :: EDNS
d = EDNS
defaultEDNS
in if FlagOp
en forall a. Eq a => a -> a -> Bool
== FlagOp
FlagClear
then EDNSheader
NoEDNS
else EDNS -> EDNSheader
EDNSheader forall a b. (a -> b) -> a -> b
$ EDNS
d { ednsVersion :: Word8
ednsVersion = forall a. a -> Maybe a -> a
fromMaybe (EDNS -> Word8
ednsVersion EDNS
d) Maybe Word8
vn
, ednsUdpSize :: Word16
ednsUdpSize = forall a. a -> Maybe a -> a
fromMaybe (EDNS -> Word16
ednsUdpSize EDNS
d) Maybe Word16
sz
, ednsDnssecOk :: Bool
ednsDnssecOk = FlagOp -> Bool -> Bool
applyFlag FlagOp
d0 (EDNS -> Bool
ednsDnssecOk EDNS
d)
, ednsOptions :: [OData]
ednsOptions = ODataOp -> [OData]
_odataDedup ODataOp
od
}
queryDNSFlags :: HeaderControls -> DNSFlags
queryDNSFlags :: HeaderControls -> DNSFlags
queryDNSFlags (HeaderControls FlagOp
rd FlagOp
ad FlagOp
cd) = DNSFlags
d {
recDesired :: Bool
recDesired = FlagOp -> Bool -> Bool
applyFlag FlagOp
rd forall a b. (a -> b) -> a -> b
$ DNSFlags -> Bool
recDesired DNSFlags
d
, authenData :: Bool
authenData = FlagOp -> Bool -> Bool
applyFlag FlagOp
ad forall a b. (a -> b) -> a -> b
$ DNSFlags -> Bool
authenData DNSFlags
d
, chkDisable :: Bool
chkDisable = FlagOp -> Bool -> Bool
applyFlag FlagOp
cd forall a b. (a -> b) -> a -> b
$ DNSFlags -> Bool
chkDisable DNSFlags
d
}
where
d :: DNSFlags
d = DNSFlags
defaultDNSFlags
makeQuery :: Identifier
-> Question
-> QueryControls
-> DNSMessage
makeQuery :: Word16 -> Question -> QueryControls -> DNSMessage
makeQuery Word16
idt Question
q QueryControls
ctls = DNSMessage
empqry {
header :: DNSHeader
header = (DNSMessage -> DNSHeader
header DNSMessage
empqry) { identifier :: Word16
identifier = Word16
idt }
, question :: [Question]
question = [Question
q]
}
where
empqry :: DNSMessage
empqry = QueryControls -> DNSMessage
makeEmptyQuery QueryControls
ctls
makeResponse :: Identifier
-> Question
-> Answers
-> DNSMessage
makeResponse :: Word16 -> Question -> Answers -> DNSMessage
makeResponse Word16
idt Question
q Answers
as = DNSMessage
defaultResponse {
header :: DNSHeader
header = DNSHeader
header' { identifier :: Word16
identifier = Word16
idt }
, question :: [Question]
question = [Question
q]
, answer :: Answers
answer = Answers
as
}
where
header' :: DNSHeader
header' = DNSMessage -> DNSHeader
header DNSMessage
defaultResponse
data EDNS = EDNS {
EDNS -> Word8
ednsVersion :: !Word8
, EDNS -> Word16
ednsUdpSize :: !Word16
, EDNS -> Bool
ednsDnssecOk :: !Bool
, EDNS -> [OData]
ednsOptions :: ![OData]
} deriving (EDNS -> EDNS -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EDNS -> EDNS -> Bool
$c/= :: EDNS -> EDNS -> Bool
== :: EDNS -> EDNS -> Bool
$c== :: EDNS -> EDNS -> Bool
Eq, Int -> EDNS -> ShowS
[EDNS] -> ShowS
EDNS -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [EDNS] -> ShowS
$cshowList :: [EDNS] -> ShowS
show :: EDNS -> [Char]
$cshow :: EDNS -> [Char]
showsPrec :: Int -> EDNS -> ShowS
$cshowsPrec :: Int -> EDNS -> ShowS
Show)
defaultEDNS :: EDNS
defaultEDNS :: EDNS
defaultEDNS = EDNS
{ ednsVersion :: Word8
ednsVersion = Word8
0
, ednsUdpSize :: Word16
ednsUdpSize = Word16
1232
, ednsDnssecOk :: Bool
ednsDnssecOk = Bool
False
, ednsOptions :: [OData]
ednsOptions = []
}
maxUdpSize :: Word16
maxUdpSize :: Word16
maxUdpSize = Word16
16384
minUdpSize :: Word16
minUdpSize :: Word16
minUdpSize = Word16
512
newtype OptCode = OptCode {
OptCode -> Word16
fromOptCode :: Word16
} deriving (OptCode -> OptCode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OptCode -> OptCode -> Bool
$c/= :: OptCode -> OptCode -> Bool
== :: OptCode -> OptCode -> Bool
$c== :: OptCode -> OptCode -> Bool
Eq,Eq OptCode
OptCode -> OptCode -> Bool
OptCode -> OptCode -> Ordering
OptCode -> OptCode -> OptCode
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: OptCode -> OptCode -> OptCode
$cmin :: OptCode -> OptCode -> OptCode
max :: OptCode -> OptCode -> OptCode
$cmax :: OptCode -> OptCode -> OptCode
>= :: OptCode -> OptCode -> Bool
$c>= :: OptCode -> OptCode -> Bool
> :: OptCode -> OptCode -> Bool
$c> :: OptCode -> OptCode -> Bool
<= :: OptCode -> OptCode -> Bool
$c<= :: OptCode -> OptCode -> Bool
< :: OptCode -> OptCode -> Bool
$c< :: OptCode -> OptCode -> Bool
compare :: OptCode -> OptCode -> Ordering
$ccompare :: OptCode -> OptCode -> Ordering
Ord)
pattern NSID :: OptCode
pattern $bNSID :: OptCode
$mNSID :: forall {r}. OptCode -> ((# #) -> r) -> ((# #) -> r) -> r
NSID = OptCode 3
pattern DAU :: OptCode
pattern $bDAU :: OptCode
$mDAU :: forall {r}. OptCode -> ((# #) -> r) -> ((# #) -> r) -> r
DAU = OptCode 5
pattern DHU :: OptCode
pattern $bDHU :: OptCode
$mDHU :: forall {r}. OptCode -> ((# #) -> r) -> ((# #) -> r) -> r
DHU = OptCode 6
pattern N3U :: OptCode
pattern $bN3U :: OptCode
$mN3U :: forall {r}. OptCode -> ((# #) -> r) -> ((# #) -> r) -> r
N3U = OptCode 7
pattern ClientSubnet :: OptCode
pattern $bClientSubnet :: OptCode
$mClientSubnet :: forall {r}. OptCode -> ((# #) -> r) -> ((# #) -> r) -> r
ClientSubnet = OptCode 8
instance Show OptCode where
show :: OptCode -> [Char]
show OptCode
NSID = [Char]
"NSID"
show OptCode
DAU = [Char]
"DAU"
show OptCode
DHU = [Char]
"DHU"
show OptCode
N3U = [Char]
"N3U"
show OptCode
ClientSubnet = [Char]
"ClientSubnet"
show OptCode
x = [Char]
"OptCode" forall a. [a] -> [a] -> [a]
++ (forall a. Show a => a -> [Char]
show forall a b. (a -> b) -> a -> b
$ OptCode -> Word16
fromOptCode OptCode
x)
toOptCode :: Word16 -> OptCode
toOptCode :: Word16 -> OptCode
toOptCode = Word16 -> OptCode
OptCode
data OData =
OD_NSID ByteString
| OD_DAU [Word8]
| OD_DHU [Word8]
| OD_N3U [Word8]
| OD_ClientSubnet Word8 Word8 IP
| OD_ECSgeneric Word16 Word8 Word8 ByteString
| UnknownOData Word16 ByteString
deriving (OData -> OData -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OData -> OData -> Bool
$c/= :: OData -> OData -> Bool
== :: OData -> OData -> Bool
$c== :: OData -> OData -> Bool
Eq,Eq OData
OData -> OData -> Bool
OData -> OData -> Ordering
OData -> OData -> OData
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: OData -> OData -> OData
$cmin :: OData -> OData -> OData
max :: OData -> OData -> OData
$cmax :: OData -> OData -> OData
>= :: OData -> OData -> Bool
$c>= :: OData -> OData -> Bool
> :: OData -> OData -> Bool
$c> :: OData -> OData -> Bool
<= :: OData -> OData -> Bool
$c<= :: OData -> OData -> Bool
< :: OData -> OData -> Bool
$c< :: OData -> OData -> Bool
compare :: OData -> OData -> Ordering
$ccompare :: OData -> OData -> Ordering
Ord)
_odataToOptCode :: OData -> OptCode
_odataToOptCode :: OData -> OptCode
_odataToOptCode OD_NSID {} = OptCode
NSID
_odataToOptCode OD_DAU {} = OptCode
DAU
_odataToOptCode OD_DHU {} = OptCode
DHU
_odataToOptCode OD_N3U {} = OptCode
N3U
_odataToOptCode OD_ClientSubnet {} = OptCode
ClientSubnet
_odataToOptCode OD_ECSgeneric {} = OptCode
ClientSubnet
_odataToOptCode (UnknownOData Word16
code Domain
_) = Word16 -> OptCode
toOptCode Word16
code
instance Show OData where
show :: OData -> [Char]
show (OD_NSID Domain
nsid) = Domain -> [Char]
_showNSID Domain
nsid
show (OD_DAU [Word8]
as) = [Char] -> [Word8] -> [Char]
_showAlgList [Char]
"DAU" [Word8]
as
show (OD_DHU [Word8]
hs) = [Char] -> [Word8] -> [Char]
_showAlgList [Char]
"DHU" [Word8]
hs
show (OD_N3U [Word8]
hs) = [Char] -> [Word8] -> [Char]
_showAlgList [Char]
"N3U" [Word8]
hs
show (OD_ClientSubnet Word8
b1 Word8
b2 ip :: IP
ip@(IPv4 IPv4
_)) = Word16 -> Word8 -> Word8 -> ShowS
_showECS Word16
1 Word8
b1 Word8
b2 forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> [Char]
show IP
ip
show (OD_ClientSubnet Word8
b1 Word8
b2 ip :: IP
ip@(IPv6 IPv6
_)) = Word16 -> Word8 -> Word8 -> ShowS
_showECS Word16
2 Word8
b1 Word8
b2 forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> [Char]
show IP
ip
show (OD_ECSgeneric Word16
fam Word8
b1 Word8
b2 Domain
a) = Word16 -> Word8 -> Word8 -> ShowS
_showECS Word16
fam Word8
b1 Word8
b2 forall a b. (a -> b) -> a -> b
$ Domain -> [Char]
_b16encode Domain
a
show (UnknownOData Word16
code Domain
bs) =
[Char]
"UnknownOData " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Word16
code forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
_b16encode Domain
bs
_showAlgList :: String -> [Word8] -> String
_showAlgList :: [Char] -> [Word8] -> [Char]
_showAlgList [Char]
nm [Word8]
ws = [Char]
nm forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. [a] -> [[a]] -> [a]
intercalate [Char]
"," (forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show [Word8]
ws)
_showNSID :: ByteString -> String
_showNSID :: Domain -> [Char]
_showNSID Domain
nsid = [Char]
"NSID" forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
_b16encode Domain
nsid forall a. [a] -> [a] -> [a]
++ [Char]
";" forall a. [a] -> [a] -> [a]
++ Domain -> [Char]
printable Domain
nsid
where
printable :: Domain -> [Char]
printable = Domain -> [Char]
BS.unpackforall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Char) -> Domain -> Domain
BS.map (\Char
c -> if Char
c forall a. Ord a => a -> a -> Bool
< Char
' ' Bool -> Bool -> Bool
|| Char
c forall a. Ord a => a -> a -> Bool
> Char
'~' then Char
'?' else Char
c)
_showECS :: Word16 -> Word8 -> Word8 -> String -> String
_showECS :: Word16 -> Word8 -> Word8 -> ShowS
_showECS Word16
family Word8
srcBits Word8
scpBits [Char]
address =
forall a. Show a => a -> [Char]
show Word16
family forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Word8
srcBits
forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Word8
scpBits forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ [Char]
address