From eb70912842b06794bcb51f0b3acee0ab4657a43c Mon Sep 17 00:00:00 2001 From: akr Date: Thu, 1 Jan 2009 17:40:41 +0000 Subject: * 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: http://svn.ruby-lang.org/repos/ruby/trunk@21261 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/socket/socket.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'ext/socket/socket.c') diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 7f4564d41..b50747a5e 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); -- cgit