* 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
This commit is contained in:
akr 2009-01-01 15:15:31 +00:00
parent 8d8d36c15c
commit f0dd0577b0
3 changed files with 76 additions and 58 deletions

View File

@ -1,3 +1,13 @@
Fri Jan 2 00:12:27 2009 Tanaka Akira <akr@fsij.org>
* 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) <yugui@yugui.jp> Thu Jan 1 22:27:55 2009 Yuki Sonoda (Yugui) <yugui@yugui.jp>
* spec/default.mspec: fix for builddir != srcdir * spec/default.mspec: fix for builddir != srcdir

View File

@ -241,6 +241,52 @@ ruby_getnameinfo__aix(sa, salen, host, hostlen, serv, servlen, flags)
#define close closesocket #define close closesocket
#endif #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 static VALUE
init_sock(VALUE sock, int fd) init_sock(VALUE sock, int fd)
{ {
@ -1754,14 +1800,14 @@ static VALUE
udp_init(int argc, VALUE *argv, VALUE sock) udp_init(int argc, VALUE *argv, VALUE sock)
{ {
VALUE arg; VALUE arg;
int socktype = AF_INET; int family = AF_INET;
int fd; int fd;
rb_secure(3); rb_secure(3);
if (rb_scan_args(argc, argv, "01", &arg) == 1) { 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) { if (fd < 0) {
rb_sys_fail("socket(2) - udp"); rb_sys_fail("socket(2) - udp");
} }
@ -2273,31 +2319,8 @@ unix_peeraddr(VALUE sock)
static void static void
setup_domain_and_type(VALUE domain, int *dv, VALUE type, int *tv) setup_domain_and_type(VALUE domain, int *dv, VALUE type, int *tv)
{ {
VALUE tmp; *dv = family_arg(domain);
char *ptr; *tv = socktype_arg(type);
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);
}
} }
static VALUE static VALUE
@ -3137,17 +3160,17 @@ sock_s_gethostbyname(VALUE obj, VALUE host)
static VALUE static VALUE
sock_s_gethostbyaddr(int argc, VALUE *argv) sock_s_gethostbyaddr(int argc, VALUE *argv)
{ {
VALUE addr, type; VALUE addr, family;
struct hostent *h; struct hostent *h;
struct sockaddr *sa; struct sockaddr *sa;
char **pch; char **pch;
VALUE ary, names; VALUE ary, names;
int t = AF_INET; 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); sa = (struct sockaddr*)StringValuePtr(addr);
if (!NIL_P(type)) { if (!NIL_P(family)) {
t = NUM2INT(type); t = family_arg(family);
} }
#ifdef INET6 #ifdef INET6
else if (RSTRING_LEN(addr) == 16) { else if (RSTRING_LEN(addr) == 16) {
@ -3239,24 +3262,12 @@ static VALUE
sock_s_getaddrinfo(int argc, VALUE *argv) sock_s_getaddrinfo(int argc, VALUE *argv)
{ {
VALUE host, port, family, socktype, protocol, flags, ret; VALUE host, port, family, socktype, protocol, flags, ret;
char *ap;
struct addrinfo hints, *res; struct addrinfo hints, *res;
rb_scan_args(argc, argv, "24", &host, &port, &family, &socktype, &protocol, &flags); rb_scan_args(argc, argv, "24", &host, &port, &family, &socktype, &protocol, &flags);
MEMZERO(&hints, struct addrinfo, 1); MEMZERO(&hints, struct addrinfo, 1);
if (NIL_P(family)) { hints.ai_family = NIL_P(family) ? PF_UNSPEC : family_arg(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;
}
if (!NIL_P(socktype)) { if (!NIL_P(socktype)) {
hints.ai_socktype = NUM2INT(socktype); hints.ai_socktype = NUM2INT(socktype);
@ -3285,7 +3296,6 @@ sock_s_getnameinfo(int argc, VALUE *argv)
int error; int error;
struct sockaddr_storage ss; struct sockaddr_storage ss;
struct sockaddr *sap; struct sockaddr *sap;
char *ap;
sa = flags = Qnil; sa = flags = Qnil;
rb_scan_args(argc, argv, "11", &sa, &flags); 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; hints.ai_socktype = (fl & NI_DGRAM) ? SOCK_DGRAM : SOCK_STREAM;
/* af */ /* af */
if (NIL_P(af)) { hints.ai_family = NIL_P(af) ? PF_UNSPEC : family_arg(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;
}
error = getaddrinfo(hptr, pptr, &hints, &res); error = getaddrinfo(hptr, pptr, &hints, &res);
if (error) goto error_exit_addr; if (error) goto error_exit_addr;
sap = res->ai_addr; sap = res->ai_addr;

View File

@ -6,6 +6,15 @@ end
class TestUDPSocket < Test::Unit::TestCase 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 def test_connect
s = UDPSocket.new s = UDPSocket.new
host = Object.new host = Object.new