dnsbase-1.0.0.0: internal/Net/DNSBase/Resolver/Internal/Parser.hs
-- |
-- Module : Net.DNSBase.Resolver.Internal.Parser
-- Description : Parser for @\/etc\/resolv.conf@
-- Copyright : (c) IIJ Innovation Institute Inc., 2009
-- (c) Viktor Dukhovni, 2020-2026
-- License : BSD-3-Clause
-- Maintainer : ietf-dane@dukhovni.org
-- Stability : unstable
module Net.DNSBase.Resolver.Internal.Parser
( getDefaultNameservers
) where
import Control.Monad.Trans (lift)
import Data.Char (isSpace)
import Data.List (dropWhileEnd, stripPrefix, uncons)
import Data.Maybe (catMaybes)
import System.IO.Error (catchIOError)
import Net.DNSBase.Resolver.Internal.Types
-- XXX: this implementation is a WIP for completeness and should be improved ASAP
getDefaultNameservers :: FilePath -> DNSIO [NameserverSpec]
getDefaultNameservers fp = lift $ parseFile `catchIOError` (const $ return [])
where
parseFile :: IO [NameserverSpec]
parseFile = catMaybes . map parseLine . lines <$> readFile fp
parseLine :: String -> Maybe NameserverSpec
parseLine (stripPrefix "nameserver" -> Just rest)
| Just (h, t) <- uncons rest
, isSpace h
, name <- dropWhileEnd isSpace $ dropWhile isSpace t
, not $ null name
= Just $ NameserverSpec name Nothing
parseLine _ = Nothing