diff options
| author | nijtmans@users.sourceforge.net <jan.nijtmans> | 2014-04-16 09:28:54 (GMT) | 
|---|---|---|
| committer | nijtmans@users.sourceforge.net <jan.nijtmans> | 2014-04-16 09:28:54 (GMT) | 
| commit | e4695a28e9328d6bf48bee319aeecec35e68d3a7 (patch) | |
| tree | 340c9f6f3cef2dd06af7d89c9f1e5567d9ffd05b | |
| parent | 39e52fc2ebd9514565c2ea7efefb665dc4d80060 (diff) | |
| download | tcl-e4695a28e9328d6bf48bee319aeecec35e68d3a7.zip tcl-e4695a28e9328d6bf48bee319aeecec35e68d3a7.tar.gz tcl-e4695a28e9328d6bf48bee319aeecec35e68d3a7.tar.bz2  | |
Upgrade from Winsock 1.1 to Winsock 2.2, which is always available on Win2000+. See: [http://msdn.microsoft.com/en-us/library/windows/desktop/ms742213%28v=vs.85%29.aspx] for details. 
Move winsock initialization to TclpInitPlatform(void), so we can be sure everywhere that we have an initialized winsock2. 
Stub entries for TclWinGetServByName/TclWinGetSockOpt/TclWinSetSockOpt are no longer necessary (will be removed in 9.0, but are kept in 8.x)
| -rw-r--r-- | generic/tclIntPlatDecls.h | 6 | ||||
| -rw-r--r-- | win/tclWinInit.c | 24 | ||||
| -rw-r--r-- | win/tclWinPort.h | 9 | ||||
| -rw-r--r-- | win/tclWinSock.c | 78 | 
4 files changed, 19 insertions, 98 deletions
diff --git a/generic/tclIntPlatDecls.h b/generic/tclIntPlatDecls.h index 80dd2ad..f935efb 100644 --- a/generic/tclIntPlatDecls.h +++ b/generic/tclIntPlatDecls.h @@ -849,7 +849,13 @@ extern TclIntPlatStubs *tclIntPlatStubsPtr;  #if defined(__WIN32__) || defined(__CYGWIN__)  #   undef TclWinNToHS +#   undef TclWinGetServByName +#   undef TclWinGetSockOpt +#   undef TclWinSetSockOpt  #   define TclWinNToHS ntohs +#   define TclWinGetServByName getservbyname +#   define TclWinGetSockOpt getsockopt +#   define TclWinSetSockOpt setsockopt  #else  #   undef TclpGetPid  #   define TclpGetPid(pid) ((unsigned long) (pid)) diff --git a/win/tclWinInit.c b/win/tclWinInit.c index 2f3c7e8..4e860b2 100644 --- a/win/tclWinInit.c +++ b/win/tclWinInit.c @@ -113,8 +113,8 @@ static int		ToUtf(CONST WCHAR *wSrc, char *dst);   *   * TclpInitPlatform --   * - *	Initialize all the platform-dependant things like signals and - *	floating-point error handling. + *	Initialize all the platform-dependant things like signals, + *	floating-point error handling and sockets.   *   *	Called at process initialization time.   * @@ -130,20 +130,16 @@ static int		ToUtf(CONST WCHAR *wSrc, char *dst);  void  TclpInitPlatform(void)  { -    tclPlatform = TCL_PLATFORM_WINDOWS; +    WSADATA wsaData; +    WORD wVersionRequested = MAKEWORD(2, 2); -    /* -     * The following code stops Windows 3.X and Windows NT 3.51 from -     * automatically putting up Sharing Violation dialogs, e.g, when someone -     * tries to access a file that is locked or a drive with no disk in it. -     * Tcl already returns the appropriate error to the caller, and they can -     * decide to put up their own dialog in response to that failure. -     * -     * Under 95 and NT 4.0, this is a NOOP because the system doesn't -     * automatically put up dialogs when the above operations fail. -     */ +    tclPlatform = TCL_PLATFORM_WINDOWS; -    SetErrorMode(SetErrorMode(0) | SEM_FAILCRITICALERRORS); +	/* +	 * Initialize the winsock library. On Windows XP and higher this +	 * can never fail. +	 */ +	WSAStartup(wVersionRequested, &wsaData);  #ifdef STATIC_BUILD      /* diff --git a/win/tclWinPort.h b/win/tclWinPort.h index ec9e867..ea6d8f8 100644 --- a/win/tclWinPort.h +++ b/win/tclWinPort.h @@ -448,15 +448,6 @@ typedef DWORD_PTR * PDWORD_PTR;  #define TclpSysRealloc(ptr, size)	((void*)HeapReAlloc(GetProcessHeap(), \  					    (DWORD)0, (LPVOID)ptr, (DWORD)size)) -/* - * The following defines map from standard socket names to our internal - * wrappers that redirect through the winSock function table (see the - * file tclWinSock.c). - */ - -#define getservbyname	TclWinGetServByName -#define getsockopt	TclWinGetSockOpt -#define setsockopt	TclWinSetSockOpt  /* This type is not defined in the Windows headers */  #define socklen_t       int diff --git a/win/tclWinSock.c b/win/tclWinSock.c index aa298f5..e18a3dd 100644 --- a/win/tclWinSock.c +++ b/win/tclWinSock.c @@ -263,8 +263,6 @@ static void  InitSockets(void)  {      DWORD id; -    WSADATA wsaData; -    DWORD err;      ThreadSpecificData *tsdPtr = (ThreadSpecificData *)  	    TclThreadDataKeyGet(&dataKey); @@ -295,38 +293,6 @@ InitSockets(void)  	    goto initFailure;  	} -	/* -	 * Initialize the winsock library and check the interface version -	 * actually loaded. We only ask for the 1.1 interface and do require -	 * that it not be less than 1.1. -	 */ - -#define WSA_VERSION_MAJOR 1 -#define WSA_VERSION_MINOR 1 -#define WSA_VERSION_REQD  MAKEWORD(WSA_VERSION_MAJOR, WSA_VERSION_MINOR) - -	err = WSAStartup((WORD)WSA_VERSION_REQD, &wsaData); -	if (err != 0) { -	    TclWinConvertWSAError(err); -	    goto initFailure; -	} - -	/* -	 * Note the byte positions are swapped for the comparison, so that -	 * 0x0002 (2.0, MAKEWORD(2,0)) doesn't look less than 0x0101 (1.1). -	 * We want the comparison to be 0x0200 < 0x0101. -	 */ - -	if (MAKEWORD(HIBYTE(wsaData.wVersion), LOBYTE(wsaData.wVersion)) -		< MAKEWORD(WSA_VERSION_MINOR, WSA_VERSION_MAJOR)) { -	    TclWinConvertWSAError(WSAVERNOTSUPPORTED); -	    WSACleanup(); -	    goto initFailure; -	} - -#undef WSA_VERSION_REQD -#undef WSA_VERSION_MAJOR -#undef WSA_VERSION_MINOR      }      /* @@ -434,7 +400,6 @@ SocketExitHandler(      TclpFinalizeSockets();      UnregisterClass("TclSocket", TclWinGetTclInstance()); -    WSACleanup();      initialized = 0;      Tcl_MutexUnlock(&socketMutex);  } @@ -2564,71 +2529,34 @@ InitializeHostName(   *----------------------------------------------------------------------   */ +#undef TclWinGetSockOpt  int  TclWinGetSockOpt(SOCKET s, int level, int optname, char *optval,  	int *optlen)  { -    /* -     * Check that WinSock is initialized; do not call it if not, to prevent -     * system crashes. This can happen at exit time if the exit handler for -     * WinSock ran before other exit handlers that want to use sockets. -     */ - -    if (!SocketsEnabled()) { -	return SOCKET_ERROR; -    } -      return getsockopt(s, level, optname, optval, optlen);  } +#undef TclWinSetSockOpt  int  TclWinSetSockOpt(SOCKET s, int level, int optname, const char *optval,      int optlen)  { -    /* -     * Check that WinSock is initialized; do not call it if not, to prevent -     * system crashes. This can happen at exit time if the exit handler for -     * WinSock ran before other exit handlers that want to use sockets. -     */ - -    if (!SocketsEnabled()) { -	return SOCKET_ERROR; -    } -      return setsockopt(s, level, optname, optval, optlen);  }  char *  TclpInetNtoa(struct in_addr addr)  { -    /* -     * Check that WinSock is initialized; do not call it if not, to prevent -     * system crashes. This can happen at exit time if the exit handler for -     * WinSock ran before other exit handlers that want to use sockets. -     */ - -    if (!SocketsEnabled()) { -        return NULL; -    } -      return inet_ntoa(addr);  } +#undef TclWinGetServByName  struct servent *  TclWinGetServByName(      const char *name,      const char *proto)  { -    /* -     * Check that WinSock is initialized; do not call it if not, to prevent -     * system crashes. This can happen at exit time if the exit handler for -     * WinSock ran before other exit handlers that want to use sockets. -     */ - -    if (!SocketsEnabled()) { -	return NULL; -    } -      return getservbyname(name, proto);  }  | 
