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

ruby-changes:9720

From: akr <ko1@a...>
Date: Fri, 2 Jan 2009 02:41:04 +0900 (JST)
Subject: [ruby-changes:9720] Ruby:r21261 (trunk): * ext/socket/socket.c (optname_arg): defined.

akr	2009-01-02 02:40:41 +0900 (Fri, 02 Jan 2009)

  New Revision: 21261

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

  Log:
    * ext/socket/socket.c (optname_arg): defined.
      (bsock_setsockopt): use optname_arg.
      (bsock_getsockopt): ditto.
    * ext/socket/mkconstants.rb: generate so_optname_to_int,
      ip_optname_to_int, ipv6_optname_to_int, tcp_optname_to_int and
      udp_optname_to_int.
      more constants.

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

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 21260)
+++ ChangeLog	(revision 21261)
@@ -1,3 +1,14 @@
+Fri Jan  2 02:39:08 2009  Tanaka Akira  <akr@f...>
+
+	* ext/socket/socket.c (optname_arg): defined.
+	  (bsock_setsockopt): use optname_arg.
+	  (bsock_getsockopt): ditto.
+
+	* ext/socket/mkconstants.rb: generate so_optname_to_int,
+	  ip_optname_to_int, ipv6_optname_to_int, tcp_optname_to_int and
+	  udp_optname_to_int.
+	  more constants.
+
 Fri Jan  2 02:08:36 2009  Tanaka Akira  <akr@f...>
 
 	* ext/socket/socket.c (constant_arg): extracted from family_arg.
Index: ext/socket/mkconstants.rb
===================================================================
--- ext/socket/mkconstants.rb	(revision 21260)
+++ ext/socket/mkconstants.rb	(revision 21261)
@@ -157,6 +157,36 @@
 <%= gen_name_to_int("str", "len", "valp", /\A(SOL_SOCKET\z|IPPROTO_)/) %>
 }
 
+static int
+so_optname_to_int(char *str, int len, int *valp)
+{
+<%= gen_name_to_int("str", "len", "valp", /\ASO_/) %>
+}
+
+static int
+ip_optname_to_int(char *str, int len, int *valp)
+{
+<%= gen_name_to_int("str", "len", "valp", /\AIP_/) %>
+}
+
+static int
+ipv6_optname_to_int(char *str, int len, int *valp)
+{
+<%= gen_name_to_int("str", "len", "valp", /\AIPV6_/) %>
+}
+
+static int
+tcp_optname_to_int(char *str, int len, int *valp)
+{
+<%= gen_name_to_int("str", "len", "valp", /\ATCP_/) %>
+}
+
+static int
+udp_optname_to_int(char *str, int len, int *valp)
+{
+<%= gen_name_to_int("str", "len", "valp", /\AUDP_/) %>
+}
+
 static char *
 family_to_str(int val)
 {
@@ -335,6 +365,13 @@
 IP_RECVRETOPTS
 IP_RECVDSTADDR
 IP_RETOPTS
+IP_MINTTL
+IP_DONTFRAG
+IP_SENDSRCADDR
+IP_ONESBCAST
+IP_RECVTTL
+IP_RECVIF
+IP_PORTRANGE
 IP_MULTICAST_IF
 IP_MULTICAST_TTL
 IP_MULTICAST_LOOP
@@ -390,7 +427,22 @@
 
 TCP_NODELAY
 TCP_MAXSEG
+TCP_CORK
+TCP_DEFER_ACCEPT
+TCP_INFO
+TCP_KEEPCNT
+TCP_KEEPIDLE
+TCP_KEEPINTVL
+TCP_LINGER2
+TCP_MD5SIG
+TCP_NOOPT
+TCP_NOPUSH
+TCP_QUICKACK
+TCP_SYNCNT
+TCP_WINDOW_CLAMP
 
+UDP_CORK
+
 EAI_ADDRFAMILY
 EAI_AGAIN
 EAI_BADFLAGS
Index: ext/socket/socket.c
===================================================================
--- ext/socket/socket.c	(revision 21260)
+++ ext/socket/socket.c	(revision 21261)
@@ -258,7 +258,7 @@
 	rb_check_safe_obj(arg);
         ptr = RSTRING_PTR(arg);
         if (str_to_int(ptr, RSTRING_LEN(arg), &ret) == -1)
-	    rb_raise(rb_eSocket, "%s %s", errmsg, ptr);
+	    rb_raise(rb_eSocket, "%s: %s", errmsg, ptr);
     }
     else {
 	ret = NUM2INT(arg);
@@ -287,6 +287,25 @@
     return constant_arg(level, level_to_int, "unknown protocol level");
 }
 
+static int
+optname_arg(int level, VALUE optname)
+{
+    switch (level) {
+      case SOL_SOCKET:
+        return constant_arg(optname, so_optname_to_int, "unknown socket level option name");
+      case IPPROTO_IP:
+        return constant_arg(optname, ip_optname_to_int, "unknown IP level option name");
+      case IPPROTO_IPV6:
+        return constant_arg(optname, ipv6_optname_to_int, "unknown IPv6 level option name");
+      case IPPROTO_TCP:
+        return constant_arg(optname, tcp_optname_to_int, "unknown TCP level option name");
+      case IPPROTO_UDP:
+        return constant_arg(optname, udp_optname_to_int, "unknown UDP level option name");
+      default:
+        return NUM2INT(optname);
+    }
+}
+
 static VALUE
 init_sock(VALUE sock, int fd)
 {
@@ -433,7 +452,7 @@
 
     rb_secure(2);
     level = level_arg(lev);
-    option = NUM2INT(optname);
+    option = optname_arg(level, optname);
 
     switch (TYPE(val)) {
       case T_FIXNUM:
@@ -513,7 +532,7 @@
     rb_io_t *fptr;
 
     level = level_arg(lev);
-    option = NUM2INT(optname);
+    option = optname_arg(level, optname);
     len = 256;
     buf = ALLOCA_N(char,len);
 
Index: test/socket/test_socket.rb
===================================================================
--- test/socket/test_socket.rb	(revision 21260)
+++ test/socket/test_socket.rb	(revision 21261)
@@ -16,9 +16,9 @@
     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)
+      n = s.getsockopt("SOL_SOCKET", "SO_TYPE")
       assert_equal([Socket::SOCK_STREAM].pack("i"), n)
-      n = s.getsockopt(:SOL_SOCKET, Socket::SO_TYPE)
+      n = s.getsockopt(:SOL_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)

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

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