* 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
This commit is contained in:
matz 2002-03-22 07:26:42 +00:00
parent 890521d117
commit 2bd0c2bf73
16 changed files with 259 additions and 93 deletions

View file

@ -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);