summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--ext/socket/raddrinfo.c30
-rw-r--r--test/socket/test_addrinfo.rb9
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 <akr@fsij.org>
+
+ * 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 <nobu@ruby-lang.org>
* 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") #=> #<Addrinfo: /tmp/sock SOCK_STREAM>
+ * _socktype_ specifies the socket type.
+ * If it is omitted, :STREAM is used.
+ *
+ * Addrinfo.unix("/tmp/sock") #=> #<Addrinfo: /tmp/sock SOCK_STREAM>
+ * Addrinfo.unix("/tmp/sock", :DGRAM) #=> #<Addrinfo: /tmp/sock 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)