mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/socket/socket.c: mistakingly removed do_not_reverse_lookup.
[ruby-dev:39475] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6068 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
695fe49de9
commit
b7552a5535
2 changed files with 68 additions and 15 deletions
|
@ -1,5 +1,8 @@
|
|||
Fri Apr 2 07:31:38 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* ext/socket/socket.c: mistakingly removed do_not_reverse_lookup.
|
||||
[ruby-dev:39475]
|
||||
|
||||
* ext/socket/socket.c (make_hostent): fix memory leak, based on
|
||||
the patch from HORIKAWA Hisashi <vzw00011@nifty.ne.jp>.
|
||||
|
||||
|
|
|
@ -65,6 +65,7 @@
|
|||
#include "sockport.h"
|
||||
|
||||
static int do_not_reverse_lookup = 0;
|
||||
#define FMODE_NOREVLOOKUP 0x100
|
||||
|
||||
VALUE rb_cBasicSocket;
|
||||
VALUE rb_cIPSocket;
|
||||
|
@ -178,6 +179,9 @@ init_sock(sock, fd)
|
|||
fp->f = rb_fdopen(fd, "r");
|
||||
fp->f2 = rb_fdopen(fd, "w");
|
||||
fp->mode = FMODE_READWRITE;
|
||||
if (do_not_reverse_lookup) {
|
||||
fp->mode |= FMODE_NOREVLOOKUP;
|
||||
}
|
||||
rb_io_synchronized(fp);
|
||||
|
||||
return sock;
|
||||
|
@ -392,7 +396,35 @@ bsock_send(argc, argv, sock)
|
|||
return INT2FIX(n);
|
||||
}
|
||||
|
||||
static VALUE ipaddr _((struct sockaddr*));
|
||||
static VALUE
|
||||
bsock_do_not_reverse_lookup(sock)
|
||||
VALUE sock;
|
||||
{
|
||||
OpenFile *fptr;
|
||||
|
||||
GetOpenFile(sock, fptr);
|
||||
return (fptr->mode & FMODE_NOREVLOOKUP) ? Qtrue : Qfalse;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
bsock_do_not_reverse_lookup_set(sock, state)
|
||||
VALUE sock;
|
||||
VALUE state;
|
||||
{
|
||||
OpenFile *fptr;
|
||||
|
||||
rb_secure(4);
|
||||
GetOpenFile(sock, fptr);
|
||||
if (RTEST(state)) {
|
||||
fptr->mode |= FMODE_NOREVLOOKUP;
|
||||
}
|
||||
else {
|
||||
fptr->mode &= ~FMODE_NOREVLOOKUP;
|
||||
}
|
||||
return sock;
|
||||
}
|
||||
|
||||
static VALUE ipaddr _((struct sockaddr*, int));
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
static VALUE unixaddr _((struct sockaddr_un*));
|
||||
#endif
|
||||
|
@ -460,7 +492,7 @@ 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, fptr->mode & FMODE_NOREVLOOKUP));
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
case RECV_UNIX:
|
||||
return rb_assoc_new(str, unixaddr((struct sockaddr_un*)buf));
|
||||
|
@ -496,6 +528,15 @@ bsock_do_not_rev_lookup_set(self, val)
|
|||
return val;
|
||||
}
|
||||
|
||||
static void
|
||||
raise_socket_error(reason, error)
|
||||
char *reason;
|
||||
int error;
|
||||
{
|
||||
if (error == EAI_SYSTEM) rb_sys_fail(reason);
|
||||
rb_raise(rb_eSocket, "%s: %s", reason, gai_strerror(error));
|
||||
}
|
||||
|
||||
static void
|
||||
make_ipaddr0(addr, buf, len)
|
||||
struct sockaddr *addr;
|
||||
|
@ -506,7 +547,7 @@ make_ipaddr0(addr, buf, len)
|
|||
|
||||
error = getnameinfo(addr, SA_LEN(addr), buf, len, NULL, 0, NI_NUMERICHOST);
|
||||
if (error) {
|
||||
rb_raise(rb_eSocket, "getnameinfo: %s", gai_strerror(error));
|
||||
raise_socket_error("getnameinfo", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -647,7 +688,7 @@ sock_addrinfo(host, port, socktype, flags)
|
|||
if (hostp && hostp[strlen(hostp)-1] == '\n') {
|
||||
rb_raise(rb_eSocket, "newline at the end of hostname");
|
||||
}
|
||||
rb_raise(rb_eSocket, "getaddrinfo: %s", gai_strerror(error));
|
||||
raise_socket_error("getaddrinfo", error);
|
||||
}
|
||||
|
||||
#if defined(__APPLE__) && defined(__MACH__)
|
||||
|
@ -671,8 +712,9 @@ sock_addrinfo(host, port, socktype, flags)
|
|||
}
|
||||
|
||||
static VALUE
|
||||
ipaddr(sockaddr)
|
||||
ipaddr(sockaddr, norevlookup)
|
||||
struct sockaddr *sockaddr;
|
||||
int norevlookup;
|
||||
{
|
||||
VALUE family, port, addr1, addr2;
|
||||
VALUE ary;
|
||||
|
@ -705,21 +747,22 @@ ipaddr(sockaddr)
|
|||
family = rb_str_new2(pbuf);
|
||||
break;
|
||||
}
|
||||
if (!do_not_reverse_lookup) {
|
||||
|
||||
if (!norevlookup) {
|
||||
error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
|
||||
NULL, 0, 0);
|
||||
if (error) {
|
||||
rb_raise(rb_eSocket, "getnameinfo: %s", gai_strerror(error));
|
||||
raise_socket_error("getnameinfo", error);
|
||||
}
|
||||
addr1 = rb_str_new2(hbuf);
|
||||
}
|
||||
error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
|
||||
pbuf, sizeof(pbuf), NI_NUMERICHOST | NI_NUMERICSERV);
|
||||
if (error) {
|
||||
rb_raise(rb_eSocket, "getnameinfo: %s", gai_strerror(error));
|
||||
raise_socket_error("getnameinfo", error);
|
||||
}
|
||||
addr2 = rb_str_new2(hbuf);
|
||||
if (do_not_reverse_lookup) {
|
||||
if (norevlookup) {
|
||||
addr1 = addr2;
|
||||
}
|
||||
port = INT2FIX(atoi(pbuf));
|
||||
|
@ -1281,7 +1324,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, fptr->mode & FMODE_NOREVLOOKUP);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
@ -1296,7 +1339,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, fptr->mode & FMODE_NOREVLOOKUP);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
@ -1682,6 +1725,7 @@ unix_sysaccept(sock)
|
|||
return s_accept(0, fileno(fptr->f), (struct sockaddr*)&from, &fromlen);
|
||||
}
|
||||
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
static VALUE
|
||||
unixaddr(sockaddr)
|
||||
struct sockaddr_un *sockaddr;
|
||||
|
@ -1689,6 +1733,7 @@ unixaddr(sockaddr)
|
|||
return rb_assoc_new(rb_str_new2("AF_UNIX"),
|
||||
rb_str_new2(sockaddr->sun_path));
|
||||
}
|
||||
#endif
|
||||
|
||||
static VALUE
|
||||
unix_addr(sock)
|
||||
|
@ -2010,7 +2055,10 @@ make_addrinfo(res0)
|
|||
}
|
||||
base = rb_ary_new();
|
||||
for (res = res0; res; res = res->ai_next) {
|
||||
ary = ipaddr(res->ai_addr);
|
||||
ary = ipaddr(res->ai_addr, do_not_reverse_lookup);
|
||||
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));
|
||||
|
@ -2181,7 +2229,7 @@ sock_s_getaddrinfo(argc, argv)
|
|||
}
|
||||
error = getaddrinfo(hptr, pptr, &hints, &res);
|
||||
if (error) {
|
||||
rb_raise(rb_eSocket, "getaddrinfo: %s", gai_strerror(error));
|
||||
raise_socket_error("getaddrinfo", error);
|
||||
}
|
||||
|
||||
ret = make_addrinfo(res);
|
||||
|
@ -2318,11 +2366,11 @@ sock_s_getnameinfo(argc, argv)
|
|||
|
||||
error_exit_addr:
|
||||
if (res) freeaddrinfo(res);
|
||||
rb_raise(rb_eSocket, "getaddrinfo: %s", gai_strerror(error));
|
||||
raise_socket_error("getaddrinfo", error);
|
||||
|
||||
error_exit_name:
|
||||
if (res) freeaddrinfo(res);
|
||||
rb_raise(rb_eSocket, "getnameinfo: %s", gai_strerror(error));
|
||||
raise_socket_error("getnameinfo", error);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
@ -2422,6 +2470,8 @@ Init_socket()
|
|||
rb_define_method(rb_cBasicSocket, "getpeername", bsock_getpeername, 0);
|
||||
rb_define_method(rb_cBasicSocket, "send", bsock_send, -1);
|
||||
rb_define_method(rb_cBasicSocket, "recv", bsock_recv, -1);
|
||||
rb_define_method(rb_cBasicSocket, "do_not_reverse_lookup", bsock_do_not_reverse_lookup, 0);
|
||||
rb_define_method(rb_cBasicSocket, "do_not_reverse_lookup=", bsock_do_not_reverse_lookup_set, 1);
|
||||
|
||||
rb_cIPSocket = rb_define_class("IPSocket", rb_cBasicSocket);
|
||||
rb_define_global_const("IPsocket", rb_cIPSocket);
|
||||
|
|
Loading…
Add table
Reference in a new issue