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/