summaryrefslogtreecommitdiff
path: root/ext/socket/socket.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-01-21 16:47:23 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-01-21 16:47:23 +0000
commit002517aba82f3d318dab09f603491417240bfe0f (patch)
tree552aae90929d0812fd6a5d08e43c870add3a35a5 /ext/socket/socket.c
parentd0149b9e210450113353e9bc8dc1f151f4563313 (diff)
* parse.y (newline_node): do not use NODE_NEWLINE node anymore,
use NEWLINE flag instead. * ext/socket/socket.c (sock_gethostbyname): returns host if ai_canonname is NULL. (ruby-bugs PR#1243) * parse.y (block_append): update nd_end for "real" head node. [ruby-list:39058] * marshal.c (w_class): should not dump singleton class. [ruby-dev:22631] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5535 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket/socket.c')
-rw-r--r--ext/socket/socket.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index c1273a87d0..0e2ddb6120 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -1026,43 +1026,47 @@ socks_s_close(sock)
#endif
static VALUE
-make_hostent(addr, ipaddr)
- struct addrinfo *addr;
+sock_gethostbyname(host, ipaddr)
+ VALUE host;
VALUE (*ipaddr) _((struct sockaddr*, size_t));
{
+ struct addrinfo *addr;
struct addrinfo *ai;
struct hostent *h;
VALUE ary, names;
+ char *hostname;
char **pch;
+ addr = sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME);
ary = rb_ary_new();
if (addr->ai_canonname) {
- rb_ary_push(ary, rb_str_new2(addr->ai_canonname));
+ hostname = addr->ai_canonname;
}
else {
- rb_ary_push(ary, Qnil);
+ hostname = StringValuePtr(host);
}
- if (addr->ai_canonname) {
+ rb_ary_push(ary, rb_str_new2(hostname));
#if defined(HAVE_GETIPNODEBYNAME)
+ {
int error;
- h = getipnodebyname(addr->ai_canonname, addr->ai_family, AI_ALL, &error);
+ h = getipnodebyname(hostname, addr->ai_family, AI_ALL, &error);
+ }
#elif defined(HAVE_GETHOSTBYNAME2)
- h = gethostbyname2(addr->ai_canonname, addr->ai_family);
+ h = gethostbyname2(hostname, addr->ai_family);
#else
- h = gethostbyname(addr->ai_canonname);
+ h = gethostbyname(hostname);
#endif
- if (h) {
- names = rb_ary_new();
- if (h->h_aliases != NULL) {
- for (pch = h->h_aliases; *pch; pch++) {
- rb_ary_push(names, rb_str_new2(*pch));
- }
+ if (h) {
+ names = rb_ary_new();
+ if (h->h_aliases != NULL) {
+ for (pch = h->h_aliases; *pch; pch++) {
+ rb_ary_push(names, rb_str_new2(*pch));
}
+ }
#if defined(HAVE_GETIPNODEBYNAME)
- freehostent(h);
+ freehostent(h);
#endif
- }
}
else {
names = rb_ary_new2(0);
@@ -1089,7 +1093,7 @@ tcp_s_gethostbyname(obj, host)
VALUE obj, host;
{
rb_secure(3);
- return make_hostent(sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME), tcp_sockaddr);
+ return sock_gethostbyname(host, tcp_sockaddr);
}
static VALUE
@@ -1981,6 +1985,9 @@ make_addrinfo(res0)
base = rb_ary_new();
for (res = res0; res; res = res->ai_next) {
ary = ipaddr(res->ai_addr);
+ if (res->ai_canonname) {
+ RARRAY(ary)->ptr[2] = rb_str_new2(res->ai_canonname);
+ }
rb_ary_push(ary, INT2FIX(res->ai_family));
rb_ary_push(ary, INT2FIX(res->ai_socktype));
rb_ary_push(ary, INT2FIX(res->ai_protocol));
@@ -2002,7 +2009,7 @@ sock_s_gethostbyname(obj, host)
VALUE obj, host;
{
rb_secure(3);
- return make_hostent(sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME), sock_sockaddr);
+ return sock_gethostbyname(host, sock_sockaddr);
}
static VALUE