|
@@ -5147,6 +5147,51 @@ extern "C" {
|
|
|
|
|
|
#ifdef _WIN32
|
|
#ifdef _WIN32
|
|
|
|
|
|
|
|
+ #ifdef __MINGW32__
|
|
|
|
+ // inet_ntop/inet_pton for MinGW from http://mingw-users.1079350.n2.nabble.com/IPv6-getaddrinfo-amp-inet-ntop-td5891996.html
|
|
|
|
+ const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) {
|
|
|
|
+ if (af == AF_INET) {
|
|
|
|
+ struct sockaddr_in in;
|
|
|
|
+ memset(&in, 0, sizeof(in));
|
|
|
|
+ in.sin_family = AF_INET;
|
|
|
|
+ memcpy(&in.sin_addr, src, sizeof(struct in_addr));
|
|
|
|
+ getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST);
|
|
|
|
+ return dst;
|
|
|
|
+ }
|
|
|
|
+ else if (af == AF_INET6) {
|
|
|
|
+ struct sockaddr_in6 in;
|
|
|
|
+ memset(&in, 0, sizeof(in));
|
|
|
|
+ in.sin6_family = AF_INET6;
|
|
|
|
+ memcpy(&in.sin6_addr, src, sizeof(struct in_addr6));
|
|
|
|
+ getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST);
|
|
|
|
+ return dst;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ int inet_pton(int af, const char *src, void *dst) {
|
|
|
|
+ struct addrinfo hints, *res, *ressave;
|
|
|
|
+
|
|
|
|
+ memset(&hints, 0, sizeof(struct addrinfo));
|
|
|
|
+ hints.ai_family = af;
|
|
|
|
+
|
|
|
|
+ if (getaddrinfo(src, NULL, &hints, &res) != 0) {
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ressave = res;
|
|
|
|
+
|
|
|
|
+ while (res) {
|
|
|
|
+ memcpy(dst, res->ai_addr, res->ai_addrlen);
|
|
|
|
+ res = res->ai_next;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ freeaddrinfo(ressave);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ #endif
|
|
|
|
+
|
|
int enet_initialize(void) {
|
|
int enet_initialize(void) {
|
|
WORD versionRequested = MAKEWORD(1, 1);
|
|
WORD versionRequested = MAKEWORD(1, 1);
|
|
WSADATA wsaData;
|
|
WSADATA wsaData;
|