diff options
author | tv <tv@krebsco.de> | 2016-11-04 23:42:34 +0100 |
---|---|---|
committer | tv <tv@krebsco.de> | 2016-11-04 23:42:34 +0100 |
commit | d63a423abbfa2789024ddec4d3585d154610c958 (patch) | |
tree | 515f41c96fe5d36065db155a79291c1a3e14a6e1 /loldns.hs |
Diffstat (limited to 'loldns.hs')
-rw-r--r-- | loldns.hs | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/loldns.hs b/loldns.hs new file mode 100644 index 0000000..81a1aa8 --- /dev/null +++ b/loldns.hs @@ -0,0 +1,69 @@ +module Main (main) where + +import Control.Concurrent +import Control.Exception +import Control.Monad +import Data.Maybe +import Network.DNS.Decode +import Network.DNS.Encode +import Network.DNS.Types +import Network.Socket.ByteString (recvFrom,sendAllTo) +import Network.Socket hiding (recvFrom) +import System.Environment +import qualified Data.ByteString.Lazy as LBS + +import Database (Database) + +import qualified Config +import qualified Database + + +main :: IO () +main = do + [confPath,dbPath] <- getArgs + c <- Config.readFile "test.conf" + db <- Database.readFile "test.db" + addrinfos <- + getAddrInfo + (Just (defaultHints { addrFlags = [AI_PASSIVE] })) + Nothing + (Just (Config.port c)) + addrinfo <- maybe (fail "no addr info") return (listToMaybe addrinfos) + bracket + (socket (addrFamily addrinfo) Datagram defaultProtocol) + (close) + $ \sock -> do + bind sock (addrAddress addrinfo) + forever $ do + (s, addr) <- recvFrom sock (Config.bufSize c) + forkIO $ do + either + (putStrLn . ("decode error: " ++)) + (\req -> do + let res = handleRequest db req + sendAllTo sock (LBS.toStrict (encode res)) addr) + (decode (LBS.fromStrict s)) + +handleRequest :: Database -> DNSMessage -> DNSMessage +handleRequest db DNSMessage{question=qs,header=DNSHeader{identifier=i}} = + DNSMessage + { header = DNSHeader + { identifier = i + , flags = DNSFlags + { qOrR = QR_Response + , opcode = OP_STD + , authAnswer = True + , trunCation = False + , recDesired = True + , recAvailable = False + , rcode = if length as == 0 then NameErr else NoErr + , authenData = False + } + } + , question = qs + , answer = as + , authority = [] + , additional = [] + } + where + as = concatMap (flip Database.lookup db) qs |