From b7552a5535f72bf850fd96040ab76bd04d5f4587 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 2 Apr 2004 02:15:25 +0000 Subject: * 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 --- ext/socket/socket.c | 80 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 15 deletions(-) (limited to 'ext') diff --git a/ext/socket/socket.c b/ext/socket/socket.c index d13f6484ae..d9b2e8d606 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -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); -- cgit v1.2.3