static VALUE ossl_call_servername_cb(VALUE ary) { VALUE ssl_obj, sslctx_obj, cb, ret_obj; Check_Type(ary, T_ARRAY); ssl_obj = rb_ary_entry(ary, 0); sslctx_obj = rb_iv_get(ssl_obj, "@context"); if (NIL_P(sslctx_obj)) return Qnil; cb = rb_iv_get(sslctx_obj, "@servername_cb"); if (NIL_P(cb)) return Qnil; ret_obj = rb_funcall(cb, rb_intern("call"), 1, ary); if (rb_obj_is_kind_of(ret_obj, cSSLContext)) { SSL *ssl; SSL_CTX *ctx2; ossl_sslctx_setup(ret_obj); Data_Get_Struct(ssl_obj, SSL, ssl); Data_Get_Struct(ret_obj, SSL_CTX, ctx2); SSL_set_SSL_CTX(ssl, ctx2); } else if (!NIL_P(ret_obj)) { rb_raise(rb_eArgError, "servername_cb must return an OpenSSL::SSL::SSLContext object or nil"); } return ret_obj; }
/* * call-seq: * SSLSocket.new(io) => aSSLSocket * SSLSocket.new(io, ctx) => aSSLSocket * * === Parameters * * +io+ is a real ruby IO object. Not an IO like object that responds to read/write. * * +ctx+ is an OpenSSLSSL::SSLContext. * * The OpenSSL::Buffering module provides additional IO methods. * * This method will freeze the SSLContext if one is provided; * however, session management is still allowed in the frozen SSLContext. */ static VALUE ossl_ssl_initialize(int argc, VALUE *argv, VALUE self) { VALUE io, ctx; if (rb_scan_args(argc, argv, "11", &io, &ctx) == 1) { ctx = rb_funcall(cSSLContext, rb_intern("new"), 0); } OSSL_Check_Kind(ctx, cSSLContext); Check_Type(io, T_FILE); ossl_ssl_set_io(self, io); ossl_ssl_set_ctx(self, ctx); ossl_ssl_set_sync_close(self, Qfalse); ossl_sslctx_setup(ctx); rb_call_super(0, 0); return self; }