From 5a58786a39bbef7ed4805821cc921f1d40f12068 Mon Sep 17 00:00:00 2001 From: Paul Kulchenko Date: Sun, 7 Apr 2013 12:39:56 -0700 Subject: Added inet_pton/inet_ntop for MinGW on Windows; compiles with Lua52. --- src/inet.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/inet.h | 6 ++++++ 2 files changed, 56 insertions(+) (limited to 'src') diff --git a/src/inet.c b/src/inet.c index 69d32e6..1017022 100644 --- a/src/inet.c +++ b/src/inet.c @@ -507,4 +507,54 @@ int inet_aton(const char *cp, struct in_addr *inp) } #endif +// inet_ntop/inet_pton for MinGW from http://mingw-users.1079350.n2.nabble.com/IPv6-getaddrinfo-amp-inet-ntop-td5891996.html +#ifdef INET_PTON +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 diff --git a/src/inet.h b/src/inet.h index 4678ba6..2f72533 100644 --- a/src/inet.h +++ b/src/inet.h @@ -20,6 +20,7 @@ #ifdef _WIN32 #define INET_ATON +#define INET_PTON #endif int inet_open(lua_State *L); @@ -42,4 +43,9 @@ int inet_optsocktype(lua_State* L, int narg, const char* def); int inet_aton(const char *cp, struct in_addr *inp); #endif +#ifdef INET_PTON +const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt); +int inet_pton(int af, const char *src, void *dst); +#endif + #endif /* INET_H */ -- cgit v1.2.3-55-g6feb