diff options
Diffstat (limited to 'generic/tclIOSock.c')
| -rw-r--r-- | generic/tclIOSock.c | 47 | 
1 files changed, 30 insertions, 17 deletions
| diff --git a/generic/tclIOSock.c b/generic/tclIOSock.c index 018f9f5..694501f 100644 --- a/generic/tclIOSock.c +++ b/generic/tclIOSock.c @@ -64,8 +64,8 @@ TclSockGetPort(  	return TCL_ERROR;      }      if (*portPtr > 0xFFFF) { -	Tcl_AppendResult(interp, "couldn't open socket: port number too high", -		NULL); +	Tcl_SetObjResult(interp, Tcl_NewStringObj( +		"couldn't open socket: port number too high", -1));  	return TCL_ERROR;      }      return TCL_OK; @@ -100,16 +100,20 @@ TclSockMinimumBuffers(      socklen_t len;      len = sizeof(int); -    getsockopt((SOCKET)(size_t)sock, SOL_SOCKET, SO_SNDBUF, (char *)¤t, &len); +    getsockopt((SOCKET)(size_t) sock, SOL_SOCKET, SO_SNDBUF, +	    (char *) ¤t, &len);      if (current < size) {  	len = sizeof(int); -	setsockopt((SOCKET)(size_t)sock, SOL_SOCKET, SO_SNDBUF, (char *)&size, len); +	setsockopt((SOCKET)(size_t) sock, SOL_SOCKET, SO_SNDBUF, +		(char *) &size, len);      }      len = sizeof(int); -    getsockopt((SOCKET)(size_t)sock, SOL_SOCKET, SO_RCVBUF, (char *)¤t, &len); +    getsockopt((SOCKET)(size_t) sock, SOL_SOCKET, SO_RCVBUF, +		(char *) ¤t, &len);      if (current < size) {  	len = sizeof(int); -	setsockopt((SOCKET)(size_t)sock, SOL_SOCKET, SO_RCVBUF, (char *)&size, len); +	setsockopt((SOCKET)(size_t) sock, SOL_SOCKET, SO_RCVBUF, +		(char *) &size, len);      }      return TCL_OK;  } @@ -147,24 +151,34 @@ TclCreateSocketAddress(      struct addrinfo *p;      struct addrinfo *v4head = NULL, *v4ptr = NULL;      struct addrinfo *v6head = NULL, *v6ptr = NULL; -    char *native = NULL, portstring[TCL_INTEGER_SPACE]; +    char *native = NULL, portbuf[TCL_INTEGER_SPACE], *portstring;      const char *family = NULL;      Tcl_DString ds;      int result, i; -    TclFormatInt(portstring, port); -      if (host != NULL) {  	native = Tcl_UtfToExternalDString(NULL, host, -1, &ds);      } + +    /* +     * Workaround for OSX's apparent inability to resolve "localhost", "0" +     * when the loopback device is the only available network interface. +     */ +    if (host != NULL && port == 0) { +        portstring = NULL; +    } else { +        TclFormatInt(portbuf, port); +        portstring = portbuf; +    }      (void) memset(&hints, 0, sizeof(hints)); -          hints.ai_family = AF_UNSPEC; +      /*        * Magic variable to enforce a certain address family - to be superseded       * by a TIP that adds explicit switches to [socket]       */ +      if (interp != NULL) {          family = Tcl_GetVar(interp, "::tcl::unsupported::socketAF", 0);          if (family != NULL) { @@ -182,7 +196,7 @@ TclCreateSocketAddress(      /*       * We found some problems when using AI_ADDRCONFIG, e.g. on systems that       * have no networking besides the loopback interface and want to resolve -     * localhost. See bugs 3385024, 3382419, 3382431. As the advantage of +     * localhost. See [Bugs 3385024, 3382419, 3382431]. As the advantage of       * using AI_ADDRCONFIG in situations where it works, is probably low,       * we'll leave it out for now. After all, it is just an optimisation.       * @@ -206,12 +220,11 @@ TclCreateSocketAddress(      }      if (result != 0) { -#ifdef EAI_SYSTEM /* Doesn't exist on Windows */ -        if (result == EAI_SYSTEM) -            *errorMsgPtr = Tcl_PosixError(interp); -        else -#endif -            *errorMsgPtr = gai_strerror(result); +	*errorMsgPtr = +#ifdef EAI_SYSTEM	/* Doesn't exist on Windows */ +		(result == EAI_SYSTEM) ? Tcl_PosixError(interp) : +#endif /* EAI_SYSTEM */ +		gai_strerror(result);          return 0;      } | 
