module Data.Vhd.Lowlevel
( readHeader
, readFooter
, writeHeader
, writeFooter
) where
import Control.Applicative
import qualified Data.ByteString as B
import Data.Serialize
import Data.Vhd.Checksum
import Data.Vhd.Header
import Data.Vhd.Footer
import Prelude hiding (subtract)
import System.IO
readFooter :: FilePath -> IO (Either String Footer)
readFooter filepath = withFile filepath ReadMode $ \handle ->
decode <$> B.hGet handle 512
readHeader :: FilePath -> IO (Either String Header)
readHeader filepath = withFile filepath ReadMode $ \handle -> do
hSeek handle AbsoluteSeek 512
decode <$> B.hGet handle 1024
writeFooter :: FilePath -> Footer -> IO ()
writeFooter filePath footer = do
withFile filePath ReadWriteMode $ \handle -> do
B.hPut handle footerBs
hSeek handle SeekFromEnd 512
B.hPut handle footerBs
where
footerBs = encode $ adjustChecksum footer
writeHeader :: FilePath -> Header -> IO ()
writeHeader filePath header = do
withFile filePath ReadWriteMode $ \handle -> do
hSeek handle AbsoluteSeek 512
B.hPut handle headerBs
where
headerBs = encode $ adjustChecksum header