int lws_plat_inet_pton(int af, const char *src, void *dst) { WCHAR *buffer; DWORD bufferlen = (int)strlen(src) + 1; BOOL ok = FALSE; buffer = lws_malloc(bufferlen * 2, "inet_pton"); if (!buffer) { lwsl_err("Out of memory\n"); return -1; } if (MultiByteToWideChar(CP_ACP, 0, src, bufferlen, buffer, bufferlen) <= 0) { lwsl_err("Failed to convert multi byte to wide char\n"); lws_free(buffer); return -1; } if (af == AF_INET) { struct sockaddr_in dstaddr; int dstaddrlen = sizeof(dstaddr); bzero(&dstaddr, sizeof(dstaddr)); dstaddr.sin_family = AF_INET; if (!WSAStringToAddressW(buffer, af, 0, (struct sockaddr *) &dstaddr, &dstaddrlen)) { ok = TRUE; memcpy(dst, &dstaddr.sin_addr, sizeof(dstaddr.sin_addr)); } #ifdef LWS_WITH_IPV6 } else if (af == AF_INET6) { struct sockaddr_in6 dstaddr; int dstaddrlen = sizeof(dstaddr); bzero(&dstaddr, sizeof(dstaddr)); dstaddr.sin6_family = AF_INET6; if (!WSAStringToAddressW(buffer, af, 0, (struct sockaddr *) &dstaddr, &dstaddrlen)) { ok = TRUE; memcpy(dst, &dstaddr.sin6_addr, sizeof(dstaddr.sin6_addr)); } #endif } else lwsl_err("Unsupported type\n"); if (!ok) { int rv = WSAGetLastError(); lwsl_err("WSAAddressToString() : %d\n", rv); } lws_free(buffer); return ok ? 1 : -1; }
static VOID EnumerateServerName( _In_ PWCHAR Interface, _In_ PWCHAR NameServer, _Inout_ PVOID Data) { PIP_ADAPTER_DNS_SERVER_ADDRESS** Ptr = Data; PIP_ADAPTER_DNS_SERVER_ADDRESS ServerAddress = **Ptr; UNREFERENCED_PARAMETER(Interface); ServerAddress->Length = sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS); ServerAddress->Address.lpSockaddr = (PVOID)(ServerAddress + 1); ServerAddress->Address.iSockaddrLength = sizeof(SOCKADDR); /* Get the address from the server name string */ //FIXME: Only ipv4 for now... if (WSAStringToAddressW( NameServer, AF_INET, NULL, ServerAddress->Address.lpSockaddr, &ServerAddress->Address.iSockaddrLength)) { /* Pass along, name conversion failed */ ERR("%S is not a valid IP address\n", NameServer); return; } /* Go to next item */ ServerAddress->Next = (PVOID)(ServerAddress->Address.lpSockaddr + 1); *Ptr = &ServerAddress->Next; }