diff --git a/src/xpdev/sockwrap.c b/src/xpdev/sockwrap.c index f24de9e23d8dfb1760e9ebee26fee31da89e376b..d2b05fc0e5b6741821e9ec50570db2fde29b5607 100644 --- a/src/xpdev/sockwrap.c +++ b/src/xpdev/sockwrap.c @@ -390,6 +390,29 @@ int nonblocking_connect(SOCKET sock, struct sockaddr* addr, size_t size, unsigne return result; } + +union xp_sockaddr *inet_ptoaddr(char *addr_str, union xp_sockaddr *addr, size_t size) +{ + struct addrinfo hints = {0}; + struct addrinfo *res, *cur; + + hints.ai_flags = AI_NUMERICHOST|AI_PASSIVE; + if(getaddrinfo(addr_str, NULL, &hints, &res)) + return NULL; + + for(cur = res; cur; cur++) { + if(cur->ai_addr->sa_family == AF_INET6) + break; + } + if(!cur) { + freeaddrinfo(res); + return NULL; + } + memcpy(&addr, &((struct sockaddr_in6 *)(cur->ai_addr))->sin6_addr, size); + freeaddrinfo(res); + return addr; +} + const char *inet_addrtop(union xp_sockaddr *addr, char *dest, size_t size) { #ifdef _WIN32 diff --git a/src/xpdev/sockwrap.h b/src/xpdev/sockwrap.h index 7ac153b83bddf158e0cdc18c42156ebb27f7fffb..e03b26d9f69f00a56af7622c0266e87ec7fb6508 100644 --- a/src/xpdev/sockwrap.h +++ b/src/xpdev/sockwrap.h @@ -108,7 +108,7 @@ union xp_sockaddr { struct sockaddr_storage store; }; -#define xp_sockaddr_len(a) ((((struct sockaddr *)a)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) : ((struct sockaddr *)a)->sa_len) +#define xp_sockaddr_len(a) ((((struct sockaddr *)a)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) @@ -177,6 +177,7 @@ union xp_sockaddr { #define SHUT_RDWR SD_BOTH #define s_addr S_un.S_addr +#define sa_family_t ushort static int wsa_error; #define ERROR_VALUE ((wsa_error=WSAGetLastError())>0 ? wsa_error-WSABASEERR : wsa_error) @@ -227,6 +228,7 @@ int retry_bind(SOCKET s, const struct sockaddr *addr, socklen_t addrlen ,uint retries, uint wait_secs, const char* prot ,int (*lprintf)(int level, const char *fmt, ...)); int nonblocking_connect(SOCKET, struct sockaddr*, size_t, unsigned timeout /* seconds */); +union xp_sockaddr *inet_ptoaddr(char *addr_str, union xp_sockaddr *addr, size_t size); const char *inet_addrtop(union xp_sockaddr *addr, char *dest, size_t size); uint16_t inet_addrport(union xp_sockaddr *addr); void inet_setaddrport(union xp_sockaddr *addr, uint16_t port);