{-# LANGUAGE RecordWildCards #-}
module Net.DNSBase.Resolver
(
ResolverConf
, defaultResolvConf
, setResolverConfTimeout
, setResolverConfRetries
, setResolverConfQueryControls
, setResolverConfSource
, NameserverConf(..)
, NameserverSpec(..)
, ResolvSeed
, makeResolvSeed
, Resolver(resolvSeed, resolvRng)
, withResolver
, RRtypeNames
, confTypeNames
, rrtypeLookup
, QueryControls(..)
, EdnsControls
, TypeExtensible(..)
, KnownRData(..)
, registerRRtype
, extendRRwithType
, extendRRwithValue
, KnownEdnsOption(..)
, registerEdnsOption
, extendEdnsOptionWithType
, extendEdnsOptionWithValue
, DNSIO
, runDNSIO
, liftDNS
) where
import qualified Data.ByteString as B
import qualified Data.ByteString.Builder.Extra as B
import qualified Data.ByteString.Lazy as LB
import qualified Data.ByteString.Short as SB
import qualified Data.IntMap.Strict as IM
import qualified Data.Map.Strict as M
import qualified Data.Type.Equality as R
import qualified Type.Reflection as R
import Data.Char (chr)
import Data.String (fromString)
import Data.Void (Void)
import Network.Socket ( AddrInfo(..), AddrInfoFlag(..), HostName, PortNumber )
import Network.Socket ( ServiceName, SocketType(Datagram) )
import Network.Socket ( defaultHints, getAddrInfo )
import Numeric (readDec)
import Numeric.Natural (Natural)
import GHC.IO.Exception (IOErrorType(..))
import System.IO.Error (ioeSetErrorString, mkIOError, tryIOError)
import Net.DNSBase.Decode.Internal.Option
import Net.DNSBase.Decode.Internal.State
import Net.DNSBase.EDNS.Internal.Option
import Net.DNSBase.EDNS.Internal.OptNum
import Net.DNSBase.Encode.Internal.State
import Net.DNSBase.Internal.Error
import Net.DNSBase.Internal.Present
import Net.DNSBase.Internal.RData
import Net.DNSBase.Internal.RRTYPE
import Net.DNSBase.Internal.Util
import Net.DNSBase.Nat16
import Net.DNSBase.Resolver.Internal.Parser
import Net.DNSBase.Resolver.Internal.Types
import Net.DNSBase.EDNS.Option.ECS
import Net.DNSBase.EDNS.Option.EDE
import Net.DNSBase.EDNS.Option.NSID
import Net.DNSBase.EDNS.Option.Secalgs
import Net.DNSBase.Extensible (TypeExtensible(..), ValueExtensible(..))
import Net.DNSBase.RData.A
import Net.DNSBase.RData.CAA
import Net.DNSBase.RData.CSYNC
import Net.DNSBase.RData.Dnssec
import Net.DNSBase.RData.Obsolete
import Net.DNSBase.RData.SOA
import Net.DNSBase.RData.SRV
import Net.DNSBase.RData.SVCB
import Net.DNSBase.RData.TLSA
import Net.DNSBase.RData.TXT
import Net.DNSBase.RData.XNAME
setResolverConfTimeout :: Int -> ResolverConf -> ResolverConf
setResolverConfTimeout :: Int -> ResolverConf -> ResolverConf
setResolverConfTimeout Int
t ResolverConf
rc = ResolverConf
rc {rcTimeout = t}
setResolverConfRetries :: Int -> ResolverConf -> ResolverConf
setResolverConfRetries :: Int -> ResolverConf -> ResolverConf
setResolverConfRetries Int
n ResolverConf
rc = ResolverConf
rc {rcRetries = n}
setResolverConfSource :: NameserverConf -> ResolverConf -> ResolverConf
setResolverConfSource :: NameserverConf -> ResolverConf -> ResolverConf
setResolverConfSource NameserverConf
s ResolverConf
rc = ResolverConf
rc {rcSource = s}
setResolverConfQueryControls :: QueryControls -> ResolverConf -> ResolverConf
setResolverConfQueryControls :: QueryControls -> ResolverConf -> ResolverConf
setResolverConfQueryControls QueryControls
q ResolverConf
rc = ResolverConf
rc {rcQryCtls = q}
registerRRtype :: forall a -> KnownRData a
=> ResolverConf -> ResolverConf
registerRRtype :: forall a -> KnownRData a => ResolverConf -> ResolverConf
registerRRtype a ResolverConf
rc =
ResolverConf
rc { rcRDataMap = IM.insert key entry (rcRDataMap rc) }
where
key :: Int
key = forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word16 (Word16 -> Int) -> (RRTYPE -> Word16) -> RRTYPE -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RRTYPE -> Word16
forall a b. Coercible a b => a -> b
coerce (RRTYPE -> Int) -> RRTYPE -> Int
forall a b. (a -> b) -> a -> b
$ rdType a
entry :: RDataCodec
entry = Proxy a -> RDataExtensionVal a -> RDataCodec
forall a.
KnownRData a =>
Proxy a -> RDataExtensionVal a -> RDataCodec
RDataCodec (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) (rdataExtensionVal a)
extendRRwithType :: forall t ->
( KnownRData t
, TypeExtensible t (RDataExtensionVal t)
)
=> forall b -> TypeExtensionArg t b
=> ResolverConf -> ResolverConf
extendRRwithType :: forall t ->
(KnownRData t, TypeExtensible t (RDataExtensionVal t)) =>
forall b -> TypeExtensionArg t b => ResolverConf -> ResolverConf
extendRRwithType t b ResolverConf
rc =
ResolverConf
rc { rcRDataMap = IM.insert key entry (rcRDataMap rc) }
where
key :: Int
key = forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word16 (Word16 -> Int) -> (RRTYPE -> Word16) -> RRTYPE -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RRTYPE -> Word16
forall a b. Coercible a b => a -> b
coerce (RRTYPE -> Int) -> RRTYPE -> Int
forall a b. (a -> b) -> a -> b
$ rdType t
baseline :: RDataExtensionVal t
baseline = case Int -> IntMap RDataCodec -> Maybe RDataCodec
forall a. Int -> IntMap a -> Maybe a
IM.lookup Int
key (ResolverConf -> IntMap RDataCodec
rcRDataMap ResolverConf
rc) of
Just (RDataCodec (Proxy a
_ :: Proxy a) RDataExtensionVal a
opts)
| Just t :~: a
R.Refl <- TypeRep t -> TypeRep a -> Maybe (t :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
R.testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
R.typeRep @t) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
R.typeRep @a)
-> RDataExtensionVal t
RDataExtensionVal a
opts
Maybe RDataCodec
_ -> rdataExtensionVal t
entry :: RDataCodec
entry = Proxy t -> RDataExtensionVal t -> RDataCodec
forall a.
KnownRData a =>
Proxy a -> RDataExtensionVal a -> RDataCodec
RDataCodec (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @t) ((t ~ t, TypeExtensionArg t b) =>
RDataExtensionVal t -> RDataExtensionVal t
RDataExtensionVal t -> RDataExtensionVal t
forall b ->
(t ~ t, TypeExtensionArg t b) =>
RDataExtensionVal t -> RDataExtensionVal t
forall t b ->
(t ~ t, TypeExtensionArg t b) =>
RDataExtensionVal t -> RDataExtensionVal t
forall a v.
TypeExtensible a v =>
forall t b -> (t ~ a, TypeExtensionArg t b) => v -> v
extendByType t b RDataExtensionVal t
baseline)
registerEdnsOption :: forall a -> KnownEdnsOption a
=> ResolverConf -> ResolverConf
registerEdnsOption :: forall a -> KnownEdnsOption a => ResolverConf -> ResolverConf
registerEdnsOption a ResolverConf
rc =
ResolverConf
rc { rcOptionMap = IM.insert key entry (rcOptionMap rc) }
where
key :: Int
key = forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word16 (Word16 -> Int) -> (OptNum -> Word16) -> OptNum -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OptNum -> Word16
forall a b. Coercible a b => a -> b
coerce (OptNum -> Int) -> OptNum -> Int
forall a b. (a -> b) -> a -> b
$ optNum a
entry :: OptionCodec
entry = Proxy a -> OptionExtensionVal a -> OptionCodec
forall a.
KnownEdnsOption a =>
Proxy a -> OptionExtensionVal a -> OptionCodec
OptionCodec (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) (optionExtensionVal a)
extendEdnsOptionWithType :: forall t ->
( KnownEdnsOption t
, TypeExtensible t (OptionExtensionVal t)
)
=> forall b -> TypeExtensionArg t b
=> ResolverConf -> ResolverConf
extendEdnsOptionWithType :: forall t ->
(KnownEdnsOption t, TypeExtensible t (OptionExtensionVal t)) =>
forall b -> TypeExtensionArg t b => ResolverConf -> ResolverConf
extendEdnsOptionWithType t b ResolverConf
rc =
ResolverConf
rc { rcOptionMap = IM.insert key entry (rcOptionMap rc) }
where
key :: Int
key = forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word16 (Word16 -> Int) -> (OptNum -> Word16) -> OptNum -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OptNum -> Word16
forall a b. Coercible a b => a -> b
coerce (OptNum -> Int) -> OptNum -> Int
forall a b. (a -> b) -> a -> b
$ optNum t
baseline :: OptionExtensionVal t
baseline = case Int -> IntMap OptionCodec -> Maybe OptionCodec
forall a. Int -> IntMap a -> Maybe a
IM.lookup Int
key (ResolverConf -> IntMap OptionCodec
rcOptionMap ResolverConf
rc) of
Just (OptionCodec (Proxy a
_ :: Proxy a) OptionExtensionVal a
opts)
| Just t :~: a
R.Refl <- TypeRep t -> TypeRep a -> Maybe (t :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
R.testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
R.typeRep @t) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
R.typeRep @a)
-> OptionExtensionVal t
OptionExtensionVal a
opts
Maybe OptionCodec
_ -> optionExtensionVal t
entry :: OptionCodec
entry = Proxy t -> OptionExtensionVal t -> OptionCodec
forall a.
KnownEdnsOption a =>
Proxy a -> OptionExtensionVal a -> OptionCodec
OptionCodec (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @t) ((t ~ t, TypeExtensionArg t b) =>
OptionExtensionVal t -> OptionExtensionVal t
OptionExtensionVal t -> OptionExtensionVal t
forall b ->
(t ~ t, TypeExtensionArg t b) =>
OptionExtensionVal t -> OptionExtensionVal t
forall t b ->
(t ~ t, TypeExtensionArg t b) =>
OptionExtensionVal t -> OptionExtensionVal t
forall a v.
TypeExtensible a v =>
forall t b -> (t ~ a, TypeExtensionArg t b) => v -> v
extendByType t b OptionExtensionVal t
baseline)
extendRRwithValue :: forall t ->
( KnownRData t
, ValueExtensible t (RDataExtensionVal t)
)
=> forall b. ValueExtensionArg t b
=> b -> ResolverConf -> ResolverConf
extendRRwithValue :: forall t ->
forall b.
(KnownRData t, ValueExtensible t (RDataExtensionVal t),
ValueExtensionArg t b) =>
b -> ResolverConf -> ResolverConf
extendRRwithValue t b
v ResolverConf
rc =
ResolverConf
rc { rcRDataMap = IM.insert key entry (rcRDataMap rc) }
where
key :: Int
key = forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word16 (Word16 -> Int) -> (RRTYPE -> Word16) -> RRTYPE -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RRTYPE -> Word16
forall a b. Coercible a b => a -> b
coerce (RRTYPE -> Int) -> RRTYPE -> Int
forall a b. (a -> b) -> a -> b
$ rdType t
baseline :: RDataExtensionVal t
baseline = case Int -> IntMap RDataCodec -> Maybe RDataCodec
forall a. Int -> IntMap a -> Maybe a
IM.lookup Int
key (ResolverConf -> IntMap RDataCodec
rcRDataMap ResolverConf
rc) of
Just (RDataCodec (Proxy a
_ :: Proxy a) RDataExtensionVal a
opts)
| Just t :~: a
R.Refl <- TypeRep t -> TypeRep a -> Maybe (t :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
R.testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
R.typeRep @t) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
R.typeRep @a)
-> RDataExtensionVal t
RDataExtensionVal a
opts
Maybe RDataCodec
_ -> rdataExtensionVal t
entry :: RDataCodec
entry = Proxy t -> RDataExtensionVal t -> RDataCodec
forall a.
KnownRData a =>
Proxy a -> RDataExtensionVal a -> RDataCodec
RDataCodec (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @t) (b -> RDataExtensionVal t -> RDataExtensionVal t
forall b.
(t ~ t, ValueExtensionArg t b) =>
b -> RDataExtensionVal t -> RDataExtensionVal t
forall t ->
forall b.
(t ~ t, ValueExtensionArg t b) =>
b -> RDataExtensionVal t -> RDataExtensionVal t
forall b.
ValueExtensionArg t b =>
b -> RDataExtensionVal t -> RDataExtensionVal t
forall a v.
ValueExtensible a v =>
forall t -> forall b. (t ~ a, ValueExtensionArg t b) => b -> v -> v
extendByValue t b
v RDataExtensionVal t
baseline)
extendEdnsOptionWithValue :: forall t ->
( KnownEdnsOption t
, ValueExtensible t (OptionExtensionVal t)
)
=> forall b. ValueExtensionArg t b
=> b -> ResolverConf -> ResolverConf
extendEdnsOptionWithValue :: forall t ->
forall b.
(KnownEdnsOption t, ValueExtensible t (OptionExtensionVal t),
ValueExtensionArg t b) =>
b -> ResolverConf -> ResolverConf
extendEdnsOptionWithValue t b
v ResolverConf
rc =
ResolverConf
rc { rcOptionMap = IM.insert key entry (rcOptionMap rc) }
where
key :: Int
key = forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word16 (Word16 -> Int) -> (OptNum -> Word16) -> OptNum -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OptNum -> Word16
forall a b. Coercible a b => a -> b
coerce (OptNum -> Int) -> OptNum -> Int
forall a b. (a -> b) -> a -> b
$ optNum t
baseline :: OptionExtensionVal t
baseline = case Int -> IntMap OptionCodec -> Maybe OptionCodec
forall a. Int -> IntMap a -> Maybe a
IM.lookup Int
key (ResolverConf -> IntMap OptionCodec
rcOptionMap ResolverConf
rc) of
Just (OptionCodec (Proxy a
_ :: Proxy a) OptionExtensionVal a
opts)
| Just t :~: a
R.Refl <- TypeRep t -> TypeRep a -> Maybe (t :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
R.testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
R.typeRep @t) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
R.typeRep @a)
-> OptionExtensionVal t
OptionExtensionVal a
opts
Maybe OptionCodec
_ -> optionExtensionVal t
entry :: OptionCodec
entry = Proxy t -> OptionExtensionVal t -> OptionCodec
forall a.
KnownEdnsOption a =>
Proxy a -> OptionExtensionVal a -> OptionCodec
OptionCodec (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @t) (b -> OptionExtensionVal t -> OptionExtensionVal t
forall b.
(t ~ t, ValueExtensionArg t b) =>
b -> OptionExtensionVal t -> OptionExtensionVal t
forall t ->
forall b.
(t ~ t, ValueExtensionArg t b) =>
b -> OptionExtensionVal t -> OptionExtensionVal t
forall b.
ValueExtensionArg t b =>
b -> OptionExtensionVal t -> OptionExtensionVal t
forall a v.
ValueExtensible a v =>
forall t -> forall b. (t ~ a, ValueExtensionArg t b) => b -> v -> v
extendByValue t b
v OptionExtensionVal t
baseline)
makeResolvSeed :: ResolverConf -> IO (Either DNSError ResolvSeed)
makeResolvSeed :: ResolverConf -> IO (Either DNSError ResolvSeed)
makeResolvSeed ResolverConf
conf = DNSIO ResolvSeed -> IO (Either DNSError ResolvSeed)
forall a. DNSIO a -> IO (Either DNSError a)
runDNSIO do
seedServers <- DNSIO (NonEmpty Nameserver)
findAddresses
let !seedRDataMap = IntMap RDataCodec
reservedCodecs
IntMap RDataCodec -> IntMap RDataCodec -> IntMap RDataCodec
forall a. IntMap a -> IntMap a -> IntMap a
`IM.union` (ResolverConf -> IntMap RDataCodec
rcRDataMap ResolverConf
conf IntMap RDataCodec -> IntMap RDataCodec -> IntMap RDataCodec
forall a. IntMap a -> IntMap a -> IntMap a
`IM.union` IntMap RDataCodec
defaultCodecs)
!seedOptionMap = ResolverConf -> IntMap OptionCodec
rcOptionMap ResolverConf
conf IntMap OptionCodec -> IntMap OptionCodec -> IntMap OptionCodec
forall a. IntMap a -> IntMap a -> IntMap a
`IM.union` IntMap OptionCodec
baseOptions
seedConfig = ResolverConf
conf
pure ResolvSeed{..}
where
findAddresses :: DNSIO (NonEmpty Nameserver)
findAddresses :: DNSIO (NonEmpty Nameserver)
findAddresses = case ResolverConf -> NameserverConf
rcSource ResolverConf
conf of
HostList NonEmpty NameserverSpec
rs -> NonEmpty (NonEmpty Nameserver) -> NonEmpty Nameserver
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (NonEmpty (NonEmpty Nameserver) -> NonEmpty Nameserver)
-> ExceptT DNSError IO (NonEmpty (NonEmpty Nameserver))
-> DNSIO (NonEmpty Nameserver)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (NameserverSpec -> DNSIO (NonEmpty Nameserver))
-> NonEmpty NameserverSpec
-> ExceptT DNSError IO (NonEmpty (NonEmpty Nameserver))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> NonEmpty a -> m (NonEmpty b)
mapM NameserverSpec -> DNSIO (NonEmpty Nameserver)
getNameserverAddresses NonEmpty NameserverSpec
rs
SourceFile FilePath
file -> FilePath -> DNSIO [NameserverSpec]
getDefaultNameservers FilePath
file DNSIO [NameserverSpec]
-> ([NameserverSpec] -> DNSIO (NonEmpty Nameserver))
-> DNSIO (NonEmpty Nameserver)
forall a b.
ExceptT DNSError IO a
-> (a -> ExceptT DNSError IO b) -> ExceptT DNSError IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [NameserverSpec] -> DNSIO (NonEmpty Nameserver)
mkAddrs
getNameserverAddresses :: NameserverSpec -> DNSIO (NonEmpty Nameserver)
getNameserverAddresses (NameserverSpec FilePath
h Maybe PortNumber
mp) = Maybe FilePath -> Maybe PortNumber -> DNSIO (NonEmpty Nameserver)
makeAddrInfo (FilePath -> Maybe FilePath
forall a. a -> Maybe a
Just FilePath
h) Maybe PortNumber
mp
mkAddrs :: [NameserverSpec] -> DNSIO (NonEmpty Nameserver)
mkAddrs [] = Maybe FilePath -> Maybe PortNumber -> DNSIO (NonEmpty Nameserver)
makeAddrInfo Maybe FilePath
forall a. Maybe a
Nothing Maybe PortNumber
forall a. Maybe a
Nothing
mkAddrs (NameserverSpec
l:[NameserverSpec]
ls) = NonEmpty (NonEmpty Nameserver) -> NonEmpty Nameserver
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (NonEmpty (NonEmpty Nameserver) -> NonEmpty Nameserver)
-> ExceptT DNSError IO (NonEmpty (NonEmpty Nameserver))
-> DNSIO (NonEmpty Nameserver)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (NameserverSpec -> DNSIO (NonEmpty Nameserver))
-> NonEmpty NameserverSpec
-> ExceptT DNSError IO (NonEmpty (NonEmpty Nameserver))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> NonEmpty a -> m (NonEmpty b)
mapM NameserverSpec -> DNSIO (NonEmpty Nameserver)
getNameserverAddresses (NameserverSpec
l NameserverSpec -> [NameserverSpec] -> NonEmpty NameserverSpec
forall a. a -> [a] -> NonEmpty a
:| [NameserverSpec]
ls)
defaultResolvConf :: ResolverConf
defaultResolvConf :: ResolverConf
defaultResolvConf = ResolverConf
{ rcSource :: NameserverConf
rcSource = FilePath -> NameserverConf
SourceFile FilePath
"/etc/resolv.conf"
, rcTimeout :: Int
rcTimeout = Int
3_000_000
, rcRetries :: Int
rcRetries = Int
3
, rcQryCtls :: QueryControls
rcQryCtls = QueryControls
forall a. Monoid a => a
mempty
, rcRDataMap :: IntMap RDataCodec
rcRDataMap = IntMap RDataCodec
forall a. IntMap a
IM.empty
, rcOptionMap :: IntMap OptionCodec
rcOptionMap = IntMap OptionCodec
forall a. IntMap a
IM.empty
}
isAddr :: HostName -> Bool
isAddr :: FilePath -> Bool
isAddr FilePath
addr =
case forall a. Read a => ReadS a
reads @IP FilePath
addr of
[(IP
_,FilePath
r)] -> FilePath -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null FilePath
r
[(IP, FilePath)]
_ -> Bool
False
makeAddrInfo :: Maybe HostName -> Maybe PortNumber -> DNSIO (NonEmpty Nameserver)
makeAddrInfo :: Maybe FilePath -> Maybe PortNumber -> DNSIO (NonEmpty Nameserver)
makeAddrInfo Maybe FilePath
maddr Maybe PortNumber
mport = do
let flags :: [AddrInfoFlag]
flags | Bool
addrLiteral = AddrInfoFlag
AI_NUMERICHOST AddrInfoFlag -> [AddrInfoFlag] -> [AddrInfoFlag]
forall a. a -> [a] -> [a]
: [AddrInfoFlag]
defaultFlags
| Bool
otherwise = [AddrInfoFlag]
defaultFlags
hints :: AddrInfo
hints = AddrInfo
defaultHints {addrFlags = flags, addrSocketType = Datagram}
serv :: FilePath
serv = FilePath
-> (PortNumber -> FilePath) -> Maybe PortNumber -> FilePath
forall b a. b -> (a -> b) -> Maybe a -> b
maybe FilePath
"53" PortNumber -> FilePath
forall a. Show a => a -> FilePath
show Maybe PortNumber
mport
(IOException -> DNSError)
-> ExceptT IOException IO [AddrInfo]
-> ExceptT DNSError IO [AddrInfo]
forall (m :: * -> *) e e' a.
Functor m =>
(e -> e') -> ExceptT e m a -> ExceptT e' m a
withExceptT IOException -> DNSError
BadNameserver (AddrInfo
-> Maybe FilePath -> FilePath -> ExceptT IOException IO [AddrInfo]
getAddrInfo' AddrInfo
hints Maybe FilePath
maddr FilePath
serv) ExceptT DNSError IO [AddrInfo]
-> ([AddrInfo] -> DNSIO (NonEmpty Nameserver))
-> DNSIO (NonEmpty Nameserver)
forall a b.
ExceptT DNSError IO a
-> (a -> ExceptT DNSError IO b) -> ExceptT DNSError IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ case
AddrInfo
a : [AddrInfo]
as -> NonEmpty Nameserver -> DNSIO (NonEmpty Nameserver)
forall a. a -> ExceptT DNSError IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (NonEmpty Nameserver -> DNSIO (NonEmpty Nameserver))
-> NonEmpty Nameserver -> DNSIO (NonEmpty Nameserver)
forall a b. (a -> b) -> a -> b
$ Maybe FilePath -> AddrInfo -> Nameserver
Nameserver Maybe FilePath
addrName (AddrInfo -> Nameserver)
-> NonEmpty AddrInfo -> NonEmpty Nameserver
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AddrInfo
a AddrInfo -> [AddrInfo] -> NonEmpty AddrInfo
forall a. a -> [a] -> NonEmpty a
:| [AddrInfo]
as
[AddrInfo]
_ -> let host :: FilePath
host = FilePath -> Maybe FilePath -> FilePath
forall a. a -> Maybe a -> a
fromMaybe FilePath
defaultHostName Maybe FilePath
maddr
ioe :: IOException
ioe = IOErrorType
-> FilePath -> Maybe Handle -> Maybe FilePath -> IOException
mkIOError IOErrorType
NoSuchThing FilePath
host Maybe Handle
forall a. Maybe a
Nothing Maybe FilePath
forall a. Maybe a
Nothing
in DNSError -> DNSIO (NonEmpty Nameserver)
forall (m :: * -> *) e a. Monad m => e -> ExceptT e m a
throwE (DNSError -> DNSIO (NonEmpty Nameserver))
-> DNSError -> DNSIO (NonEmpty Nameserver)
forall a b. (a -> b) -> a -> b
$ IOException -> DNSError
BadNameserver (IOException -> DNSError) -> IOException -> DNSError
forall a b. (a -> b) -> a -> b
$ IOException -> FilePath -> IOException
ioeSetErrorString IOException
ioe FilePath
"Host unknown"
where
defaultFlags :: [AddrInfoFlag]
defaultFlags = [AddrInfoFlag
AI_NUMERICSERV, AddrInfoFlag
AI_ADDRCONFIG]
defaultHostName :: FilePath
defaultHostName = FilePath
"localhost"
addrLiteral :: Bool
addrLiteral = Bool -> (FilePath -> Bool) -> Maybe FilePath -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False FilePath -> Bool
isAddr Maybe FilePath
maddr
addrName :: Maybe FilePath
addrName | Bool
addrLiteral = Maybe FilePath
forall a. Maybe a
Nothing
| Bool
otherwise = Maybe FilePath
maddr Maybe FilePath -> Maybe FilePath -> Maybe FilePath
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> FilePath -> Maybe FilePath
forall a. a -> Maybe a
Just FilePath
defaultHostName
getAddrInfo' :: AddrInfo -> Maybe HostName -> ServiceName -> ExceptT IOError IO [AddrInfo]
getAddrInfo' :: AddrInfo
-> Maybe FilePath -> FilePath -> ExceptT IOException IO [AddrInfo]
getAddrInfo' AddrInfo
h Maybe FilePath
a FilePath
s = IO (Either IOException [AddrInfo])
-> ExceptT IOException IO [AddrInfo]
forall e (m :: * -> *) a. m (Either e a) -> ExceptT e m a
ExceptT (IO (Either IOException [AddrInfo])
-> ExceptT IOException IO [AddrInfo])
-> IO (Either IOException [AddrInfo])
-> ExceptT IOException IO [AddrInfo]
forall a b. (a -> b) -> a -> b
$ IO [AddrInfo] -> IO (Either IOException [AddrInfo])
forall a. IO a -> IO (Either IOException a)
tryIOError (Maybe AddrInfo -> Maybe FilePath -> Maybe FilePath -> IO [AddrInfo]
forall (t :: * -> *).
GetAddrInfo t =>
Maybe AddrInfo
-> Maybe FilePath -> Maybe FilePath -> IO (t AddrInfo)
getAddrInfo (AddrInfo -> Maybe AddrInfo
forall a. a -> Maybe a
Just AddrInfo
h) Maybe FilePath
a (FilePath -> Maybe FilePath
forall a. a -> Maybe a
Just FilePath
s))
newtype RRtypeNames = RRNames_ (M.Map SB.ShortByteString RRTYPE)
rrtypeLookup :: B.ByteString
-> RRtypeNames
-> Maybe RRTYPE
rrtypeLookup :: ByteString -> RRtypeNames -> Maybe RRTYPE
rrtypeLookup ((,) (Int -> [Word8] -> (Int, [Word8]))
-> (ByteString -> Int) -> ByteString -> [Word8] -> (Int, [Word8])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ByteString -> Int
B.length (ByteString -> [Word8] -> (Int, [Word8]))
-> (ByteString -> [Word8]) -> ByteString -> (Int, [Word8])
forall a b.
(ByteString -> a -> b) -> (ByteString -> a) -> ByteString -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ByteString -> [Word8]
B.unpack -> (Int
len, [Word8]
ws)) (RRtypeNames -> Map ShortByteString RRTYPE
forall a b. Coercible a b => a -> b
coerce -> Map ShortByteString RRTYPE
m)
| t :: Maybe RRTYPE
t@(Just RRTYPE
_) <- ShortByteString -> Map ShortByteString RRTYPE -> Maybe RRTYPE
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup ShortByteString
name Map ShortByteString RRTYPE
m
= Maybe RRTYPE
t
| ShortByteString -> ShortByteString -> Bool
SB.isPrefixOf ShortByteString
rrtypePrefix ShortByteString
name
, FilePath
digits <- (Word8 -> Char) -> [Word8] -> FilePath
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Char
chr (Int -> Char) -> (Word8 -> Int) -> Word8 -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral) ([Word8] -> FilePath) -> [Word8] -> FilePath
forall a b. (a -> b) -> a -> b
$ Int -> [Word8] -> [Word8]
forall a. Int -> [a] -> [a]
drop (ShortByteString -> Int
SB.length ShortByteString
rrtypePrefix) [Word8]
ws
, [(Natural
w, FilePath
"")] <- forall a. (Eq a, Num a) => ReadS a
readDec @Natural FilePath
digits
, Natural
w Natural -> Natural -> Bool
forall a. Ord a => a -> a -> Bool
<= forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word16 @Natural Word16
forall a. Bounded a => a
maxBound
= RRTYPE -> Maybe RRTYPE
forall a. a -> Maybe a
Just (RRTYPE -> Maybe RRTYPE) -> RRTYPE -> Maybe RRTYPE
forall a b. (a -> b) -> a -> b
$! Word16 -> RRTYPE
RRTYPE (Word16 -> RRTYPE) -> Word16 -> RRTYPE
forall a b. (a -> b) -> a -> b
$ Natural -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Natural
w
| Bool
otherwise
= Maybe RRTYPE
forall a. Maybe a
Nothing
where
name :: ShortByteString
name = Int -> [Word8] -> ShortByteString
forall a. Integral a => a -> [Word8] -> ShortByteString
foldShort Int
len [Word8]
ws
confTypeNames :: Maybe ResolvSeed -> RRtypeNames
confTypeNames :: Maybe ResolvSeed -> RRtypeNames
confTypeNames Maybe ResolvSeed
cnf =
Map ShortByteString RRTYPE -> RRtypeNames
forall a b. Coercible a b => a -> b
coerce (Map ShortByteString RRTYPE -> RRtypeNames)
-> Map ShortByteString RRTYPE -> RRtypeNames
forall a b. (a -> b) -> a -> b
$ Map ShortByteString RRTYPE
-> (ResolvSeed -> Map ShortByteString RRTYPE)
-> Maybe ResolvSeed
-> Map ShortByteString RRTYPE
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Map ShortByteString RRTYPE
forall k a. Map k a
M.empty ResolvSeed -> Map ShortByteString RRTYPE
cnfMap Maybe ResolvSeed
cnf Map ShortByteString RRTYPE
-> Map ShortByteString RRTYPE -> Map ShortByteString RRTYPE
forall a. Semigroup a => a -> a -> a
<> [(ShortByteString, RRTYPE)] -> Map ShortByteString RRTYPE
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [(ShortByteString, RRTYPE)]
knownNames
where
cnfMap :: ResolvSeed -> Map ShortByteString RRTYPE
cnfMap ResolvSeed {seedRDataMap :: ResolvSeed -> IntMap RDataCodec
seedRDataMap = IntMap RDataCodec
dm} =
[(ShortByteString, RRTYPE)] -> Map ShortByteString RRTYPE
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(ShortByteString, RRTYPE)] -> Map ShortByteString RRTYPE)
-> [(ShortByteString, RRTYPE)] -> Map ShortByteString RRTYPE
forall a b. (a -> b) -> a -> b
$ ((Int, RDataCodec) -> (ShortByteString, RRTYPE))
-> [(Int, RDataCodec)] -> [(ShortByteString, RRTYPE)]
forall a b. (a -> b) -> [a] -> [b]
map ((Int -> RDataCodec -> (ShortByteString, RRTYPE))
-> (Int, RDataCodec) -> (ShortByteString, RRTYPE)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> RDataCodec -> (ShortByteString, RRTYPE)
forall {p}.
Integral p =>
p -> RDataCodec -> (ShortByteString, RRTYPE)
mkPair) ([(Int, RDataCodec)] -> [(ShortByteString, RRTYPE)])
-> [(Int, RDataCodec)] -> [(ShortByteString, RRTYPE)]
forall a b. (a -> b) -> a -> b
$ IntMap RDataCodec -> [(Int, RDataCodec)]
forall a. IntMap a -> [(Int, a)]
IM.toList IntMap RDataCodec
dm
where
mkPair :: p -> RDataCodec -> (ShortByteString, RRTYPE)
mkPair p
k (RDataCodec Proxy a
p RDataExtensionVal a
_) =
(Proxy a -> ShortByteString
forall a. KnownRData a => Proxy a -> ShortByteString
proxyName Proxy a
p, Word16 -> RRTYPE
RRTYPE (Word16 -> RRTYPE) -> Word16 -> RRTYPE
forall a b. (a -> b) -> a -> b
$ p -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral p
k)
proxyName :: forall a. KnownRData a
=> Proxy a -> SB.ShortByteString
proxyName :: forall a. KnownRData a => Proxy a -> ShortByteString
proxyName Proxy a
_ = Builder -> ShortByteString
buildShort (Builder -> ShortByteString) -> Builder -> ShortByteString
forall a b. (a -> b) -> a -> b
$ (a ~ a) => Builder -> Builder
Builder -> Builder
forall b -> (b ~ a) => Builder -> Builder
forall a. KnownRData a => forall b -> (b ~ a) => Builder -> Builder
rdTypePres a Builder
forall a. Monoid a => a
mempty
knownNames :: [(ShortByteString, RRTYPE)]
knownNames = [ (ShortByteString
name, RRTYPE
t)
| RRTYPE
t <- [RRTYPE
A .. RRTYPE
rrtypeMax]
, let name :: ShortByteString
name = Builder -> ShortByteString
buildShort (Builder -> ShortByteString) -> Builder -> ShortByteString
forall a b. (a -> b) -> a -> b
$ RRTYPE -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present RRTYPE
t Builder
forall a. Monoid a => a
mempty
, Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ ShortByteString -> ShortByteString -> Bool
SB.isPrefixOf ShortByteString
rrtypePrefix ShortByteString
name ]
buildShort :: Builder -> ShortByteString
buildShort = (Int64 -> [Word8] -> ShortByteString
forall a. Integral a => a -> [Word8] -> ShortByteString
foldShort (Int64 -> [Word8] -> ShortByteString)
-> (LazyByteString -> Int64)
-> LazyByteString
-> [Word8]
-> ShortByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> LazyByteString -> Int64
LB.length (LazyByteString -> [Word8] -> ShortByteString)
-> (LazyByteString -> [Word8]) -> LazyByteString -> ShortByteString
forall a b.
(LazyByteString -> a -> b)
-> (LazyByteString -> a) -> LazyByteString -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> LazyByteString -> [Word8]
LB.unpack) (LazyByteString -> ShortByteString)
-> (Builder -> LazyByteString) -> Builder -> ShortByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> LazyByteString
buildLazy
buildLazy :: Builder -> LazyByteString
buildLazy = AllocationStrategy -> LazyByteString -> Builder -> LazyByteString
B.toLazyByteStringWith (Int -> Int -> AllocationStrategy
B.untrimmedStrategy Int
16 Int
32) LazyByteString
forall a. Monoid a => a
mempty
foldShort :: Integral a => a -> [Word8] -> SB.ShortByteString
foldShort :: forall a. Integral a => a -> [Word8] -> ShortByteString
foldShort a
len = (ShortByteString, Maybe [Word8]) -> ShortByteString
forall a b. (a, b) -> a
fst ((ShortByteString, Maybe [Word8]) -> ShortByteString)
-> ([Word8] -> (ShortByteString, Maybe [Word8]))
-> [Word8]
-> ShortByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int
-> ([Word8] -> Maybe (Word8, [Word8]))
-> [Word8]
-> (ShortByteString, Maybe [Word8])
forall a.
Int -> (a -> Maybe (Word8, a)) -> a -> (ShortByteString, Maybe a)
SB.unfoldrN (a -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
len) [Word8] -> Maybe (Word8, [Word8])
forall {a}. (Ord a, Num a) => [a] -> Maybe (a, [a])
low8
where
low8 :: [a] -> Maybe (a, [a])
low8 [] = Maybe (a, [a])
forall a. Maybe a
Nothing
low8 (a
w:[a]
ws) | a
w a -> a -> a
forall a. Num a => a -> a -> a
- a
0x41 a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
26 = (a, [a]) -> Maybe (a, [a])
forall a. a -> Maybe a
Just (a
w a -> a -> a
forall a. Num a => a -> a -> a
+ a
0x20, [a]
ws)
| Bool
otherwise = (a, [a]) -> Maybe (a, [a])
forall a. a -> Maybe a
Just (a
w, [a]
ws)
rrtypePrefix :: SB.ShortByteString
rrtypePrefix :: ShortByteString
rrtypePrefix = FilePath -> ShortByteString
forall a. IsString a => FilePath -> a
fromString FilePath
"type"
type Reserved :: Nat -> Type
data Reserved n = Reserved_ Void deriving (Reserved n -> Reserved n -> Bool
(Reserved n -> Reserved n -> Bool)
-> (Reserved n -> Reserved n -> Bool) -> Eq (Reserved n)
forall (n :: Natural). Reserved n -> Reserved n -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall (n :: Natural). Reserved n -> Reserved n -> Bool
== :: Reserved n -> Reserved n -> Bool
$c/= :: forall (n :: Natural). Reserved n -> Reserved n -> Bool
/= :: Reserved n -> Reserved n -> Bool
Eq, Eq (Reserved n)
Eq (Reserved n) =>
(Reserved n -> Reserved n -> Ordering)
-> (Reserved n -> Reserved n -> Bool)
-> (Reserved n -> Reserved n -> Bool)
-> (Reserved n -> Reserved n -> Bool)
-> (Reserved n -> Reserved n -> Bool)
-> (Reserved n -> Reserved n -> Reserved n)
-> (Reserved n -> Reserved n -> Reserved n)
-> Ord (Reserved n)
Reserved n -> Reserved n -> Bool
Reserved n -> Reserved n -> Ordering
Reserved n -> Reserved n -> Reserved n
forall (n :: Natural). Eq (Reserved n)
forall (n :: Natural). Reserved n -> Reserved n -> Bool
forall (n :: Natural). Reserved n -> Reserved n -> Ordering
forall (n :: Natural). Reserved n -> Reserved n -> Reserved n
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
$ccompare :: forall (n :: Natural). Reserved n -> Reserved n -> Ordering
compare :: Reserved n -> Reserved n -> Ordering
$c< :: forall (n :: Natural). Reserved n -> Reserved n -> Bool
< :: Reserved n -> Reserved n -> Bool
$c<= :: forall (n :: Natural). Reserved n -> Reserved n -> Bool
<= :: Reserved n -> Reserved n -> Bool
$c> :: forall (n :: Natural). Reserved n -> Reserved n -> Bool
> :: Reserved n -> Reserved n -> Bool
$c>= :: forall (n :: Natural). Reserved n -> Reserved n -> Bool
>= :: Reserved n -> Reserved n -> Bool
$cmax :: forall (n :: Natural). Reserved n -> Reserved n -> Reserved n
max :: Reserved n -> Reserved n -> Reserved n
$cmin :: forall (n :: Natural). Reserved n -> Reserved n -> Reserved n
min :: Reserved n -> Reserved n -> Reserved n
Ord, Int -> Reserved n -> ShowS
[Reserved n] -> ShowS
Reserved n -> FilePath
(Int -> Reserved n -> ShowS)
-> (Reserved n -> FilePath)
-> ([Reserved n] -> ShowS)
-> Show (Reserved n)
forall (n :: Natural). Int -> Reserved n -> ShowS
forall (n :: Natural). [Reserved n] -> ShowS
forall (n :: Natural). Reserved n -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall (n :: Natural). Int -> Reserved n -> ShowS
showsPrec :: Int -> Reserved n -> ShowS
$cshow :: forall (n :: Natural). Reserved n -> FilePath
show :: Reserved n -> FilePath
$cshowList :: forall (n :: Natural). [Reserved n] -> ShowS
showList :: [Reserved n] -> ShowS
Show)
instance (Nat16 n) => KnownRData (Reserved n) where
rdType :: forall b -> (b ~ Reserved n) => RRTYPE
rdType _ = Word16 -> RRTYPE
RRTYPE (Word16 -> RRTYPE) -> Word16 -> RRTYPE
forall a b. (a -> b) -> a -> b
$ natToWord16 n
rdTypePres :: forall b -> (b ~ Reserved n) => Builder -> Builder
rdTypePres _ = forall a. Presentable a => a -> Builder -> Builder
present @String FilePath
"Reserved" (Builder -> Builder) -> (Builder -> Builder) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present (natToWord16 n)
rdEncode :: forall s. Reserved n -> SPut s RData
rdEncode Reserved n
_ = (forall a. ErrorContext a => a -> EncodeErr a) -> SPut s RData
forall r s.
ErrorContext r =>
(forall a. ErrorContext a => a -> EncodeErr a) -> SPut s r
failWith ((forall a. ErrorContext a => a -> EncodeErr a) -> SPut s RData)
-> (forall a. ErrorContext a => a -> EncodeErr a) -> SPut s RData
forall a b. (a -> b) -> a -> b
$ RRTYPE -> a -> EncodeErr a
forall r. (Typeable r, Show r, Eq r) => RRTYPE -> r -> EncodeErr r
ReservedType (RRTYPE -> a -> EncodeErr a) -> RRTYPE -> a -> EncodeErr a
forall a b. (a -> b) -> a -> b
$ Word16 -> RRTYPE
RRTYPE (Word16 -> RRTYPE) -> Word16 -> RRTYPE
forall a b. (a -> b) -> a -> b
$ natToWord16 n
rdDecode :: forall b ->
(b ~ Reserved n) =>
RDataExtensionVal (Reserved n) -> Int -> SGet RData
rdDecode _ RDataExtensionVal (Reserved n)
_ = SGet RData -> Int -> SGet RData
forall a b. a -> b -> a
const do
FilePath -> SGet RData
forall a. FilePath -> SGet a
failSGet (FilePath -> SGet RData) -> FilePath -> SGet RData
forall a b. (a -> b) -> a -> b
$ FilePath
"Reserved RDATA type: " FilePath -> ShowS
forall a. [a] -> [a] -> [a]
++ Word16 -> FilePath
forall a. Show a => a -> FilePath
show (natToWord16 n)
instance (Nat16 n) => Presentable (Reserved n) where
present :: Reserved n -> Builder -> Builder
present Reserved n
_ = Builder -> Builder
forall a. HasCallStack => a
undefined
rdataMapEntry :: forall a -> KnownRData a => (Int, RDataCodec)
rdataMapEntry :: forall a -> KnownRData a => (Int, RDataCodec)
rdataMapEntry a =
( forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word16 (Word16 -> Int) -> (RRTYPE -> Word16) -> RRTYPE -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RRTYPE -> Word16
forall a b. Coercible a b => a -> b
coerce (RRTYPE -> Int) -> RRTYPE -> Int
forall a b. (a -> b) -> a -> b
$ rdType a
, Proxy a -> RDataExtensionVal a -> RDataCodec
forall a.
KnownRData a =>
Proxy a -> RDataExtensionVal a -> RDataCodec
RDataCodec (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) (rdataExtensionVal a)
)
reservedCodecs :: RDataMap
reservedCodecs :: IntMap RDataCodec
reservedCodecs = [(Int, RDataCodec)] -> IntMap RDataCodec
forall a. [(Int, a)] -> IntMap a
IM.fromList
[ rdataMapEntry (Reserved 0)
, rdataMapEntry (Reserved 41)
, rdataMapEntry (Reserved 128)
, rdataMapEntry (Reserved 249)
, rdataMapEntry (Reserved 250)
, rdataMapEntry (Reserved 251)
, rdataMapEntry (Reserved 252)
, rdataMapEntry (Reserved 253)
, rdataMapEntry (Reserved 254)
, rdataMapEntry (Reserved 255)
, rdataMapEntry (Reserved 65535)
]
defaultCodecs :: RDataMap
defaultCodecs :: IntMap RDataCodec
defaultCodecs = [(Int, RDataCodec)] -> IntMap RDataCodec
forall a. [(Int, a)] -> IntMap a
IM.fromList
[ rdataMapEntry T_a
, rdataMapEntry T_ns
, rdataMapEntry T_md
, rdataMapEntry T_mf
, rdataMapEntry T_cname
, rdataMapEntry T_soa
, rdataMapEntry T_mb
, rdataMapEntry T_mg
, rdataMapEntry T_mr
, rdataMapEntry T_null
, rdataMapEntry T_wks
, rdataMapEntry T_ptr
, rdataMapEntry T_hinfo
, rdataMapEntry T_minfo
, rdataMapEntry T_mx
, rdataMapEntry T_txt
, rdataMapEntry T_rp
, rdataMapEntry T_afsdb
, rdataMapEntry T_x25
, rdataMapEntry T_isdn
, rdataMapEntry T_rt
, rdataMapEntry T_nsap
, rdataMapEntry T_nsapptr
, rdataMapEntry T_sig
, rdataMapEntry T_key
, rdataMapEntry T_px
, rdataMapEntry T_gpos
, rdataMapEntry T_aaaa
, rdataMapEntry T_nxt
, rdataMapEntry T_srv
, rdataMapEntry T_naptr
, rdataMapEntry T_kx
, rdataMapEntry T_a6
, rdataMapEntry T_dname
, rdataMapEntry T_ds
, rdataMapEntry T_sshfp
, rdataMapEntry T_ipseckey
, rdataMapEntry T_rrsig
, rdataMapEntry T_nsec
, rdataMapEntry T_dnskey
, rdataMapEntry T_nsec3
, rdataMapEntry T_nsec3param
, rdataMapEntry T_tlsa
, rdataMapEntry T_smimea
, rdataMapEntry T_cds
, rdataMapEntry T_cdnskey
, rdataMapEntry T_openpgpkey
, rdataMapEntry T_csync
, rdataMapEntry T_zonemd
, rdataMapEntry T_svcb
, rdataMapEntry T_https
, rdataMapEntry T_dsync
, rdataMapEntry T_nid
, rdataMapEntry T_l32
, rdataMapEntry T_l64
, rdataMapEntry T_lp
, rdataMapEntry T_caa
, rdataMapEntry T_amtrelay
]
baseOptions :: OptionMap
baseOptions :: IntMap OptionCodec
baseOptions = [(Int, OptionCodec)] -> IntMap OptionCodec
forall a. [(Int, a)] -> IntMap a
IM.fromList
[ optMapEntry O_nsid
, optMapEntry O_dau
, optMapEntry O_dhu
, optMapEntry O_n3u
, optMapEntry O_ecs
, optMapEntry O_ede
]
where
optMapEntry :: forall a -> KnownEdnsOption a => (Int, OptionCodec)
optMapEntry :: forall a -> KnownEdnsOption a => (Int, OptionCodec)
optMapEntry a =
( forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word16 (Word16 -> Int) -> (OptNum -> Word16) -> OptNum -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OptNum -> Word16
forall a b. Coercible a b => a -> b
coerce (OptNum -> Int) -> OptNum -> Int
forall a b. (a -> b) -> a -> b
$ optNum a
, Proxy a -> OptionExtensionVal a -> OptionCodec
forall a.
KnownEdnsOption a =>
Proxy a -> OptionExtensionVal a -> OptionCodec
OptionCodec (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) (optionExtensionVal a)
)