2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-29 13:38:26 +00:00

Merge branch '2328-make-netmgr-initialize-and-cleanup-winsock-itself' into 'main'

Make netmgr initialize and cleanup Winsock itself

Closes #2328

See merge request isc-projects/bind9!4458
This commit is contained in:
Michał Kępień 2020-12-02 21:39:14 +00:00
commit 81c080e429

View File

@ -185,11 +185,50 @@ isc__nm_test_lb_socket(sa_family_t sa_family, int protocol) {
return (result == ISC_R_SUCCESS);
}
#ifdef WIN32
static void
isc__nm_winsock_initialize(void) {
WORD wVersionRequested = MAKEWORD(2, 2);
WSADATA wsaData;
int result;
result = WSAStartup(wVersionRequested, &wsaData);
if (result != 0) {
char strbuf[ISC_STRERRORSIZE];
strerror_r(result, strbuf, sizeof(strbuf));
UNEXPECTED_ERROR(__FILE__, __LINE__,
"WSAStartup() failed with error code %lu: %s",
result, strbuf);
}
/*
* Confirm that the WinSock DLL supports version 2.2. Note that if the
* DLL supports versions greater than 2.2 in addition to 2.2, it will
* still return 2.2 in wVersion since that is the version we requested.
*/
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
UNEXPECTED_ERROR(__FILE__, __LINE__,
"Unusable WinSock DLL version: %u.%u",
LOBYTE(wsaData.wVersion),
HIBYTE(wsaData.wVersion));
}
}
static void
isc__nm_winsock_destroy(void) {
WSACleanup();
}
#endif /* WIN32 */
isc_nm_t *
isc_nm_start(isc_mem_t *mctx, uint32_t workers) {
isc_nm_t *mgr = NULL;
char name[32];
#ifdef WIN32
isc__nm_winsock_initialize();
#endif /* WIN32 */
isc__nm_tls_initialize();
if (!isc__nm_test_lb_socket(AF_INET, SOCK_DGRAM) ||
@ -352,6 +391,10 @@ nm_destroy(isc_nm_t **mgr0) {
isc_mem_put(mgr->mctx, mgr->workers,
mgr->nworkers * sizeof(isc__networker_t));
isc_mem_putanddetach(&mgr->mctx, mgr, sizeof(*mgr));
#ifdef WIN32
isc__nm_winsock_destroy();
#endif /* WIN32 */
}
void
@ -2053,8 +2096,10 @@ isc__nm_socket(int domain, int type, int protocol, uv_os_sock_t *sockp) {
return (ISC_R_FAMILYNOSUPPORT);
default:
strerror_r(socket_errno, strbuf, sizeof(strbuf));
UNEXPECTED_ERROR(__FILE__, __LINE__,
"socket() failed: %s", strbuf);
UNEXPECTED_ERROR(
__FILE__, __LINE__,
"socket() failed with error code %lu: %s",
socket_errno, strbuf);
return (ISC_R_UNEXPECTED);
}
}