diff options
author | Technorama team <oss-ruby@technorama.net> | 2004-05-03 20:57:51 +0000 |
---|---|---|
committer | Technorama team <oss-ruby@technorama.net> | 2004-05-03 20:57:51 +0000 |
commit | b9716d5150017b92dfe9c2d3af4c21f900ce1b4e (patch) | |
tree | b9c9f414a42ca382ee64c8e913b64385807506dc | |
parent | a531aa5c1e2adfafe1dd804ae261dde3484b5a08 (diff) | |
download | ruby-openssl-history-b9716d5150017b92dfe9c2d3af4c21f900ce1b4e.tar.gz |
add support for read(len, str)
-rw-r--r-- | lib/openssl/buffering.rb | 14 | ||||
-rw-r--r-- | 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=$/) @@ -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); |