From f0dd0577b08cb00025c3dacb85d276715c43b6c2 Mon Sep 17 00:00:00 2001 From: akr Date: Thu, 1 Jan 2009 15:15:31 +0000 Subject: [PATCH] * ext/socket/socket.c (family_arg): extracted from setup_domain_and_type. (socktype_arg): ditto. (udp_init): use family_arg. (sock_s_gethostbyaddr): ditto. (sock_s_getaddrinfo): ditto. (sock_s_getnameinfo): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21254 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++ ext/socket/socket.c | 115 ++++++++++++++++++++-------------------- test/socket/test_udp.rb | 9 ++++ 3 files changed, 76 insertions(+), 58 deletions(-) diff --git a/ChangeLog b/ChangeLog index 44137eb3de..3456ea1c30 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Fri Jan 2 00:12:27 2009 Tanaka Akira + + * ext/socket/socket.c (family_arg): extracted from + setup_domain_and_type. + (socktype_arg): ditto. + (udp_init): use family_arg. + (sock_s_gethostbyaddr): ditto. + (sock_s_getaddrinfo): ditto. + (sock_s_getnameinfo): ditto. + Thu Jan 1 22:27:55 2009 Yuki Sonoda (Yugui) * spec/default.mspec: fix for builddir != srcdir diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 04b79ff3c3..6d8ad7404e 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -241,6 +241,52 @@ ruby_getnameinfo__aix(sa, salen, host, hostlen, serv, servlen, flags) #define close closesocket #endif +static int +family_arg(VALUE domain) +{ + /* convert AF_INET, etc. */ + VALUE tmp; + char *ptr; + int ret; + + tmp = rb_check_string_type(domain); + if (!NIL_P(tmp)) { + domain = tmp; + rb_check_safe_obj(domain); + ptr = RSTRING_PTR(domain); + if (family_to_int(ptr, RSTRING_LEN(domain), &ret) == -1) + rb_raise(rb_eSocket, "unknown socket domain %s", ptr); + } + else { + ret = NUM2INT(domain); + } + return ret; +} + +static int +socktype_arg(VALUE type) +{ + /* convert SOCK_STREAM, etc. */ + VALUE tmp; + char *ptr; + int ret; + + tmp = rb_check_string_type(type); + if (!NIL_P(tmp)) { + type = tmp; + rb_check_safe_obj(type); + ptr = RSTRING_PTR(type); + if (socktype_to_int(ptr, RSTRING_LEN(type), &ret) == -1) + rb_raise(rb_eSocket, "unknown socket type %s", ptr); + } + else { + ret = NUM2INT(type); + } + + return ret; +} + + static VALUE init_sock(VALUE sock, int fd) { @@ -1754,14 +1800,14 @@ static VALUE udp_init(int argc, VALUE *argv, VALUE sock) { VALUE arg; - int socktype = AF_INET; + int family = AF_INET; int fd; rb_secure(3); if (rb_scan_args(argc, argv, "01", &arg) == 1) { - socktype = NUM2INT(arg); + family = family_arg(arg); } - fd = ruby_socket(socktype, SOCK_DGRAM, 0); + fd = ruby_socket(family, SOCK_DGRAM, 0); if (fd < 0) { rb_sys_fail("socket(2) - udp"); } @@ -2273,31 +2319,8 @@ unix_peeraddr(VALUE sock) static void setup_domain_and_type(VALUE domain, int *dv, VALUE type, int *tv) { - VALUE tmp; - char *ptr; - - tmp = rb_check_string_type(domain); - if (!NIL_P(tmp)) { - domain = tmp; - rb_check_safe_obj(domain); - ptr = RSTRING_PTR(domain); - if (family_to_int(ptr, RSTRING_LEN(domain), dv) == -1) - rb_raise(rb_eSocket, "unknown socket domain %s", ptr); - } - else { - *dv = NUM2INT(domain); - } - tmp = rb_check_string_type(type); - if (!NIL_P(tmp)) { - type = tmp; - rb_check_safe_obj(type); - ptr = RSTRING_PTR(type); - if (socktype_to_int(ptr, RSTRING_LEN(type), tv) == -1) - rb_raise(rb_eSocket, "unknown socket type %s", ptr); - } - else { - *tv = NUM2INT(type); - } + *dv = family_arg(domain); + *tv = socktype_arg(type); } static VALUE @@ -3137,17 +3160,17 @@ sock_s_gethostbyname(VALUE obj, VALUE host) static VALUE sock_s_gethostbyaddr(int argc, VALUE *argv) { - VALUE addr, type; + VALUE addr, family; struct hostent *h; struct sockaddr *sa; char **pch; VALUE ary, names; int t = AF_INET; - rb_scan_args(argc, argv, "11", &addr, &type); + rb_scan_args(argc, argv, "11", &addr, &family); sa = (struct sockaddr*)StringValuePtr(addr); - if (!NIL_P(type)) { - t = NUM2INT(type); + if (!NIL_P(family)) { + t = family_arg(family); } #ifdef INET6 else if (RSTRING_LEN(addr) == 16) { @@ -3239,24 +3262,12 @@ static VALUE sock_s_getaddrinfo(int argc, VALUE *argv) { VALUE host, port, family, socktype, protocol, flags, ret; - char *ap; struct addrinfo hints, *res; rb_scan_args(argc, argv, "24", &host, &port, &family, &socktype, &protocol, &flags); MEMZERO(&hints, struct addrinfo, 1); - if (NIL_P(family)) { - hints.ai_family = PF_UNSPEC; - } - else if (FIXNUM_P(family)) { - hints.ai_family = FIX2INT(family); - } - else if ((ap = StringValuePtr(family)) != 0) { - int af; - if (family_to_int(ap, RSTRING_LEN(family), &af) == -1) - rb_raise(rb_eSocket, "unknown socket domain %s", ap); - hints.ai_family = af; - } + hints.ai_family = NIL_P(family) ? PF_UNSPEC : family_arg(family); if (!NIL_P(socktype)) { hints.ai_socktype = NUM2INT(socktype); @@ -3285,7 +3296,6 @@ sock_s_getnameinfo(int argc, VALUE *argv) int error; struct sockaddr_storage ss; struct sockaddr *sap; - char *ap; sa = flags = Qnil; rb_scan_args(argc, argv, "11", &sa, &flags); @@ -3362,18 +3372,7 @@ sock_s_getnameinfo(int argc, VALUE *argv) } hints.ai_socktype = (fl & NI_DGRAM) ? SOCK_DGRAM : SOCK_STREAM; /* af */ - if (NIL_P(af)) { - hints.ai_family = PF_UNSPEC; - } - else if (FIXNUM_P(af)) { - hints.ai_family = FIX2INT(af); - } - else if ((ap = StringValuePtr(af)) != 0) { - int family; - if (family_to_int(ap, RSTRING_LEN(af), &family) == -1) - rb_raise(rb_eSocket, "unknown socket domain %s", ap); - hints.ai_family = family; - } + hints.ai_family = NIL_P(af) ? PF_UNSPEC : family_arg(af); error = getaddrinfo(hptr, pptr, &hints, &res); if (error) goto error_exit_addr; sap = res->ai_addr; diff --git a/test/socket/test_udp.rb b/test/socket/test_udp.rb index d515ad4dbb..4893a1f3ca 100644 --- a/test/socket/test_udp.rb +++ b/test/socket/test_udp.rb @@ -6,6 +6,15 @@ end class TestUDPSocket < Test::Unit::TestCase + def test_open + assert_nothing_raised { UDPSocket.open {} } + assert_nothing_raised { UDPSocket.open(Socket::AF_INET) {} } + assert_nothing_raised { UDPSocket.open("AF_INET") {} } + if defined? Socket::AF_INET6 + assert_nothing_raised { UDPSocket.open(Socket::AF_INET6) {} } + end + end + def test_connect s = UDPSocket.new host = Object.new