Blame src-exe/sha256sum.hs

Packit f46cda
{-# LANGUAGE RecordWildCards #-}
Packit f46cda
Packit f46cda
module Main where
Packit f46cda
Packit f46cda
import           Control.Monad
Packit f46cda
import qualified Data.ByteString.Base16 as B16
Packit f46cda
import qualified Data.ByteString.Char8  as B
Packit f46cda
import qualified Data.ByteString.Lazy   as BL
Packit f46cda
import           System.Console.GetOpt
Packit f46cda
import           System.Environment
Packit f46cda
import           System.Exit
Packit f46cda
import           System.IO
Packit f46cda
Packit f46cda
import qualified Crypto.Hash.SHA256     as H
Packit f46cda
Packit f46cda
Packit f46cda
data Options = Options
Packit f46cda
    { optBinary :: Bool
Packit f46cda
    , optHelp   :: Bool
Packit f46cda
    , optTag    :: Bool
Packit f46cda
    } deriving Show
Packit f46cda
Packit f46cda
defOptions :: Options
Packit f46cda
defOptions = Options
Packit f46cda
    { optBinary = True
Packit f46cda
    , optHelp = False
Packit f46cda
    , optTag  = False
Packit f46cda
    }
Packit f46cda
Packit f46cda
options :: [OptDescr (Options -> Options)]
Packit f46cda
options = [ Option ['b'] ["binary"]
Packit f46cda
            (NoArg (\o -> o { optBinary = True}))
Packit f46cda
            "read in binary mode (default)"
Packit f46cda
          , Option ['t'] ["text"]
Packit f46cda
            (NoArg (\o -> o { optBinary = False}))
Packit f46cda
            "read in text mode (ignored)"
Packit f46cda
          , Option [] ["help"]
Packit f46cda
            (NoArg (\o -> o { optHelp = True}))
Packit f46cda
            "display help and exit"
Packit f46cda
          , Option [] ["tag"]
Packit f46cda
            (NoArg (\o -> o { optTag = True}))
Packit f46cda
            "create a BSD-style checksum"
Packit f46cda
          ]
Packit f46cda
Packit f46cda
main :: IO ()
Packit f46cda
main = do
Packit f46cda
  argv <- getArgs
Packit f46cda
Packit f46cda
  let Options{..} = foldl (flip id) defOptions optset
Packit f46cda
      (optset,args0,cliErr) = getOpt Permute options argv
Packit f46cda
      args | null args0 = ["-"]
Packit f46cda
           | otherwise  = args0
Packit f46cda
Packit f46cda
  unless (null cliErr) $ do
Packit f46cda
    hPutStrLn stderr ("sha256sum: " ++ head cliErr ++ "Try 'sha256sum --help' for more information.")
Packit f46cda
    exitFailure
Packit f46cda
Packit f46cda
  when optHelp $ do
Packit f46cda
    putStrLn (usageInfo "Usage: sha256sum [OPTION]... [FILE]...\nPrint or check SHA-256 hashes\n" options)
Packit f46cda
    exitSuccess
Packit f46cda
Packit f46cda
  forM_ args $ \fn -> do
Packit f46cda
    h <- (B16.encode . H.hashlazy) `fmap` bReadFile fn
Packit f46cda
Packit f46cda
    case optTag of
Packit f46cda
      False -> do
Packit f46cda
        B.hPutStr stdout h
Packit f46cda
        hPutStrLn stdout (' ':' ':fn)
Packit f46cda
      True -> do
Packit f46cda
        hPutStrLn stdout $ concat [ "SHA256 (", fn, ") = ", B.unpack h ]
Packit f46cda
Packit f46cda
  return ()
Packit f46cda
Packit f46cda
bReadFile :: FilePath -> IO BL.ByteString
Packit f46cda
bReadFile "-" = do
Packit f46cda
  clsd <- hIsClosed stdin
Packit f46cda
  if clsd then return BL.empty else BL.getContents
Packit f46cda
bReadFile fn  = BL.readFile fn