|
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
|