packages feed

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