38 case WSATRY_AGAIN:
return UV_EAI_AGAIN;
39 case WSAEINVAL:
return UV_EAI_BADFLAGS;
40 case WSANO_RECOVERY:
return UV_EAI_FAIL;
41 case WSAEAFNOSUPPORT:
return UV_EAI_FAMILY;
42 case WSA_NOT_ENOUGH_MEMORY:
return UV_EAI_MEMORY;
43 case WSAHOST_NOT_FOUND:
return UV_EAI_NONAME;
44 case WSATYPE_NOT_FOUND:
return UV_EAI_SERVICE;
45 case WSAESOCKTNOSUPPORT:
return UV_EAI_SOCKTYPE;
54 #if !defined(_MSC_VER) && !defined(__MINGW64_VERSION_MAJOR)
66 DECLSPEC_IMPORT
int WSAAPI
GetAddrInfoW(
const WCHAR* node,
77 #define ALIGNED_SIZE(X) ((((X) + 3) >> 2) << 2)
79 #ifndef NDIS_IF_MAX_STRING_SIZE
80 #define NDIS_IF_MAX_STRING_SIZE IF_MAX_STRING_SIZE
89 hints =
req->addrinfow;
90 req->addrinfow = NULL;
107 int addrinfo_len = 0;
112 char* alloc_ptr = NULL;
113 char* cur_ptr = NULL;
121 if (
status == UV_ECANCELED) {
122 assert(
req->retcode == 0);
123 req->retcode = UV_EAI_CANCELED;
127 if (
req->retcode == 0) {
129 addrinfow_ptr =
req->addrinfow;
130 while (addrinfow_ptr != NULL) {
131 addrinfo_len += addrinfo_struct_len +
134 name_len = WideCharToMultiByte(CP_UTF8,
148 addrinfow_ptr = addrinfow_ptr->
ai_next;
155 if (alloc_ptr != NULL) {
157 addrinfow_ptr =
req->addrinfow;
159 while (addrinfow_ptr != NULL) {
161 assert(cur_ptr + addrinfo_struct_len <= alloc_ptr + addrinfo_len);
162 addrinfo_ptr = (
struct addrinfo*)cur_ptr;
172 cur_ptr += addrinfo_struct_len;
177 alloc_ptr + addrinfo_len);
179 addrinfo_ptr->
ai_addr = (
struct sockaddr*)cur_ptr;
185 name_len = WideCharToMultiByte(CP_UTF8,
193 assert(name_len > 0);
194 assert(cur_ptr + name_len <= alloc_ptr + addrinfo_len);
195 name_len = WideCharToMultiByte(CP_UTF8,
203 assert(name_len > 0);
207 assert(cur_ptr <= alloc_ptr + addrinfo_len);
210 addrinfow_ptr = addrinfow_ptr->
ai_next;
211 if (addrinfow_ptr != NULL) {
217 req->retcode = UV_EAI_MEMORY;
222 if (
req->addrinfow != NULL) {
224 req->addrinfow = NULL;
231 if (
req->getaddrinfo_cb)
237 char* alloc_ptr = (
char*)ai;
263 char hostname_ascii[256];
267 char* alloc_ptr = NULL;
271 if (
req == NULL || (node == NULL &&
service == NULL)) {
277 req->addrinfo = NULL;
286 hostname_ascii +
sizeof(hostname_ascii));
289 nodesize =
ALIGNED_SIZE(MultiByteToWideChar(CP_UTF8, 0, hostname_ascii,
290 -1, NULL, 0) *
sizeof(WCHAR));
292 err = GetLastError();
295 node = hostname_ascii;
306 if (servicesize == 0) {
307 err = GetLastError();
316 alloc_ptr = (
char*)
uv__malloc(nodesize + servicesize + hintssize);
323 req->alloc = (
void*)alloc_ptr;
328 req->node = (WCHAR*)alloc_ptr;
329 if (MultiByteToWideChar(CP_UTF8,
334 nodesize /
sizeof(WCHAR)) == 0) {
335 err = GetLastError();
338 alloc_ptr += nodesize;
346 req->service = (WCHAR*)alloc_ptr;
347 if (MultiByteToWideChar(CP_UTF8,
352 servicesize /
sizeof(WCHAR)) == 0) {
353 err = GetLastError();
356 alloc_ptr += servicesize;
368 req->addrinfow->ai_addrlen = 0;
369 req->addrinfow->ai_canonname = NULL;
370 req->addrinfow->ai_addr = NULL;
371 req->addrinfow->ai_next = NULL;
373 req->addrinfow = NULL;
408 r = ConvertInterfaceIndexToLuid(ifindex, &luid);
413 r = ConvertInterfaceLuidToNameW(&luid, wname,
ARRAY_SIZE(wname));
419 bufsize = WideCharToMultiByte(CP_UTF8, 0, wname, -1, NULL, 0, NULL, NULL);
423 }
else if (bufsize > *
size) {
429 bufsize = WideCharToMultiByte(CP_UTF8,
456 if (
r >= (
int) *
size) {