Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: bdab5feecfe5
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: e0dea10070ae
Choose a head ref
  • 15 commits
  • 21 files changed
  • 1 contributor

Commits on Oct 2, 2016

  1. Copy the full SHA
    de5ddaa View commit details
  2. Copy the full SHA
    c4d28c0 View commit details
  3. Copy the full SHA
    cbd1d0b View commit details
  4. [Truffle] Typed data does end up reading from 16 and writing to 2 - b…

    …ut I'll at least comment that.
    chrisseaton committed Oct 2, 2016
    Copy the full SHA
    278a241 View commit details
  5. Copy the full SHA
    26b1628 View commit details
  6. Copy the full SHA
    d9d82dc View commit details
  7. [Truffle] Have our scan args variants accept the format so they're mo…

    …re of a drop-in replacement.
    chrisseaton committed Oct 2, 2016
    Copy the full SHA
    5d592a3 View commit details
  8. Copy the full SHA
    c46fb3d View commit details
  9. [Truffle] Treat foreign objects as a special class Truffle::Interop::…

    …Foreign, so they have a basic inspect.
    chrisseaton committed Oct 2, 2016
    2
    Copy the full SHA
    bd48e62 View commit details
  10. Copy the full SHA
    cc08520 View commit details
  11. Copy the full SHA
    1e75647 View commit details
  12. Copy the full SHA
    50b952c View commit details
  13. 1
    Copy the full SHA
    285243b View commit details
  14. Copy the full SHA
    4a43521 View commit details

Commits on Oct 3, 2016

  1. Copy the full SHA
    e0dea10 View commit details
12 changes: 5 additions & 7 deletions lib/ruby/truffle/cext/ruby.h
Original file line number Diff line number Diff line change
@@ -470,18 +470,18 @@ VALUE rb_proc_new(void *function, VALUE value);
void rb_warn(const char *fmt, ...);
void rb_warning(const char *fmt, ...);

