summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-01 17:40:41 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-01 17:40:41 +0000
commitaa0ae0d3b6ab8d6c3143960bd0b3d154bd96d10e (patch)
tree41d1dfee546a4713ea618d0821614848dfe26fa2
parentff7e0f7f614ed1db3e3464db290192aebac1c096 (diff)
* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21261 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog11
-rw-r--r--ext/socket/mkconstants.rb52
-rw-r--r--ext/socket/socket.c25
-rw-r--r--test/socket/test_socket.rb4
4 files changed, 87 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index d3342258b5..f530f0080a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Fri Jan 2 02:39:08 2009 Tanaka Akira <akr@fsij.org>
+
+ * 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@fsij.org>
* ext/socket/socket.c (constant_arg): extracted from family_arg.
diff --git a/ext/socket/mkconstants.rb b/ext/socket/mkconstants.rb
index a4f7569f88..318ffde678 100644
--- a/ext/socket/mkconstants.rb
+++ b/ext/socket/mkconstants.rb
@@ -157,6 +157,36 @@ level_to_int(char *str, int len, int *valp)
<%= 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_RECVOPTS
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,6 +427,21 @@ IPX_TYPE
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
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 7f4564d410..b50747a5e1 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -258,7 +258,7 @@ constant_arg(VALUE arg, int (*str_to_int)(char*, int, int*), char *errmsg)
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 @@ level_arg(VALUE level)
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 @@ bsock_setsockopt(VALUE sock, VALUE lev, VALUE optname, VALUE val)
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 @@ bsock_getsockopt(VALUE sock, VALUE lev, VALUE optname)
rb_io_t *fptr;
level = level_arg(lev);
- option = NUM2INT(optname);
+ option = optname_arg(level, optname);
len = 256;
buf = ALLOCA_N(char,len);
diff --git a/test/socket/test_socket.rb b/test/socket/test_socket.rb
index af241c0236..4733d12c2a 100644
--- a/test/socket/test_socket.rb
+++ b/test/socket/test_socket.rb
@@ -16,9 +16,9 @@ class TestBasicSocket < Test::Unit::TestCase
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)