diff options
author | dgp@users.sourceforge.net <dgp> | 2015-07-17 21:22:22 (GMT) |
---|---|---|
committer | dgp@users.sourceforge.net <dgp> | 2015-07-17 21:22:22 (GMT) |
commit | dee9a9cbe77ea21d498f9c6c3885df0a93c8da50 (patch) | |
tree | eb303b04e47fe05468dc5620171a0ee2c8453095 /generic/tclIOSock.c | |
parent | 3b5dff82b3bea4153a4034c95ebdc7af76076428 (diff) | |
parent | 77985b9936c999f8cbcb0f87825fedb45afada9a (diff) | |
download | tcl-dee9a9cbe77ea21d498f9c6c3885df0a93c8da50.zip tcl-dee9a9cbe77ea21d498f9c6c3885df0a93c8da50.tar.gz tcl-dee9a9cbe77ea21d498f9c6c3885df0a93c8da50.tar.bz2 |
merge trunk
Diffstat (limited to 'generic/tclIOSock.c')
-rw-r--r-- | generic/tclIOSock.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/generic/tclIOSock.c b/generic/tclIOSock.c index 7d6c462..f69d30f 100644 --- a/generic/tclIOSock.c +++ b/generic/tclIOSock.c @@ -12,9 +12,26 @@ #include "tclInt.h" #if defined(_WIN32) && defined(UNICODE) -/* On Windows, we always need the ASCII version. */ -# undef gai_strerror -# define gai_strerror gai_strerrorA +/* On Windows, we need to do proper Unicode->UTF-8 conversion. */ + +typedef struct ThreadSpecificData { + int initialized; + Tcl_DString errorMsg; /* UTF-8 encoded error-message */ +} ThreadSpecificData; +static Tcl_ThreadDataKey dataKey; + +#undef gai_strerror +static const char *gai_strerror(int code) { + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + if (tsdPtr->initialized) { + Tcl_DStringFree(&tsdPtr->errorMsg); + } else { + tsdPtr->initialized = 1; + } + Tcl_WinTCharToUtf(gai_strerrorW(code), -1, &tsdPtr->errorMsg); + return Tcl_DStringValue(&tsdPtr->errorMsg); +} #endif /* @@ -139,7 +156,7 @@ int TclCreateSocketAddress( Tcl_Interp *interp, /* Interpreter for querying * the desired socket family */ - void **addrlist, /* Socket address list */ + struct addrinfo **addrlist, /* Socket address list */ const char *host, /* Host. NULL implies INADDR_ANY */ int port, /* Port number */ int willBind, /* Is this an address to bind() to or @@ -213,7 +230,7 @@ TclCreateSocketAddress( hints.ai_flags |= AI_PASSIVE; } - result = getaddrinfo(native, portstring, &hints, (struct addrinfo **) addrlist); + result = getaddrinfo(native, portstring, &hints, addrlist); if (host != NULL) { Tcl_DStringFree(&ds); |