[前][次][番号順一覧][スレッド一覧]

ruby-changes:9666

From: akr <ko1@a...>
Date: Wed, 31 Dec 2008 13:52:33 +0900 (JST)
Subject: [ruby-changes:9666] Ruby:r21207 (trunk): * ext/openssl/lib/openssl/buffering.rb (Buffering#read_nonblock):

akr	2008-12-31 13:52:18 +0900 (Wed, 31 Dec 2008)

  New Revision: 21207

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21207

  Log:
    * ext/openssl/lib/openssl/buffering.rb (Buffering#read_nonblock):
      implemented.
    * ext/openssl/ossl_ssl.c (rb_sys_fail_path): removed.
      (fcntl.h): don't include.
      (ossl_ssl_read_internal): defined.
      (ossl_ssl_read): use ossl_ssl_read_internal.
      (ossl_ssl_read_nonblock): use ossl_ssl_read_internal.
      (Init_ossl_ssl): define sysread_nonblock, instead of read_nonblock.

  Modified files:
    trunk/ChangeLog
    trunk/ext/openssl/lib/openssl/buffering.rb
    trunk/ext/openssl/ossl_ssl.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 21206)
+++ ChangeLog	(revision 21207)
@@ -1,3 +1,15 @@
+Wed Dec 31 13:49:06 2008  Tanaka Akira  <akr@f...>
+
+	* ext/openssl/lib/openssl/buffering.rb (Buffering#read_nonblock):
+	  implemented.
+
+	* ext/openssl/ossl_ssl.c (rb_sys_fail_path): removed.
+	  (fcntl.h): don't include.
+	  (ossl_ssl_read_internal): defined.
+	  (ossl_ssl_read): use ossl_ssl_read_internal.
+	  (ossl_ssl_read_nonblock): use ossl_ssl_read_internal.
+	  (Init_ossl_ssl): define sysread_nonblock, instead of read_nonblock.
+
 Wed Dec 31 00:27:54 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* object.c (rb_to_float): prohibit conversion from nil to float.
Index: ext/openssl/ossl_ssl.c
===================================================================
--- ext/openssl/ossl_ssl.c	(revision 21206)
+++ ext/openssl/ossl_ssl.c	(revision 21207)
@@ -12,14 +12,6 @@
  */
 #include "ossl.h"
 
-#define rb_sys_fail_path(path) rb_sys_fail(NIL_P(path) ? 0 : RSTRING_PTR(path))
-
-#if defined(HAVE_FCNTL_H) || defined(_WIN32)
-#include <fcntl.h>
-#elif defined(HAVE_SYS_FCNTL_H)
-#include <sys/fcntl.h>
-#endif
-
 #if defined(HAVE_UNISTD_H)
 #  include <unistd.h> /* for read(), and write() */
 #endif
@@ -999,83 +991,9 @@
     return ossl_start_ssl(self, SSL_accept, "SSL_accept");
 }
 
-/*
- * call-seq:
- *    ssl.sysread(length) => string
- *    ssl.sysread(length, buffer) => buffer
- *
- * === Parameters
- * * +length+ is a positive integer.
- * * +buffer+ is a string used to store the result.
- */
 static VALUE
-ossl_ssl_read(int argc, VALUE *argv, VALUE self)
+ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
 {
-  SSL *ssl;
-  int ilen, nread = 0;
-  VALUE len, str;
-  rb_io_t *fptr;
-
-  rb_scan_args(argc, argv, "11", &len, &str);
-  ilen = NUM2INT(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;
-
-  Data_Get_Struct(self, SSL, ssl);
-  GetOpenFile(ossl_ssl_get_io(self), fptr);
-  if (ssl) {
-    if(SSL_pending(ssl) <= 0)
-      rb_thread_wait_fd(FPTR_TO_FD(fptr));
-    for (;;){
-      nread = SSL_read(ssl, RSTRING_PTR(str), RSTRING_LEN(str));
-      switch(ssl_get_error(ssl, nread)){
-        case SSL_ERROR_NONE:
-          goto end;
-        case SSL_ERROR_ZERO_RETURN:
-          rb_eof_error();
-        case SSL_ERROR_WANT_WRITE:
-          rb_io_wait_writable(FPTR_TO_FD(fptr));
-          continue;
-        case SSL_ERROR_WANT_READ:
-          rb_io_wait_readable(FPTR_TO_FD(fptr));
-          continue;
-        case SSL_ERROR_SYSCALL:
-          if(ERR_peek_error() == 0 && nread == 0) rb_eof_error();
-          rb_sys_fail(0);
-        default:
-          ossl_raise(eSSLError, "SSL_read:");
-      }
-    }
-  }
-  else {
-    rb_warning("SSL session is not started yet.");
-    return rb_funcall(ossl_ssl_get_io(self), rb_intern("read_nonblock"), 2, len, str);
-  }
-
-end:
-  rb_str_set_len(str, nread);
-  OBJ_TAINT(str);
-
-  return str;
-}
-
-/*
- * call-seq:
- *    ssl.read_nonblock(length) => string
- *    ssl.read_nonblock(length, buffer) => buffer
- *
- * === Parameters
- * * +length+ is a positive integer.
- * * +buffer+ is a string used to store the result.
- */
-static VALUE
-ossl_ssl_read_nonblock(int argc, VALUE *argv, VALUE self)
-{
     SSL *ssl;
     int ilen, nread = 0;
     VALUE len, str;
@@ -1093,20 +1011,29 @@
 
     Data_Get_Struct(self, SSL, ssl);
     GetOpenFile(ossl_ssl_get_io(self), fptr);
-    rb_io_set_nonblock(fptr);
     if (ssl) {
+	if(!nonblock && SSL_pending(ssl) <= 0)
+	    rb_thread_wait_fd(FPTR_TO_FD(fptr));
 	for (;;){
 	    nread = SSL_read(ssl, RSTRING_PTR(str), RSTRING_LEN(str));
-	    switch(SSL_get_error(ssl, nread)){
+	    switch(ssl_get_error(ssl, nread)){
 	    case SSL_ERROR_NONE:
 		goto end;
 	    case SSL_ERROR_ZERO_RETURN:
 		rb_eof_error();
 	    case SSL_ERROR_WANT_WRITE:
+                if (nonblock) {
+                    errno = EWOULDBLOCK;
+                    rb_sys_fail(0);
+                }
                 rb_io_wait_writable(FPTR_TO_FD(fptr));
                 continue;
 	    case SSL_ERROR_WANT_READ:
-	        rb_sys_fail_path(fptr->pathv);
+                if (nonblock) {
+                    errno = EWOULDBLOCK;
+                    rb_sys_fail(0);
+                }
+                rb_io_wait_readable(FPTR_TO_FD(fptr));
 		continue;
 	    case SSL_ERROR_SYSCALL:
 		if(ERR_peek_error() == 0 && nread == 0) rb_eof_error();
@@ -1117,8 +1044,9 @@
         }
     }
     else {
+        ID meth = nonblock ? rb_intern("read_nonblock") : rb_intern("sysread");
         rb_warning("SSL session is not started yet.");
-        return rb_funcall(ossl_ssl_get_io(self), rb_intern("sysread"), 2, len, str);
+        return rb_funcall(ossl_ssl_get_io(self), meth, 2, len, str);
     }
 
   end:
@@ -1128,8 +1056,40 @@
     return str;
 }
 
+
 /*
  * call-seq:
+ *    ssl.sysread(length) => string
+ *    ssl.sysread(length, buffer) => buffer
+ *
+ * === Parameters
+ * * +length+ is a positive integer.
+ * * +buffer+ is a string used to store the result.
+ */
+static VALUE
+ossl_ssl_read(int argc, VALUE *argv, VALUE self)
+{
+    return ossl_ssl_read_internal(argc, argv, self, 0);
+}
+
+/*
+ * call-seq:
+ *    ssl.sysread_nonblock(length) => string
+ *    ssl.sysread_nonblock(length, buffer) => buffer
+ *
+ * === Parameters
+ * * +length+ is a positive integer.
+ * * +buffer+ is a string used to store the result.
+ */
+static VALUE
+ossl_ssl_read_nonblock(int argc, VALUE *argv, VALUE self)
+{
+    return ossl_ssl_read_internal(argc, argv, self, 1);
+}
+
+
+/*
+ * call-seq:
  *    ssl.syswrite(string) => integer
  */
 static VALUE
@@ -1490,9 +1450,9 @@
     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_private_method(cSSLSocket, "sysread_nonblock",    ossl_ssl_read_nonblock, -1);
     rb_define_method(cSSLSocket, "syswrite",   ossl_ssl_write, 1);
     rb_define_method(cSSLSocket, "sysclose",   ossl_ssl_close, 0);
-    rb_define_method(cSSLSocket, "read_nonblock",    ossl_ssl_read_nonblock, -1);
     rb_define_method(cSSLSocket, "cert",       ossl_ssl_get_cert, 0);
     rb_define_method(cSSLSocket, "peer_cert",  ossl_ssl_get_peer_cert, 0);
     rb_define_method(cSSLSocket, "peer_cert_chain", ossl_ssl_get_peer_cert_chain, 0);
Index: ext/openssl/lib/openssl/buffering.rb
===================================================================
--- ext/openssl/lib/openssl/buffering.rb	(revision 21206)
+++ ext/openssl/lib/openssl/buffering.rb	(revision 21207)
@@ -99,6 +99,27 @@
     ret
   end
 
+  def read_nonblock(maxlen, buf=nil)
+    if maxlen == 0
+      if buf
+        buf.clear
+        return buf
+      else
+        return ""
+      end
+    end
+    if @rbuffer.empty?
+      return sysread_nonblock(maxlen, buf)
+    end
+    ret = consume_rbuff(maxlen)
+    if buf
+      buf.replace(ret)
+      ret = buf
+    end
+    raise EOFError if ret.empty?
+    ret
+  end
+
   def gets(eol=$/, limit=nil)
     idx = @rbuffer.index(eol)
     until @eof

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]