diff options
author | Kevin B Kenny <kennykb@acm.org> | 2010-10-28 19:42:20 (GMT) |
---|---|---|
committer | Kevin B Kenny <kennykb@acm.org> | 2010-10-28 19:42:20 (GMT) |
commit | d3b892a63b7f79b58c0747b4c35df4ff5a71840f (patch) | |
tree | d18ab94bf03161bfd95efecdfb9bcd066c44f5d4 /unix | |
parent | dd826cedb13503968999c10b4b26450f140a72ff (diff) | |
download | tcl-d3b892a63b7f79b58c0747b4c35df4ff5a71840f.zip tcl-d3b892a63b7f79b58c0747b4c35df4ff5a71840f.tar.gz tcl-d3b892a63b7f79b58c0747b4c35df4ff5a71840f.tar.bz2 |
merge
Diffstat (limited to 'unix')
-rw-r--r-- | unix/tclUnixSock.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/unix/tclUnixSock.c b/unix/tclUnixSock.c index a4d672d..c3b2d35 100644 --- a/unix/tclUnixSock.c +++ b/unix/tclUnixSock.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixSock.c,v 1.26.2.2 2010/10/20 01:50:19 kennykb Exp $ + * RCS: @(#) $Id: tclUnixSock.c,v 1.26.2.3 2010/10/28 19:42:20 kennykb Exp $ */ #include "tclInt.h" @@ -620,9 +620,10 @@ TcpGetOptionProc( * initialized by caller. */ { TcpState *statePtr = (TcpState *) instanceData; - char host[NI_MAXHOST], port[NI_MAXSERV]; size_t len = 0; + int reverseDNS = 0; +#define SUPPRESS_RDNS_VAR "::tcl::unsupported::noReverseDNS" if (optionName != NULL) { len = strlen(optionName); @@ -644,6 +645,10 @@ TcpGetOptionProc( return TCL_OK; } + if (interp != NULL && Tcl_GetVar(interp, SUPPRESS_RDNS_VAR, 0) != NULL) { + reverseDNS = NI_NUMERICHOST; + } + if ((len == 0) || ((len > 1) && (optionName[1] == 'p') && (strncmp(optionName, "-peername", len) == 0))) { @@ -660,14 +665,13 @@ TcpGetOptionProc( NI_NUMERICHOST); Tcl_DStringAppendElement(dsPtr, host); getnameinfo(&peername.sa, size, host, sizeof(host), port, - sizeof(port), NI_NUMERICSERV); + sizeof(port), reverseDNS | NI_NUMERICSERV); Tcl_DStringAppendElement(dsPtr, host); Tcl_DStringAppendElement(dsPtr, port); - if (len == 0) { - Tcl_DStringEndSublist(dsPtr); - } else { - return TCL_OK; - } + if (len) { + return TCL_OK; + } + Tcl_DStringEndSublist(dsPtr); } else { /* * getpeername failed - but if we were asked for all the options @@ -701,7 +705,7 @@ TcpGetOptionProc( for (fds = statePtr->fds; fds != NULL; fds = fds->next) { size = sizeof(sockname); if (getsockname(fds->fd, &(sockname.sa), &size) >= 0) { - int flags; + int flags = reverseDNS; found = 1; getnameinfo(&sockname.sa, size, host, sizeof(host), NULL, 0, @@ -713,7 +717,7 @@ TcpGetOptionProc( * can sometimes cause problems (and never have a name). */ - flags = NI_NUMERICSERV; + flags |= NI_NUMERICSERV; if (sockname.sa.sa_family == AF_INET) { if (sockname.sa4.sin_addr.s_addr == INADDR_ANY) { flags |= NI_NUMERICHOST; @@ -738,11 +742,10 @@ TcpGetOptionProc( } } if (found) { - if (len == 0) { - Tcl_DStringEndSublist(dsPtr); - } else { + if (len) { return TCL_OK; } + Tcl_DStringEndSublist(dsPtr); } else { if (interp) { Tcl_AppendResult(interp, "can't get sockname: ", @@ -969,8 +972,12 @@ CreateClientSocket( } error: - freeaddrinfo(addrlist); - freeaddrinfo(myaddrlist); + if (addrlist) { + freeaddrinfo(addrlist); + } + if (myaddrlist) { + freeaddrinfo(myaddrlist); + } if (status < 0) { if (interp != NULL) { |