aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTechnorama team <oss-ruby@technorama.net>2004-05-03 20:57:51 +0000
committerTechnorama team <oss-ruby@technorama.net>2004-05-03 20:57:51 +0000
commitb9716d5150017b92dfe9c2d3af4c21f900ce1b4e (patch)
treeb9c9f414a42ca382ee64c8e913b64385807506dc
parenta531aa5c1e2adfafe1dd804ae261dde3484b5a08 (diff)
downloadruby-openssl-history-b9716d5150017b92dfe9c2d3af4c21f900ce1b4e.tar.gz
add support for read(len, str)
-rw-r--r--lib/openssl/buffering.rb14
-rw-r--r--ossl_ssl.c24
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);