From 03149710e8fe06daef196b1ea890608ca40eb02c Mon Sep 17 00:00:00 2001 From: akr Date: Sun, 8 Feb 2009 04:53:17 +0000 Subject: * ext/socket/raddrinfo.c (init_unix_addrinfo): add socktype argument. (addrinfo_initialize): follow init_unix_addrinfo change. (addrinfo_s_unix): add optional argument: socktype git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22120 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ ext/socket/raddrinfo.c | 30 +++++++++++++++++++++--------- test/socket/test_addrinfo.rb | 9 +++++++++ 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4a4162adff..84806efa73 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sun Feb 8 13:52:02 2009 Tanaka Akira + + * ext/socket/raddrinfo.c (init_unix_addrinfo): add socktype argument. + (addrinfo_initialize): follow init_unix_addrinfo change. + (addrinfo_s_unix): add optional argument: socktype + Sun Feb 8 13:09:32 2009 Nobuyoshi Nakada * configure.in (RUBY_APPEND_OPTION, RUBY_APPEND_OPTIONS), diff --git a/ext/socket/raddrinfo.c b/ext/socket/raddrinfo.c index 2459424f7e..821265e360 100644 --- a/ext/socket/raddrinfo.c +++ b/ext/socket/raddrinfo.c @@ -719,7 +719,7 @@ addrinfo_list_new(VALUE node, VALUE service, VALUE family, VALUE socktype, VALUE #ifdef HAVE_SYS_UN_H static void -init_unix_addrinfo(rb_addrinfo_t *rai, VALUE path) +init_unix_addrinfo(rb_addrinfo_t *rai, VALUE path, int socktype) { struct sockaddr_un un; @@ -734,7 +734,7 @@ init_unix_addrinfo(rb_addrinfo_t *rai, VALUE path) un.sun_family = AF_UNIX; memcpy((void*)&un.sun_path, RSTRING_PTR(path), RSTRING_LEN(path)); - init_addrinfo(rai, (struct sockaddr *)&un, sizeof(un), AF_UNIX, SOCK_STREAM, 0, Qnil, Qnil); + init_addrinfo(rai, (struct sockaddr *)&un, sizeof(un), PF_UNIX, socktype, 0, Qnil, Qnil); } #endif @@ -843,7 +843,7 @@ addrinfo_initialize(int argc, VALUE *argv, VALUE self) { VALUE path = rb_ary_entry(sockaddr_ary, 1); StringValue(path); - init_unix_addrinfo(rai, path); + init_unix_addrinfo(rai, path, SOCK_STREAM); break; } #endif @@ -2002,21 +2002,33 @@ addrinfo_s_udp(VALUE self, VALUE host, VALUE port) /* * call-seq: - * Addrinfo.unix(path) => addrinfo + * Addrinfo.unix(path [, socktype]) => addrinfo * * returns an addrinfo object for UNIX socket address. * - * Addrinfo.unix("/tmp/sock") #=> # + * _socktype_ specifies the socket type. + * If it is omitted, :STREAM is used. + * + * Addrinfo.unix("/tmp/sock") #=> # + * Addrinfo.unix("/tmp/sock", :DGRAM) #=> # */ static VALUE -addrinfo_s_unix(VALUE self, VALUE path) +addrinfo_s_unix(int argc, VALUE *argv, VALUE self) { - VALUE addr; + VALUE path, vsocktype, addr; + int socktype; rb_addrinfo_t *rai; + rb_scan_args(argc, argv, "11", &path, &vsocktype); + + if (NIL_P(vsocktype)) + socktype = SOCK_STREAM; + else + socktype = socktype_arg(vsocktype); + addr = addrinfo_s_allocate(rb_cAddrinfo); DATA_PTR(addr) = rai = alloc_addrinfo(); - init_unix_addrinfo(rai, path); + init_unix_addrinfo(rai, path, socktype); OBJ_INFECT(addr, path); return addr; } @@ -2105,7 +2117,7 @@ Init_addrinfo(void) rb_define_singleton_method(rb_cAddrinfo, "tcp", addrinfo_s_tcp, 2); rb_define_singleton_method(rb_cAddrinfo, "udp", addrinfo_s_udp, 2); #ifdef HAVE_SYS_UN_H - rb_define_singleton_method(rb_cAddrinfo, "unix", addrinfo_s_unix, 1); + rb_define_singleton_method(rb_cAddrinfo, "unix", addrinfo_s_unix, -1); #endif rb_define_method(rb_cAddrinfo, "afamily", addrinfo_afamily, 0); diff --git a/test/socket/test_addrinfo.rb b/test/socket/test_addrinfo.rb index 3ef69c5c5f..00ed7f4e18 100644 --- a/test/socket/test_addrinfo.rb +++ b/test/socket/test_addrinfo.rb @@ -563,6 +563,15 @@ class TestSocketAddrinfo < Test::Unit::TestCase assert_equal(0, ai.protocol) end + def test_addrinfo_unix_dgram + ai = Addrinfo.unix("/tmp/sock", :DGRAM) + assert_equal("/tmp/sock", Socket.unpack_sockaddr_un(ai)) + assert_equal(Socket::AF_UNIX, ai.afamily) + assert_equal(Socket::PF_UNIX, ai.pfamily) + assert_equal(Socket::SOCK_DGRAM, ai.socktype) + assert_equal(0, ai.protocol) + end + def test_addrinfo_unix_path ai = Addrinfo.unix("/tmp/sock1") assert_equal("/tmp/sock1", ai.unix_path) -- cgit v1.2.3