From 85e73ed515733b4164c28461f68796a1575e2418 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 17 May 2004 07:18:29 +0000 Subject: * ext/socket/socket.c (setup_domain_and_type): honor duck typing. [ruby-dev:23522] * ext/socket/socket.c (sock_s_getnameinfo): ditto. git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@6347 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/socket/socket.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'ext/socket/socket.c') diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 8cf54e1e1..e34483492 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -1729,10 +1729,13 @@ setup_domain_and_type(domain, dv, type, tv) VALUE domain, type; int *dv, *tv; { + VALUE tmp; char *ptr; - if (TYPE(domain) == T_STRING) { - SafeStringValue(domain); + tmp = rb_check_string_type(domain); + if (!NIL_P(domain)) { + domain = tmp; + rb_check_safe_obj(domain); ptr = RSTRING(domain)->ptr; if (strcmp(ptr, "AF_INET") == 0) *dv = AF_INET; @@ -1780,8 +1783,10 @@ setup_domain_and_type(domain, dv, type, tv) else { *dv = NUM2INT(domain); } - if (TYPE(type) == T_STRING) { - SafeStringValue(type); + tmp = rb_check_string_type(type); + if (!NIL_P(tmp)) { + type = tmp; + rb_check_safe_obj(type); ptr = RSTRING(type)->ptr; if (strcmp(ptr, "SOCK_STREAM") == 0) *tv = SOCK_STREAM; @@ -2193,7 +2198,7 @@ sock_s_getnameinfo(argc, argv) int argc; VALUE *argv; { - VALUE sa, af = Qnil, host = Qnil, port = Qnil, flags; + VALUE sa, af = Qnil, host = Qnil, port = Qnil, flags, tmp; char *hptr, *pptr; char hbuf[1024], pbuf[1024]; int fl; @@ -2210,7 +2215,9 @@ sock_s_getnameinfo(argc, argv) if (!NIL_P(flags)) { fl = NUM2INT(flags); } - if (TYPE(sa) == T_STRING) { + tmp = rb_check_string_type(sa); + if (!NIL_P(tmp)) { + sa = tmp; if (sizeof(ss) < RSTRING(sa)->len) { rb_raise(rb_eTypeError, "sockaddr length too big"); } @@ -2219,8 +2226,11 @@ sock_s_getnameinfo(argc, argv) rb_raise(rb_eTypeError, "sockaddr size differs - should not happen"); } sap = (struct sockaddr*)&ss; + goto call_nameinfo; } - else if (TYPE(sa) == T_ARRAY) { + tmp = rb_check_array_type(sa); + if (!NIL_P(tmp)) { + sa = tmp; MEMZERO(&hints, struct addrinfo, 1); if (RARRAY(sa)->len == 3) { af = RARRAY(sa)->ptr[0]; @@ -2295,6 +2305,7 @@ sock_s_getnameinfo(argc, argv) rb_raise(rb_eTypeError, "expecting String or Array"); } + call_nameinfo: error = getnameinfo(sap, SA_LEN(sap), hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), fl); if (error) goto error_exit_name; -- cgit