diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-05-17 07:18:29 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-05-17 07:18:29 +0000 |
commit | dcae18de822625d020e4ce42d9a2b4673e9386ea (patch) | |
tree | 17c7acdee90e2a54422c29460db7ac72be93b07c /ext | |
parent | 36b02b16a134f67091ce238e6ac2eb0968a643a9 (diff) |
* 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: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6347 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r-- | ext/socket/socket.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 8cf54e1e1e..e344834921 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; |