]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/openssl/openssl.factor
basis: use lint.vocabs tool to trim using lists
[factor.git] / basis / openssl / openssl.factor
index 76806f9523c0151a1d0500ff17abbc6dbcb5c314..28890bedd9f1d07dcdc8a80fa98caba5f061b757 100644 (file)
@@ -1,32 +1,43 @@
 ! Copyright (C) 2007, 2008, Slava Pestov, Elie CHAFTARI.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: init kernel namespaces openssl.libcrypto openssl.libssl
-sequences ;
+USING: alien.libraries kernel math namespaces openssl.libcrypto
+openssl.libssl sequences ;
 IN: openssl
 
 ! This code is based on http://www.rtfm.com/openssl-examples/
 
+SYMBOLS: ssl-initialized? ssl-new-api? ;
+
 SINGLETON: openssl
 
 : (ssl-error-string) ( n -- string )
     ERR_clear_error f ERR_error_string ;
 
 : ssl-error-string ( -- string )
-    ERR_get_error ERR_clear_error f ERR_error_string ;
+    ERR_get_error (ssl-error-string) ;
 
-: (ssl-error) ( -- * )
+: throw-ssl-error ( -- * )
     ssl-error-string throw ;
 
 : ssl-error ( obj -- )
-    { f 0 } member? [ (ssl-error) ] when ;
+    { f 0 } member? [ throw-ssl-error ] when ;
 
-: init-ssl ( -- )
+: init-old-api ( -- )
     SSL_library_init ssl-error
     SSL_load_error_strings
-    OpenSSL_add_all_digests
-    OpenSSL_add_all_ciphers ;
+    OpenSSL_add_all_digests ;
 
-SYMBOL: ssl-initialized?
+: init-new-api ( -- )
+    0 f OPENSSL_init_ssl ssl-error
+    OPENSSL_INIT_LOAD_SSL_STRINGS
+    OPENSSL_INIT_LOAD_CRYPTO_STRINGS bitand
+    f OPENSSL_init_ssl ssl-error
+    OPENSSL_INIT_ADD_ALL_DIGESTS f OPENSSL_init_ssl ssl-error ;
+
+: init-ssl ( -- )
+    "OPENSSL_init_ssl" "libssl" dlsym? >boolean
+    [ ssl-new-api? set-global ]
+    [ [ init-new-api ] [ init-old-api ] if ] bi ;
 
 : maybe-init-ssl ( -- )
     ssl-initialized? get-global [
@@ -34,4 +45,4 @@ SYMBOL: ssl-initialized?
         t ssl-initialized? set-global
     ] unless ;
 
-[ f ssl-initialized? set-global ] "openssl" add-startup-hook
+STARTUP-HOOK: [ f ssl-initialized? set-global ]