MUST_INLINE int rb_jt_scan_args_0_HASH(int argc, VALUE *argv, VALUE *v1) {
MUST_INLINE int rb_jt_scan_args_0_HASH(int argc, VALUE *argv, const char *format, VALUE *v1) {
if (argc >= 1) *v1 = argv[0];
return argc;
}

MUST_INLINE int rb_jt_scan_args_02(int argc, VALUE *argv, VALUE *v1, VALUE *v2) {
MUST_INLINE int rb_jt_scan_args_02(int argc, VALUE *argv, const char *format, VALUE *v1, VALUE *v2) {
if (argc >= 1) *v1 = argv[0];
if (argc >= 2) *v2 = argv[1];
return argc;
}

MUST_INLINE int rb_jt_scan_args_11(int argc, VALUE *argv, VALUE *v1, VALUE *v2) {
MUST_INLINE int rb_jt_scan_args_11(int argc, VALUE *argv, const char *format, VALUE *v1, VALUE *v2) {
if (argc < 1) {
rb_jt_error("rb_jt_scan_args_11 error case not implemented");
abort();
@@ -667,7 +667,7 @@ void rb_fd_fix_cloexec(int fd);

int rb_jt_io_handle(VALUE file);

#define GetOpenFile(file, pointer) ((pointer)->fd = rb_jt_io_handle(file))
#define GetOpenFile(file, pointer) ((pointer) = truffle_managed_malloc(sizeof(rb_io_t)), (pointer)->fd = rb_jt_io_handle(file))

int rb_io_wait_readable(int fd);
int rb_io_wait_writable(int fd);
@@ -722,9 +722,7 @@ struct RTypedData {

#define RUBY_TYPED_FREE_IMMEDIATELY 1

struct RTypedData *rb_jt_adapt_rtypeddata(VALUE value);

#define RTYPEDDATA(value) rb_jt_adapt_rtypeddata(value)
#define RTYPEDDATA(value) ((struct RTypedData *)RDATA(value))

#define RTYPEDDATA_DATA(value) (RTYPEDDATA(value)->data)

8 changes: 4 additions & 4 deletions truffle/src/main/c/cext/ruby.c
Original file line number Diff line number Diff line change
@@ -683,20 +683,20 @@ VALUE rb_yield(VALUE value) {
// Instance variables

VALUE rb_iv_get(VALUE object, const char *name) {
return truffle_invoke(RUBY_CEXT, "rb_iv_get", object, rb_str_new_cstr(name));
return truffle_invoke(RUBY_CEXT, "rb_ivar_get", object, rb_str_new_cstr(name));
}

VALUE rb_iv_set(VALUE object, const char *name, VALUE value) {
truffle_invoke(RUBY_CEXT, "rb_iv_set", object, rb_str_new_cstr(name), value);
truffle_invoke(RUBY_CEXT, "rb_ivar_set", object, rb_str_new_cstr(name), value);
return value;
}

VALUE rb_ivar_get(VALUE object, ID name) {
return truffle_read(object, name);
return truffle_invoke(RUBY_CEXT, "rb_ivar_get", object, name);
}

VALUE rb_ivar_set(VALUE object, ID name, VALUE value) {
truffle_write(object, name, value);
truffle_invoke(RUBY_CEXT, "rb_ivar_set", object, name, value);
return value;
}

2 changes: 1 addition & 1 deletion truffle/src/main/c/openssl/.jruby-cext-build.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
src: ./*.c
cflags: -I$OPENSSL_INCLUDE -DRUBY_EXTCONF_H="extconf.h" -DHAVE_OPENSSL_110_THREADING_API -DHAVE_HMAC_CTX_COPY -DHAVE_EVP_CIPHER_CTX_COPY -DHAVE_BN_RAND_RANGE -DHAVE_BN_PSEUDO_RAND_RANGE -DHAVE_X509V3_EXT_NCONF_NID -Wall -Wno-int-conversion -Wno-int-to-pointer-cast -Wno-unused-variable -Wno-uninitialized -Werror
cflags: -I$OPENSSL_INCLUDE -DRUBY_EXTCONF_H="extconf.h" -DHAVE_OPENSSL_110_THREADING_API -DHAVE_HMAC_CTX_COPY -DHAVE_EVP_CIPHER_CTX_COPY -DHAVE_BN_RAND_RANGE -DHAVE_BN_PSEUDO_RAND_RANGE -DHAVE_X509V3_EXT_NCONF_NID -Wall -Wno-int-conversion -Wno-int-to-pointer-cast -Wno-unused-variable -Wno-uninitialized -Wno-unused-function -Werror
libs: $OPENSSL_LIB
out: ../../../../../lib/ruby/truffle/openssl/openssl.su
10 changes: 9 additions & 1 deletion truffle/src/main/c/openssl/ossl.c
Original file line number Diff line number Diff line change
@@ -524,6 +524,12 @@ static unsigned long ossl_thread_id(void)
}
#endif

#ifdef JRUBY_TRUFFLE
#define LOCKS_MALLOC truffle_managed_malloc
#else
#define LOCKS_MALLOC OPENSSL_malloc
#endif

static void Init_ossl_locks(void)
{
int i;
@@ -532,14 +538,15 @@ static void Init_ossl_locks(void)
if ((unsigned)num_locks >= INT_MAX / (int)sizeof(VALUE)) {
rb_raise(rb_eRuntimeError, "CRYPTO_num_locks() is too big: %d", num_locks);
}
ossl_locks = (rb_nativethread_lock_t *) OPENSSL_malloc(num_locks * (int)sizeof(rb_nativethread_lock_t));
ossl_locks = (rb_nativethread_lock_t *) LOCKS_MALLOC(num_locks * (int)sizeof(rb_nativethread_lock_t));
if (!ossl_locks) {
rb_raise(rb_eNoMemError, "CRYPTO_num_locks() is too big: %d", num_locks);
}
for (i = 0; i < num_locks; i++) {
rb_nativethread_lock_initialize(&ossl_locks[i]);
}

#ifndef JRUBY_TRUFFLE // FIXME
#ifdef HAVE_CRYPTO_THREADID_PTR
CRYPTO_THREADID_set_callback(ossl_threadid_func);
#else
@@ -549,6 +556,7 @@ static void Init_ossl_locks(void)
CRYPTO_set_dynlock_create_callback(ossl_dyn_create_callback);
CRYPTO_set_dynlock_lock_callback(ossl_dyn_lock_callback);
CRYPTO_set_dynlock_destroy_callback(ossl_dyn_destroy_callback);
#endif
}

/*
24 changes: 24 additions & 0 deletions truffle/src/main/c/openssl/ossl.h
Original file line number Diff line number Diff line change
@@ -215,6 +215,30 @@ void ossl_debug(const char *, ...);
#define OSSL_Warn rb_warn
#endif

#ifdef JRUBY_TRUFFLE
#define WRITE_EX_DATA(data) rb_jt_to_native_handle(data)
#define READ_EX_DATA(data) rb_jt_from_native_handle(data)
#else
#define WRITE_EX_DATA(data) ((void *)(data))
#define READ_EX_DATA(data) (data)
#endif

#ifdef JRUBY_TRUFFLE
#define RB_SCAN_ARGS_0_HASH rb_jt_scan_args_0_HASH
#define RB_SCAN_ARGS_02 rb_jt_scan_args_02
#define RB_SCAN_ARGS_11 rb_jt_scan_args_11
#else
#define RB_SCAN_ARGS_0_HASH rb_scan_args
#define RB_SCAN_ARGS_02 rb_scan_args
#define RB_SCAN_ARGS_11 rb_scan_args
#endif

#ifdef JRUBY_TRUFFLE
#define CALLBACK(function) NULL
#else
#define CALLBACK(function) (function)
#endif

/*
* Include all parts
*/
79 changes: 76 additions & 3 deletions truffle/src/main/c/openssl/ossl_asn1.c
Original file line number Diff line number Diff line change
@@ -494,6 +494,43 @@ typedef struct {
VALUE *klass;
} ossl_asn1_info_t;

#ifdef JRUBY_TRUFFLE
static const ossl_asn1_info_t ossl_asn1_info[] = {
{ "EOC", NULL, }, /* 0 */
{ "BOOLEAN", NULL, }, /* 1 */
{ "INTEGER", NULL, }, /* 2 */
{ "BIT_STRING", NULL, }, /* 3 */
{ "OCTET_STRING", NULL, }, /* 4 */
{ "NULL", NULL, }, /* 5 */
{ "OBJECT", NULL, }, /* 6 */
{ "OBJECT_DESCRIPTOR", NULL, }, /* 7 */
{ "EXTERNAL", NULL, }, /* 8 */
{ "REAL", NULL, }, /* 9 */
{ "ENUMERATED", NULL, }, /* 10 */
{ "EMBEDDED_PDV", NULL, }, /* 11 */
{ "UTF8STRING", NULL, }, /* 12 */
{ "RELATIVE_OID", NULL, }, /* 13 */
{ "[UNIVERSAL 14]", NULL, }, /* 14 */
{ "[UNIVERSAL 15]", NULL, }, /* 15 */
{ "SEQUENCE", NULL, }, /* 16 */
{ "SET", NULL, }, /* 17 */
{ "NUMERICSTRING", NULL, }, /* 18 */
{ "PRINTABLESTRING", NULL, }, /* 19 */
{ "T61STRING", NULL, }, /* 20 */
{ "VIDEOTEXSTRING", NULL, }, /* 21 */
{ "IA5STRING", NULL, }, /* 22 */
{ "UTCTIME", NULL, }, /* 23 */
{ "GENERALIZEDTIME", NULL, }, /* 24 */
{ "GRAPHICSTRING", NULL, }, /* 25 */
{ "ISO64STRING", NULL, }, /* 26 */
{ "GENERALSTRING", NULL, }, /* 27 */
{ "UNIVERSALSTRING", NULL, }, /* 28 */
{ "CHARACTER_STRING", NULL, }, /* 29 */
{ "BMPSTRING", NULL, }, /* 30 */
};
static VALUE *ossl_asn1_info_klasses;
#define OSSL_ASN1_KLASS(tag) (&ossl_asn1_info_klasses[(tag)])
#else
static const ossl_asn1_info_t ossl_asn1_info[] = {
{ "EOC", &cASN1EndOfContent, }, /* 0 */
{ "BOOLEAN", &cASN1Boolean, }, /* 1 */
@@ -527,6 +564,8 @@ static const ossl_asn1_info_t ossl_asn1_info[] = {
{ "CHARACTER_STRING", NULL, }, /* 29 */
{ "BMPSTRING", &cASN1BMPString, }, /* 30 */
};
#define OSSL_ASN1_KLASS(tag) (ossl_asn1_info[(tag)].klass)
#endif

enum {ossl_asn1_info_size = (sizeof(ossl_asn1_info)/sizeof(ossl_asn1_info[0]))};

@@ -842,8 +881,8 @@ int_ossl_asn1_decode0_prim(unsigned char **pp, long length, long hlen, int tag,
*pp += hlen + length;
*num_read = hlen + length;

if (tc == sUNIVERSAL && tag < ossl_asn1_info_size && ossl_asn1_info[tag].klass) {
VALUE klass = *ossl_asn1_info[tag].klass;
if (tc == sUNIVERSAL && tag < ossl_asn1_info_size && OSSL_ASN1_KLASS(tag)) {
VALUE klass = *OSSL_ASN1_KLASS(tag);
VALUE args[4];
args[0] = value;
args[1] = INT2NUM(tag);
@@ -907,7 +946,7 @@ int_ossl_asn1_decode0_cons(unsigned char **pp, long max_len, long length,
}
}
else {
VALUE klass = *ossl_asn1_info[tag].klass;
VALUE klass = *OSSL_ASN1_KLASS(tag);
asn1data = rb_obj_alloc(klass);
}
args[0] = ary;
@@ -1957,6 +1996,40 @@ do{\

OSSL_ASN1_DEFINE_CLASS(EndOfContent, Data);

#ifdef JRUBY_TRUFFLE
ossl_asn1_info_klasses = (VALUE *)truffle_managed_malloc(ossl_asn1_info_size * sizeof(VALUE));
ossl_asn1_info_klasses[0] = cASN1EndOfContent;
ossl_asn1_info_klasses[1] = cASN1Boolean;
ossl_asn1_info_klasses[2] = cASN1Integer;
ossl_asn1_info_klasses[3] = cASN1BitString;
ossl_asn1_info_klasses[4] = cASN1OctetString;
ossl_asn1_info_klasses[5] = cASN1Null;
ossl_asn1_info_klasses[6] = cASN1ObjectId;
ossl_asn1_info_klasses[7] = NULL;
ossl_asn1_info_klasses[8] = NULL;
ossl_asn1_info_klasses[9] = NULL;
ossl_asn1_info_klasses[10] = cASN1Enumerated;
ossl_asn1_info_klasses[11] = NULL;
ossl_asn1_info_klasses[12] = cASN1UTF8String;
ossl_asn1_info_klasses[13] = NULL;
ossl_asn1_info_klasses[14] = NULL;
ossl_asn1_info_klasses[15] = NULL;
ossl_asn1_info_klasses[16] = cASN1Sequence;
ossl_asn1_info_klasses[17] = cASN1Set;
ossl_asn1_info_klasses[18] = cASN1NumericString;
ossl_asn1_info_klasses[19] = cASN1PrintableString;
ossl_asn1_info_klasses[20] = cASN1T61String;
ossl_asn1_info_klasses[21] = cASN1VideotexString;
ossl_asn1_info_klasses[22] = cASN1IA5String;
ossl_asn1_info_klasses[23] = cASN1UTCTime;
ossl_asn1_info_klasses[24] = cASN1GeneralizedTime;
ossl_asn1_info_klasses[25] = cASN1GraphicString;
ossl_asn1_info_klasses[26] = cASN1ISO64String;
ossl_asn1_info_klasses[27] = cASN1GeneralString;
ossl_asn1_info_klasses[28] = cASN1UniversalString;
ossl_asn1_info_klasses[29] = NULL;
ossl_asn1_info_klasses[30] = cASN1BMPString;
#endif

/* Document-class: OpenSSL::ASN1::ObjectId
*
2 changes: 1 addition & 1 deletion truffle/src/main/c/openssl/ossl_pkey_dh.c
Original file line number Diff line number Diff line change
@@ -212,7 +212,7 @@ ossl_dh_initialize(int argc, VALUE *argv, VALUE self)
VALUE arg, gen;

GetPKey(self, pkey);
if(rb_scan_args(argc, argv, "02", &arg, &gen) == 0) {
if(RB_SCAN_ARGS_02(argc, argv, "02", &arg, &gen) == 0) {
dh = DH_new();
}
else if (FIXNUM_P(arg)) {
38 changes: 19 additions & 19 deletions truffle/src/main/c/openssl/ossl_ssl.c
Original file line number Diff line number Diff line change
@@ -159,7 +159,7 @@ ossl_sslctx_s_alloc(VALUE klass)
}
SSL_CTX_set_mode(ctx, mode);
RTYPEDDATA_DATA(obj) = ctx;
SSL_CTX_set_ex_data(ctx, ossl_ssl_ex_ptr_idx, (void*)obj);
SSL_CTX_set_ex_data(ctx, ossl_ssl_ex_ptr_idx, WRITE_EX_DATA(obj));

return obj;
}
@@ -222,7 +222,7 @@ ossl_client_cert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey)
{
VALUE obj, success;

obj = (VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx);
obj = (VALUE)READ_EX_DATA(SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx));
success = rb_protect(ossl_call_client_cert_cb, obj, NULL);
if (!RTEST(success)) return 0;
*x509 = DupX509CertPtr(ossl_ssl_get_x509(obj));
@@ -253,7 +253,7 @@ ossl_tmp_dh_callback(SSL *ssl, int is_export, int keylength)
{
VALUE args, dh, rb_ssl;

rb_ssl = (VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx);
rb_ssl = (VALUE)READ_EX_DATA(SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx));

args = rb_ary_new_from_args(3, rb_ssl, INT2FIX(is_export), INT2FIX(keylength));

@@ -287,7 +287,7 @@ ossl_tmp_ecdh_callback(SSL *ssl, int is_export, int keylength)
{
VALUE args, ecdh, rb_ssl;

rb_ssl = (VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx);
rb_ssl = (VALUE)READ_EX_DATA(SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx));

args = rb_ary_new_from_args(3, rb_ssl, INT2FIX(is_export), INT2FIX(keylength));

@@ -306,8 +306,8 @@ ossl_ssl_verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
SSL *ssl;

ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
cb = (VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_vcb_idx);
X509_STORE_CTX_set_ex_data(ctx, ossl_verify_cb_idx, (void*)cb);
cb = (VALUE)READ_EX_DATA(SSL_get_ex_data(ssl, ossl_ssl_ex_vcb_idx));
X509_STORE_CTX_set_ex_data(ctx, ossl_verify_cb_idx, WRITE_EX_DATA(cb));
return ossl_verify_cb(preverify_ok, ctx);
}

@@ -335,7 +335,7 @@ ossl_sslctx_session_get_cb(SSL *ssl, unsigned char *buf, int len, int *copy)
int state = 0;

OSSL_Debug("SSL SESSION get callback entered");
if ((ptr = SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx)) == NULL)
if ((ptr = READ_EX_DATA(SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx))) == NULL)
return NULL;
ssl_obj = (VALUE)ptr;
ary = rb_ary_new2(2);
@@ -707,12 +707,12 @@ ossl_sslctx_setup(VALUE self)
GetSSLCTX(self, ctx);

#if !defined(OPENSSL_NO_DH)
SSL_CTX_set_tmp_dh_callback(ctx, ossl_tmp_dh_callback);
SSL_CTX_set_tmp_dh_callback(ctx, CALLBACK(ossl_tmp_dh_callback));
#endif

#if !defined(OPENSSL_NO_EC)
if (RTEST(ossl_sslctx_get_tmp_ecdh_cb(self))){
SSL_CTX_set_tmp_ecdh_callback(ctx, ossl_tmp_ecdh_callback);
SSL_CTX_set_tmp_ecdh_callback(ctx, CALLBACK(ossl_tmp_ecdh_callback));
}
#endif

@@ -784,9 +784,9 @@ ossl_sslctx_setup(VALUE self)

val = ossl_sslctx_get_verify_mode(self);
verify_mode = NIL_P(val) ? SSL_VERIFY_NONE : NUM2INT(val);
SSL_CTX_set_verify(ctx, verify_mode, ossl_ssl_verify_callback);
SSL_CTX_set_verify(ctx, verify_mode, CALLBACK(ossl_ssl_verify_callback));
if (RTEST(ossl_sslctx_get_client_cert_cb(self)))
SSL_CTX_set_client_cert_cb(ctx, ossl_client_cert_cb);
SSL_CTX_set_client_cert_cb(ctx, CALLBACK(ossl_client_cert_cb));

val = ossl_sslctx_get_timeout(self);
if(!NIL_P(val)) SSL_CTX_set_timeout(ctx, NUM2LONG(val));
@@ -832,22 +832,22 @@ ossl_sslctx_setup(VALUE self)
}

if (RTEST(rb_iv_get(self, "@session_get_cb"))) {
SSL_CTX_sess_set_get_cb(ctx, ossl_sslctx_session_get_cb);
SSL_CTX_sess_set_get_cb(ctx, CALLBACK(ossl_sslctx_session_get_cb));
OSSL_Debug("SSL SESSION get callback added");
}
if (RTEST(rb_iv_get(self, "@session_new_cb"))) {
SSL_CTX_sess_set_new_cb(ctx, ossl_sslctx_session_new_cb);
SSL_CTX_sess_set_new_cb(ctx, CALLBACK(ossl_sslctx_session_new_cb));
OSSL_Debug("SSL SESSION new callback added");
}
if (RTEST(rb_iv_get(self, "@session_remove_cb"))) {
SSL_CTX_sess_set_remove_cb(ctx, ossl_sslctx_session_remove_cb);
SSL_CTX_sess_set_remove_cb(ctx, CALLBACK(ossl_sslctx_session_remove_cb));
OSSL_Debug("SSL SESSION remove callback added");
}

#ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
val = rb_iv_get(self, "@servername_cb");
if (!NIL_P(val)) {
SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
SSL_CTX_set_tlsext_servername_callback(ctx, CALLBACK(ssl_servername_cb));
OSSL_Debug("SSL TLSEXT servername callback added");
}
#endif
@@ -1218,10 +1218,10 @@ ossl_ssl_setup(VALUE self)
rb_io_check_readable(fptr);
rb_io_check_writable(fptr);
SSL_set_fd(ssl, TO_SOCKET(FPTR_TO_FD(fptr)));
SSL_set_ex_data(ssl, ossl_ssl_ex_ptr_idx, (void*)self);
SSL_set_ex_data(ssl, ossl_ssl_ex_ptr_idx, WRITE_EX_DATA(self));
cb = ossl_sslctx_get_verify_cb(v_ctx);
SSL_set_ex_data(ssl, ossl_ssl_ex_vcb_idx, (void*)cb);
SSL_set_info_callback(ssl, ssl_info_cb);
SSL_set_ex_data(ssl, ossl_ssl_ex_vcb_idx, WRITE_EX_DATA(cb));
SSL_set_info_callback(ssl, CALLBACK(ssl_info_cb));
}

return Qtrue;
@@ -1356,7 +1356,7 @@ static VALUE
ossl_ssl_connect_nonblock(int argc, VALUE *argv, VALUE self)
{
VALUE opts;
rb_scan_args(argc, argv, "0:", &opts);
RB_SCAN_ARGS_0_HASH(argc, argv, "0:", &opts);

ossl_ssl_setup(self);

Loading