summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Lars Kuhtz <kuhtz@cs.uni-sb.de>2012-05-10 08:55:29 -0700
committerGravatar Lars Kuhtz <kuhtz@cs.uni-sb.de>2012-05-10 08:55:29 -0700
commit08ff21f8ce61b21a2c31be0372f91ad017790f98 (patch)
treea8af3b281fbd66fb9d00bd29a7b4ed3069781672
parent163f05707ca2650b2a88847422819ff19d9447e6 (diff)
encodeRR: compute and set the value of rdlen field during encoding
-rw-r--r--Network/DNS/Encode.hs11
1 files changed, 9 insertions, 2 deletions
diff --git a/Network/DNS/Encode.hs b/Network/DNS/Encode.hs
index c3457f2..e685f51 100644
--- a/Network/DNS/Encode.hs
+++ b/Network/DNS/Encode.hs
@@ -4,6 +4,7 @@ module Network.DNS.Encode (
, composeQuery
) where
+import qualified Blaze.ByteString.Builder as BB (toByteString, fromWrite, writeInt16be)
import qualified Data.ByteString.Lazy.Char8 as BL (ByteString)
import qualified Data.ByteString.Char8 as BS (length, null, break, drop)
import Network.DNS.StateBinary
@@ -104,9 +105,15 @@ encodeRR ResourceRecord{..} =
, putInt16 (typeToInt rrtype)
, put16 1
, putInt32 rrttl
- , putInt16 rdlen
- , encodeRDATA rdata
+ , rlenRDATA
]
+ where
+ rlenRDATA = do
+ addPositionW 2 -- "simulate" putInt16
+ rDataWrite <- encodeRDATA rdata
+ let rdataLength = fromIntegral . BS.length . BB.toByteString . BB.fromWrite $ rDataWrite
+ let rlenWrite = BB.writeInt16be rdataLength
+ return rlenWrite +++ return rDataWrite
encodeRDATA :: RDATA -> SPut
encodeRDATA rd = case rd of