diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-04-06 05:50:42 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-04-06 05:50:42 +0000 |
commit | cb302bf35109d69063ac589dd75f6356257a7fda (patch) | |
tree | 81429547230c946933771a24a4b98e7a6dd9e3aa /ext/socket/socket.c | |
parent | b1fd376cbfbccc523921a950b1bc6bcaa01c0f99 (diff) | |
download | ruby-cb302bf35109d69063ac589dd75f6356257a7fda.tar.gz |
* ext/socket/rubysocket.h (SockAddrStringValueWithAddrinfo): New macro.
(rsock_sockaddr_string_value_with_addrinfo): New declaration.
(rsock_addrinfo_inspect_sockaddr): Ditto.
(rsock_sys_fail_addrinfo): Ditto.
(rsock_sys_fail_sockaddr_or_addrinfo): Ditto.
* ext/socket/raddrinfo.c (rsock_addrinfo_inspect_sockaddr): Renamed
from addrinfo_inspect_sockaddr and exported.
(rsock_sockaddr_string_value_with_addrinfo): New function to obtain
string and possibly addrinfo object.
* ext/socket/socket.c (rsock_sys_fail_sockaddr): Don't use
rsock_sys_fail_host_port which is IP dependent. Invoke
rsock_sys_fail_addrinfo.
(rsock_sys_fail_addrinfo): New function using
rsock_addrinfo_inspect_sockaddr.
(rsock_sys_fail_addrinfo_or_sockaddr): New function.
(sock_connect): Use SockAddrStringValueWithAddrinfo and
rsock_sys_fail_addrinfo_or_sockaddr.
(sock_connect_nonblock): Ditto.
(sock_bind): Ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40154 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket/socket.c')
-rw-r--r-- | ext/socket/socket.c | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c index f4d8b3f47e..d05e5a3e42 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -49,11 +49,34 @@ rsock_sys_fail_path(const char *mesg, VALUE path) void rsock_sys_fail_sockaddr(const char *mesg, VALUE addr) { - VALUE host_port = sock_s_unpack_sockaddr_in(rb_cSocket, addr); + VALUE rai; - rsock_sys_fail_host_port(mesg, - RARRAY_PTR(host_port)[1], - RARRAY_PTR(host_port)[0]); + rai = rsock_addrinfo_new( + (struct sockaddr *)RSTRING_PTR(addr), + RSTRING_LEN(addr), + PF_UNSPEC, 0, 0, Qnil, Qnil); + + rsock_sys_fail_addrinfo(mesg, rai); +} + +void +rsock_sys_fail_addrinfo(const char *mesg, VALUE rai) +{ + VALUE str, message; + + str = rsock_addrinfo_inspect_sockaddr(rai); + message = rb_sprintf("%s for %s", mesg, StringValueCStr(str)); + + rb_sys_fail_str(message); +} + +void +rsock_sys_fail_addrinfo_or_sockaddr(const char *mesg, VALUE addr, VALUE rai) +{ + if (NIL_P(rai)) + rsock_sys_fail_sockaddr(mesg, addr); + else + rsock_sys_fail_addrinfo(mesg, rai); } static void @@ -350,16 +373,17 @@ rsock_sock_s_socketpair(int argc, VALUE *argv, VALUE klass) static VALUE sock_connect(VALUE sock, VALUE addr) { + VALUE rai; rb_io_t *fptr; int fd, n; - SockAddrStringValue(addr); + SockAddrStringValueWithAddrinfo(addr, rai); addr = rb_str_new4(addr); GetOpenFile(sock, fptr); fd = fptr->fd; n = rsock_connect(fd, (struct sockaddr*)RSTRING_PTR(addr), RSTRING_LENINT(addr), 0); if (n < 0) { - rsock_sys_fail_sockaddr("connect(2)", addr); + rsock_sys_fail_addrinfo_or_sockaddr("connect(2)", addr, rai); } return INT2FIX(n); @@ -410,10 +434,11 @@ sock_connect(VALUE sock, VALUE addr) static VALUE sock_connect_nonblock(VALUE sock, VALUE addr) { + VALUE rai; rb_io_t *fptr; int n; - SockAddrStringValue(addr); + SockAddrStringValueWithAddrinfo(addr, rai); addr = rb_str_new4(addr); GetOpenFile(sock, fptr); rb_io_set_nonblock(fptr); @@ -421,7 +446,7 @@ sock_connect_nonblock(VALUE sock, VALUE addr) if (n < 0) { if (errno == EINPROGRESS) rb_mod_sys_fail(rb_mWaitWritable, "connect(2) would block"); - rsock_sys_fail_sockaddr("connect(2)", addr); + rsock_sys_fail_addrinfo_or_sockaddr("connect(2)", addr, rai); } return INT2FIX(n); @@ -516,12 +541,13 @@ sock_connect_nonblock(VALUE sock, VALUE addr) static VALUE sock_bind(VALUE sock, VALUE addr) { + VALUE rai; rb_io_t *fptr; - SockAddrStringValue(addr); + SockAddrStringValueWithAddrinfo(addr, rai); GetOpenFile(sock, fptr); if (bind(fptr->fd, (struct sockaddr*)RSTRING_PTR(addr), RSTRING_LENINT(addr)) < 0) - rsock_sys_fail_sockaddr("bind(2)", addr); + rsock_sys_fail_addrinfo_or_sockaddr("bind(2)", addr, rai); return INT2FIX(0); } |