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

ruby-changes:9717

From: akr <ko1@a...>
Date: Fri, 2 Jan 2009 01:16:31 +0900 (JST)
Subject: [ruby-changes:9717] Ruby:r21258 (trunk): * ext/socket/socket.c (level_arg): defined.

akr	2009-01-02 01:16:08 +0900 (Fri, 02 Jan 2009)

  New Revision: 21258

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

  Log:
    * ext/socket/socket.c (level_arg): defined.
      (bsock_setsockopt): use level_arg.
      (bsock_getsockopt): ditto.
    * ext/socket/mkconstants.rb: generate level_to_int.

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/mkconstants.rb
    trunk/ext/socket/socket.c
    trunk/test/socket/test_socket.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 21257)
+++ ChangeLog	(revision 21258)
@@ -1,3 +1,11 @@
+Fri Jan  2 01:15:11 2009  Tanaka Akira  <akr@f...>
+
+	* ext/socket/socket.c (level_arg): defined.
+	  (bsock_setsockopt): use level_arg.
+	  (bsock_getsockopt): ditto.
+
+	* ext/socket/mkconstants.rb: generate level_to_int.
+
 Fri Jan  2 00:58:40 2009  Tanaka Akira  <akr@f...>
 
 	* ext/socket/socket.c (family_arg): accept symbols as well.
Index: ext/socket/mkconstants.rb
===================================================================
--- ext/socket/mkconstants.rb	(revision 21257)
+++ ext/socket/mkconstants.rb	(revision 21258)
@@ -151,6 +151,12 @@
 <%= gen_name_to_int("str", "len", "valp", /\ASOCK_/) %>
 }
 
+static int
+level_to_int(char *str, int len, int *valp)
+{
+<%= gen_name_to_int("str", "len", "valp", /\A(SOL_SOCKET\z|IPPROTO_)/) %>
+}
+
 static char *
 family_to_str(int val)
 {
Index: ext/socket/socket.c
===================================================================
--- ext/socket/socket.c	(revision 21257)
+++ ext/socket/socket.c	(revision 21258)
@@ -294,7 +294,33 @@
     return ret;
 }
 
+static int
+level_arg(VALUE level)
+{
+    /* convert SOL_SOCKET, IPPROTO_TCP, etc. */
+    VALUE tmp;
+    char *ptr;
+    int ret;
 
+    if (SYMBOL_P(level)) {
+        level = rb_sym_to_s(level);
+        goto str;
+    }
+    else if (!NIL_P(tmp = rb_check_string_type(level))) {
+	level = tmp;
+      str:
+	rb_check_safe_obj(level);
+	ptr = RSTRING_PTR(level);
+        if (level_to_int(ptr, RSTRING_LEN(level), &ret) == -1)
+	    rb_raise(rb_eSocket, "unknown protocol level %s", ptr);
+    }
+    else {
+	ret = NUM2INT(level);
+    }
+
+    return ret;
+}
+
 static VALUE
 init_sock(VALUE sock, int fd)
 {
@@ -440,7 +466,7 @@
     int vlen;
 
     rb_secure(2);
-    level = NUM2INT(lev);
+    level = level_arg(lev);
     option = NUM2INT(optname);
 
     switch (TYPE(val)) {
@@ -520,7 +546,7 @@
     char *buf;
     rb_io_t *fptr;
 
-    level = NUM2INT(lev);
+    level = level_arg(lev);
     option = NUM2INT(optname);
     len = 256;
     buf = ALLOCA_N(char,len);
Index: test/socket/test_socket.rb
===================================================================
--- test/socket/test_socket.rb	(revision 21257)
+++ test/socket/test_socket.rb	(revision 21258)
@@ -16,6 +16,10 @@
     inet_stream do |s|
       n = s.getsockopt(Socket::SOL_SOCKET, Socket::SO_TYPE)
       assert_equal([Socket::SOCK_STREAM].pack("i"), n)
+      n = s.getsockopt("SOL_SOCKET", Socket::SO_TYPE)
+      assert_equal([Socket::SOCK_STREAM].pack("i"), n)
+      n = s.getsockopt(:SOL_SOCKET, Socket::SO_TYPE)
+      assert_equal([Socket::SOCK_STREAM].pack("i"), n)
       n = s.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR)
       assert_equal([0].pack("i"), n)
       val = Object.new

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

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