void sk_init(void) { #ifndef NO_IPV6 winsock2_module = #endif winsock_module = LoadLibrary("WS2_32.DLL"); if (!winsock_module) { winsock_module = LoadLibrary("WSOCK32.DLL"); } if (!winsock_module) fatalbox("Unable to load any WinSock library"); #ifndef NO_IPV6 /* Check if we have getaddrinfo in Winsock */ if (GetProcAddress(winsock_module, "getaddrinfo") != NULL) { #ifdef NET_SETUP_DIAGNOSTICS logevent(NULL, "Native WinSock IPv6 support detected"); #endif GET_WINSOCK_FUNCTION(winsock_module, getaddrinfo); GET_WINSOCK_FUNCTION(winsock_module, freeaddrinfo); GET_WINSOCK_FUNCTION(winsock_module, getnameinfo); GET_WINSOCK_FUNCTION(winsock_module, gai_strerror); } else { /* Fall back to wship6.dll for Windows 2000 */ wship6_module = LoadLibrary("wship6.dll"); if (wship6_module) { #ifdef NET_SETUP_DIAGNOSTICS logevent(NULL, "WSH IPv6 support detected"); #endif GET_WINSOCK_FUNCTION(wship6_module, getaddrinfo); GET_WINSOCK_FUNCTION(wship6_module, freeaddrinfo); GET_WINSOCK_FUNCTION(wship6_module, getnameinfo); GET_WINSOCK_FUNCTION(wship6_module, gai_strerror); } else { #ifdef NET_SETUP_DIAGNOSTICS logevent(NULL, "No IPv6 support detected"); #endif } } GET_WINSOCK_FUNCTION(winsock2_module, WSAAddressToStringA); #else #ifdef NET_SETUP_DIAGNOSTICS logevent(NULL, "PuTTY was built without IPv6 support"); #endif #endif GET_WINSOCK_FUNCTION(winsock_module, WSAAsyncSelect); GET_WINSOCK_FUNCTION(winsock_module, WSAEventSelect); GET_WINSOCK_FUNCTION(winsock_module, select); GET_WINSOCK_FUNCTION(winsock_module, WSAGetLastError); GET_WINSOCK_FUNCTION(winsock_module, WSAEnumNetworkEvents); GET_WINSOCK_FUNCTION(winsock_module, WSAStartup); GET_WINSOCK_FUNCTION(winsock_module, WSACleanup); GET_WINSOCK_FUNCTION(winsock_module, closesocket); GET_WINSOCK_FUNCTION(winsock_module, ntohl); GET_WINSOCK_FUNCTION(winsock_module, htonl); GET_WINSOCK_FUNCTION(winsock_module, htons); GET_WINSOCK_FUNCTION(winsock_module, ntohs); GET_WINSOCK_FUNCTION(winsock_module, gethostbyname); GET_WINSOCK_FUNCTION(winsock_module, getservbyname); GET_WINSOCK_FUNCTION(winsock_module, inet_addr); GET_WINSOCK_FUNCTION(winsock_module, inet_ntoa); GET_WINSOCK_FUNCTION(winsock_module, connect); GET_WINSOCK_FUNCTION(winsock_module, bind); GET_WINSOCK_FUNCTION(winsock_module, setsockopt); GET_WINSOCK_FUNCTION(winsock_module, socket); GET_WINSOCK_FUNCTION(winsock_module, listen); GET_WINSOCK_FUNCTION(winsock_module, send); GET_WINSOCK_FUNCTION(winsock_module, ioctlsocket); GET_WINSOCK_FUNCTION(winsock_module, accept); GET_WINSOCK_FUNCTION(winsock_module, recv); GET_WINSOCK_FUNCTION(winsock_module, WSAIoctl); /* Try to get the best WinSock version we can get */ if (!sk_startup(2,2) && !sk_startup(2,0) && !sk_startup(1,1)) { fatalbox("Unable to initialise WinSock"); } sktree = newtree234(cmpfortree); }
void sk_init(void) { WORD winsock_ver; WSADATA wsadata; winsock_ver = MAKEWORD(2, 0); winsock_module = LoadLibrary("WS2_32.DLL"); if (!winsock_module) { winsock_module = LoadLibrary("WSOCK32.DLL"); winsock_ver = MAKEWORD(1, 1); } if (!winsock_module) fatalbox("Unable to load any WinSock library"); #ifndef NO_IPV6 wship6_module = LoadLibrary("wship6.dll"); if (wship6_module) { GET_WINSOCK_FUNCTION(wship6_module, getaddrinfo); GET_WINSOCK_FUNCTION(wship6_module, freeaddrinfo); GET_WINSOCK_FUNCTION(wship6_module, getnameinfo); } #endif GET_WINSOCK_FUNCTION(winsock_module, WSAAsyncSelect); GET_WINSOCK_FUNCTION(winsock_module, WSAEventSelect); GET_WINSOCK_FUNCTION(winsock_module, select); GET_WINSOCK_FUNCTION(winsock_module, WSAGetLastError); GET_WINSOCK_FUNCTION(winsock_module, WSAEnumNetworkEvents); GET_WINSOCK_FUNCTION(winsock_module, WSAStartup); GET_WINSOCK_FUNCTION(winsock_module, WSACleanup); GET_WINSOCK_FUNCTION(winsock_module, closesocket); GET_WINSOCK_FUNCTION(winsock_module, ntohl); GET_WINSOCK_FUNCTION(winsock_module, htonl); GET_WINSOCK_FUNCTION(winsock_module, htons); GET_WINSOCK_FUNCTION(winsock_module, ntohs); GET_WINSOCK_FUNCTION(winsock_module, gethostbyname); GET_WINSOCK_FUNCTION(winsock_module, getservbyname); GET_WINSOCK_FUNCTION(winsock_module, inet_addr); GET_WINSOCK_FUNCTION(winsock_module, inet_ntoa); GET_WINSOCK_FUNCTION(winsock_module, connect); GET_WINSOCK_FUNCTION(winsock_module, bind); GET_WINSOCK_FUNCTION(winsock_module, setsockopt); GET_WINSOCK_FUNCTION(winsock_module, socket); GET_WINSOCK_FUNCTION(winsock_module, listen); GET_WINSOCK_FUNCTION(winsock_module, send); GET_WINSOCK_FUNCTION(winsock_module, ioctlsocket); GET_WINSOCK_FUNCTION(winsock_module, accept); GET_WINSOCK_FUNCTION(winsock_module, recv); GET_WINSOCK_FUNCTION(winsock_module, WSAIoctl); if (p_WSAStartup(winsock_ver, &wsadata)) { fatalbox("Unable to initialise WinSock"); } if (LOBYTE(wsadata.wVersion) != LOBYTE(winsock_ver)) { p_WSACleanup(); fatalbox("WinSock version is incompatible with %d.%d", LOBYTE(winsock_ver), HIBYTE(winsock_ver)); } sktree = newtree234(cmpfortree); }