summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-03-22 07:26:42 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-03-22 07:26:42 +0000
commit2bd0c2bf73acd0841619f67e3448573e5b6e3064 (patch)
tree8d1f8bb30c4092ea1c809a0f7bfe65bb0cd94d66 /ext
parent890521d11783ac21503052e2a5f86c4ddfc6a9d8 (diff)
* the VMS support patch submitted by Akiyoshi, Masamichi
<Masamichi.Akiyoshi@jp.compaq.com> is merged. * eval.c (exec_under): changing ruby_class is OK, but should not alter cbase. * eval.c (yield_under_i): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2258 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/socket/socket.c112
1 files changed, 75 insertions, 37 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 281a1fe1ea..dcd4cd7e01 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -401,9 +401,9 @@ bsock_send(argc, argv, sock)
return INT2FIX(n);
}
-static VALUE ipaddr _((struct sockaddr *));
+static VALUE ipaddr _((struct sockaddr*));
#ifdef HAVE_SYS_UN_H
-static VALUE unixaddr _((struct sockaddr_un *));
+static VALUE unixaddr _((struct sockaddr_un*));
#endif
enum sock_recv_type {
@@ -465,10 +465,10 @@ s_recvfrom(sock, argc, argv, from)
rb_raise(rb_eTypeError, "sockaddr size differs - should not happen");
}
#endif
- return rb_assoc_new(str, ipaddr((struct sockaddr *)buf));
+ return rb_assoc_new(str, ipaddr((struct sockaddr*)buf));
#ifdef HAVE_SYS_UN_H
case RECV_UNIX:
- return rb_assoc_new(str, unixaddr((struct sockaddr_un *)buf));
+ return rb_assoc_new(str, unixaddr((struct sockaddr_un*)buf));
#endif
case RECV_SOCKET:
return rb_assoc_new(str, rb_tainted_str_new(buf, alen));
@@ -535,7 +535,7 @@ mkinetaddr(host, buf, len)
sin.sin_family = AF_INET;
SET_SIN_LEN(&sin, sizeof(sin));
sin.sin_addr.s_addr = host;
- mkipaddr0((struct sockaddr *)&sin, buf, len);
+ mkipaddr0((struct sockaddr*)&sin, buf, len);
}
static struct addrinfo*
@@ -590,6 +590,7 @@ ip_addrsetup(host, port)
MEMZERO(&hints, struct addrinfo, 1);
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_flags = AI_CANONNAME;
error = getaddrinfo(hostp, portp, &hints, &res);
if (error) {
if (hostp && hostp[strlen(hostp)-1] == '\n') {
@@ -972,17 +973,19 @@ static VALUE
tcp_s_gethostbyname(obj, host)
VALUE obj, host;
{
+#if 0
struct sockaddr_storage addr;
struct hostent *h;
char **pch;
VALUE ary, names;
+ size_t size;
rb_secure(3);
if (rb_obj_is_kind_of(host, rb_cInteger)) {
long i = NUM2LONG(host);
struct sockaddr_in *sin;
- sin = (struct sockaddr_in *)&addr;
+ sin = (struct sockaddr_in*)&addr;
MEMZERO(sin, struct sockaddr_in, 1);
sin->sin_family = AF_INET;
SET_SIN_LEN(sin, sizeof(*sin));
@@ -995,8 +998,8 @@ tcp_s_gethostbyname(obj, host)
case AF_INET:
{
struct sockaddr_in *sin;
- sin = (struct sockaddr_in *)&addr;
- h = gethostbyaddr((char *)&sin->sin_addr,
+ sin = (struct sockaddr_in*)&addr;
+ h = gethostbyaddr((char*)&sin->sin_addr,
sizeof(sin->sin_addr),
sin->sin_family);
break;
@@ -1005,8 +1008,8 @@ tcp_s_gethostbyname(obj, host)
case AF_INET6:
{
struct sockaddr_in6 *sin6;
- sin6 = (struct sockaddr_in6 *)&addr;
- h = gethostbyaddr((char *)&sin6->sin6_addr,
+ sin6 = (struct sockaddr_in6*)&addr;
+ h = gethostbyaddr((char*)&sin6->sin6_addr,
sizeof(sin6->sin6_addr),
sin6->sin6_family);
break;
@@ -1019,7 +1022,7 @@ tcp_s_gethostbyname(obj, host)
if (h == NULL) {
#ifdef HAVE_HSTERROR
extern int h_errno;
- rb_raise(rb_eSocket, "%s", (char *)hsterror(h_errno));
+ rb_raise(rb_eSocket, "%s", (char*)hsterror(h_errno));
#else
rb_raise(rb_eSocket, "host not found");
#endif
@@ -1033,48 +1036,83 @@ tcp_s_gethostbyname(obj, host)
}
rb_ary_push(ary, INT2NUM(h->h_addrtype));
#ifdef h_addr
- for (pch = h->h_addr_list; *pch; pch++) {
+ for (pch = h->h_addr_list; *pch; pch++)
+ ;
+ pch++;
+ size = (char*)pch - (char*)h->h_addr_list;
+ pch = (char**)alloca(size);
+ memcpy((char*)pch, (char *)h->h_addr_list, size);
+ size = h->h_length;
+ for (; *pch && h; pch++) {
switch (addr.ss_family) {
- case AF_INET:
- {
+ case AF_INET: {
struct sockaddr_in sin;
+
MEMZERO(&sin, struct sockaddr_in, 1);
sin.sin_family = AF_INET;
SET_SIN_LEN(&sin, sizeof(sin));
- memcpy((char *) &sin.sin_addr, *pch, h->h_length);
- h = gethostbyaddr((char *)&sin.sin_addr,
+ memcpy((char*)&sin.sin_addr, *pch, size);
+ h = gethostbyaddr((char*)&sin.sin_addr,
sizeof(sin.sin_addr),
sin.sin_family);
- rb_ary_push(ary, mkipaddr((struct sockaddr *)&sin));
+ rb_ary_push(ary, mkipaddr((struct sockaddr*)&sin));
break;
}
#ifdef INET6
- case AF_INET6:
- {
+ case AF_INET6: {
struct sockaddr_in6 sin6;
+
MEMZERO(&sin6, struct sockaddr_in6, 1);
sin6.sin6_family = AF_INET;
#ifdef SIN6_LEN
sin6.sin6_len = sizeof(sin6);
#endif
- memcpy((char *) &sin6.sin6_addr, *pch, h->h_length);
- h = gethostbyaddr((char *)&sin6.sin6_addr,
+ memcpy((char*)&sin6.sin6_addr, *pch, size);
+ h = gethostbyaddr((char*)&sin6.sin6_addr,
sizeof(sin6.sin6_addr),
sin6.sin6_family);
- rb_ary_push(ary, mkipaddr((struct sockaddr *)&sin6));
+ rb_ary_push(ary, mkipaddr((struct sockaddr*)&sin6));
break;
}
#endif
- default:
+ default:
h = NULL;
+ break;
}
}
#else
- memcpy((char *)&addr.sin_addr, h->h_addr, h->h_length);
- rb_ary_push(ary, mkipaddr((struct sockaddr *)&addr));
+ memcpy((char*)&addr.sin_addr, h->h_addr, h->h_length);
+ rb_ary_push(ary, mkipaddr((struct sockaddr*)&addr));
#endif
return ary;
+#else
+
+ struct addrinfo hints, *res, *r;
+ VALUE ary, names;
+ int error;
+
+ rb_secure(3);
+ MEMZERO(&hints, struct addrinfo, 1);
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ r = res = ip_addrsetup(host, Qnil);
+ ary = rb_ary_new();
+ rb_ary_push(ary, rb_tainted_str_new2(r->ai_canonname));
+ r = r->ai_next;
+ names = rb_ary_new();
+ rb_ary_push(ary, names);
+ rb_ary_push(ary, INT2NUM(res->ai_family));
+ for (r = res; r; r = r->ai_next) {
+ if (r != res) {
+ rb_ary_push(names, rb_tainted_str_new2(r->ai_canonname));
+ }
+ rb_ary_push(ary, mkipaddr(r->ai_addr));
+ }
+ freeaddrinfo(res);
+
+ return ary;
+#endif
}
static VALUE
@@ -1202,7 +1240,7 @@ ip_addr(sock)
if (getsockname(fileno(fptr->f), (struct sockaddr*)&addr, &len) < 0)
rb_sys_fail("getsockname(2)");
- return ipaddr((struct sockaddr *)&addr);
+ return ipaddr((struct sockaddr*)&addr);
}
static VALUE
@@ -1217,7 +1255,7 @@ ip_peeraddr(sock)
if (getpeername(fileno(fptr->f), (struct sockaddr*)&addr, &len) < 0)
rb_sys_fail("getpeername(2)");
- return ipaddr((struct sockaddr *)&addr);
+ return ipaddr((struct sockaddr*)&addr);
}
static VALUE
@@ -1236,7 +1274,7 @@ ip_s_getaddress(obj, host)
struct sockaddr_storage addr;
setipaddr(host, &addr);
- return mkipaddr((struct sockaddr *)&addr);
+ return mkipaddr((struct sockaddr*)&addr);
}
static VALUE
@@ -1876,7 +1914,7 @@ mkhostent(h)
if (h == NULL) {
#ifdef HAVE_HSTRERROR
extern int h_errno;
- rb_raise(rb_eSocket, "%s", (char *)hstrerror(h_errno));
+ rb_raise(rb_eSocket, "%s", (char*)hstrerror(h_errno));
#else
rb_raise(rb_eSocket, "host not found");
#endif
@@ -1935,21 +1973,21 @@ sock_s_gethostbyname(obj, host)
if (rb_obj_is_kind_of(host, rb_cInteger)) {
long i = NUM2LONG(host);
struct sockaddr_in *sin;
- sin = (struct sockaddr_in *)&addr;
+ sin = (struct sockaddr_in*)&addr;
MEMZERO(sin, struct sockaddr_in, 1);
sin->sin_family = AF_INET;
SET_SIN_LEN(sin, sizeof(*sin));
sin->sin_addr.s_addr = htonl(i);
}
else {
- setipaddr(host, (struct sockaddr *)&addr);
+ setipaddr(host, (struct sockaddr*)&addr);
}
switch (addr.ss_family) {
case AF_INET:
{
struct sockaddr_in *sin;
- sin = (struct sockaddr_in *)&addr;
- h = gethostbyaddr((char *)&sin->sin_addr,
+ sin = (struct sockaddr_in*)&addr;
+ h = gethostbyaddr((char*)&sin->sin_addr,
sizeof(sin->sin_addr),
sin->sin_family);
break;
@@ -1958,8 +1996,8 @@ sock_s_gethostbyname(obj, host)
case AF_INET6:
{
struct sockaddr_in6 *sin6;
- sin6 = (struct sockaddr_in6 *)&addr;
- h = gethostbyaddr((char *)&sin6->sin6_addr,
+ sin6 = (struct sockaddr_in6*)&addr;
+ h = gethostbyaddr((char*)&sin6->sin6_addr,
sizeof(sin6->sin6_addr),
sin6->sin6_family);
break;
@@ -2127,10 +2165,10 @@ sock_s_getnameinfo(argc, argv)
rb_raise(rb_eTypeError, "sockaddr length too big");
}
memcpy(&ss, RSTRING(sa)->ptr, RSTRING(sa)->len);
- if (RSTRING(sa)->len != SA_LEN((struct sockaddr *)&ss)) {
+ if (RSTRING(sa)->len != SA_LEN((struct sockaddr*)&ss)) {
rb_raise(rb_eTypeError, "sockaddr size differs - should not happen");
}
- sap = (struct sockaddr *)&ss;
+ sap = (struct sockaddr*)&ss;
}
else if (TYPE(sa) == T_ARRAY) {
MEMZERO(&hints, struct addrinfo, 1);