From b9716d5150017b92dfe9c2d3af4c21f900ce1b4e Mon Sep 17 00:00:00 2001 From: Technorama team Date: Mon, 3 May 2004 20:57:51 +0000 Subject: add support for read(len, str) --- lib/openssl/buffering.rb | 14 +++++++++----- ossl_ssl.c | 24 +++++++++++++++++------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/lib/openssl/buffering.rb b/lib/openssl/buffering.rb index f07e5bc..95afd78 100644 --- a/lib/openssl/buffering.rb +++ b/lib/openssl/buffering.rb @@ -36,28 +36,32 @@ module Buffering end end - def consume_rbuff(size=nil) + def consume_rbuff(size=nil, str=nil) if @rbuffer.size == 0 @eof = nil nil else size = @rbuffer.size unless size - ret = @rbuffer[0, size] + if str + str[0, str.size] = @rbuffer[0, size] + else + str = @rbuffer[0, size] + end @rbuffer[0, size] = "" - ret + str end end public - def read(size=nil) + def read(size=nil, str=nil) fill_rbuff unless defined? @rbuffer @eof ||= nil until @eof break if size && size <= @rbuffer.size fill_rbuff end - consume_rbuff(size) + consume_rbuff(size, str) end def gets(eol=$/) diff --git a/ossl_ssl.c b/ossl_ssl.c index 3f25a07..febf767 100644 --- a/ossl_ssl.c +++ b/ossl_ssl.c @@ -445,16 +445,25 @@ ossl_ssl_accept(VALUE self) } static VALUE -ossl_ssl_read(VALUE self, VALUE len) +ossl_ssl_read(int argc, VALUE *argv, VALUE self) { SSL *ssl; - int ilen, nread = 0; - VALUE str; + long ilen, nread = 0; + VALUE str, len; OpenFile *fptr; + rb_scan_args(argc, argv, "11", &len, &str); + Data_Get_Struct(self, SSL, ssl); - ilen = NUM2INT(len); - str = rb_str_new(0, ilen); + ilen = NUM2LONG(len); + if (NIL_P(str)) { + str = rb_str_new(0, ilen); + } else { + StringValue(str); + rb_str_modify(str); + rb_str_resize(str, ilen); + } + if (ilen == 0) return str; if (ssl) { nread = SSL_read(ssl, RSTRING(str)->ptr, RSTRING(str)->len); @@ -475,7 +484,8 @@ ossl_ssl_read(VALUE self, VALUE len) } if (nread == 0) { - ossl_raise(rb_eEOFError, "End of file reached"); + rb_str_resize(str, 0); + rb_eof_error(); } RSTRING(str)->len = nread; @@ -641,7 +651,7 @@ Init_ossl_ssl() rb_define_method(cSSLSocket, "initialize", ossl_ssl_initialize, -1); rb_define_method(cSSLSocket, "connect", ossl_ssl_connect, 0); rb_define_method(cSSLSocket, "accept", ossl_ssl_accept, 0); - rb_define_method(cSSLSocket, "sysread", ossl_ssl_read, 1); + rb_define_method(cSSLSocket, "sysread", ossl_ssl_read, -1); rb_define_method(cSSLSocket, "syswrite", ossl_ssl_write, 1); rb_define_method(cSSLSocket, "sysclose", ossl_ssl_close, 0); rb_define_method(cSSLSocket, "cert", ossl_ssl_get_cert, 0); -- cgit v1.2.3