aboutsummaryrefslogtreecommitdiff
path: root/src/BTLS/Result.hs
diff options
context:
space:
mode:
authorGravatar Benjamin Barenblat <bbaren@google.com>2018-08-31 19:00:53 -0400
committerGravatar Benjamin Barenblat <bbaren@google.com>2018-08-31 19:00:53 -0400
commit92a90ad43381f6897a93503027d67ac0b1032f3e (patch)
tree404980b84bfca20774d8825b3f28d3b9abffc204 /src/BTLS/Result.hs
parent1349d89b03ccdae4594e3e5605eec83bc4efddb4 (diff)
Begin wrapping BoringSSL’s error type
Diffstat (limited to 'src/BTLS/Result.hs')
-rw-r--r--src/BTLS/Result.hs31
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