ssh-0.1: src/SSH/NetReader.hs
module SSH.NetReader where
import Control.Monad.Trans.State
import Data.Binary (decode)
import Data.Int
import Data.Word
import qualified Data.ByteString.Lazy as LBS
import SSH.Packet
import SSH.Util (fromLBS)
type NetReader = State LBS.ByteString
readByte :: NetReader Word8
readByte = fmap LBS.head (readBytes 1)
readLong :: NetReader Int32
readLong = fmap decode (readBytes 4)
readULong :: NetReader Word32
readULong = fmap decode (readBytes 4)
readInteger :: NetReader Integer
readInteger = do
len <- readULong
b <- readBytes (fromIntegral len)
return (unmpint b)
readBytes :: Int -> NetReader LBS.ByteString
readBytes n = do
p <- gets (LBS.take (fromIntegral n))
modify (LBS.drop (fromIntegral n))
return p
readLBS :: NetReader LBS.ByteString
readLBS = readULong >>= readBytes . fromIntegral
readString :: NetReader String
readString = fmap fromLBS readLBS
readBool :: NetReader Bool
readBool = readByte >>= return . (== 1)