diff options
author | Benjamin Barenblat <bbaren@google.com> | 2018-08-31 19:00:53 -0400 |
---|---|---|
committer | Benjamin Barenblat <bbaren@google.com> | 2018-08-31 19:00:53 -0400 |
commit | 92a90ad43381f6897a93503027d67ac0b1032f3e (patch) | |
tree | 404980b84bfca20774d8825b3f28d3b9abffc204 /src/BTLS/Result.hs | |
parent | 1349d89b03ccdae4594e3e5605eec83bc4efddb4 (diff) |
Begin wrapping BoringSSL’s error type
Diffstat (limited to 'src/BTLS/Result.hs')
-rw-r--r-- | src/BTLS/Result.hs | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/BTLS/Result.hs b/src/BTLS/Result.hs index 6cac7b9..7cd5839 100644 --- a/src/BTLS/Result.hs +++ b/src/BTLS/Result.hs @@ -12,14 +12,43 @@ -- License for the specific language governing permissions and limitations under -- the License. -module BTLS.Result where +module BTLS.Result + ( alwaysSucceeds, requireSuccess + , Error, file, line, errorData, errorDataIsHumanReadable + ) where import Control.Exception (assert) import Control.Monad (when) +import Data.Bits ((.&.)) +import Data.ByteString (ByteString) +import Foreign (allocaArray) +import Foreign.C.String (peekCString) import Foreign.C.Types +import Foreign.Marshal.Unsafe (unsafeLocalState) + +import BTLS.BoringSSL.Err alwaysSucceeds :: CInt -> IO () alwaysSucceeds r = assert (r == 1) (return ()) requireSuccess :: CInt -> IO () requireSuccess r = when (r /= 1) $ ioError (userError "BoringSSL failure") + +data Error = Error + { err :: Err + , file :: FilePath + , line :: Int + , errorData :: Maybe ByteString + , flags :: CInt + } deriving Eq + +errorDataIsHumanReadable :: Error -> Bool +errorDataIsHumanReadable e = flags e .&. errFlagString == 1 + +instance Show Error where + show e = + let len = 120 in + unsafeLocalState $ + allocaArray len $ \pOut -> do + errErrorStringN (err e) pOut len + peekCString pOut |