From ada99b9898c63dcd53955cbf2b76281ccc9470dd Mon Sep 17 00:00:00 2001 From: mom040267 Date: Mon, 8 Sep 2014 20:55:28 +0000 Subject: [PATCH] issue 6 fixed --- ChangeLog | 1 + src/client/ns_turn_ioaddr.c | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 60469ba1..9822088c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,7 @@ Version 4.1.2.2 'Vitari': - Move debian package from SVN to GIT. - Move secondary download area to coturn.net. - TLS renegotiation DoS attack prevention implemented; + - FQDN as relay-ip and listener-ip parameters (issue 6); - oAuth security implementation. (TODO) 08/14/2014 Oleg Moskalenko diff --git a/src/client/ns_turn_ioaddr.c b/src/client/ns_turn_ioaddr.c index 26925f36..2c9f44f2 100644 --- a/src/client/ns_turn_ioaddr.c +++ b/src/client/ns_turn_ioaddr.c @@ -29,6 +29,8 @@ */ #include "ns_turn_ioaddr.h" +#include +#include ////////////////////////////////////////////////////////////// @@ -202,7 +204,38 @@ int make_ioa_addr(const u08bits* saddr, int port, ioa_addr *addr) { #endif addr->s6.sin6_port = nswap16(port); } else { - return -1; + struct addrinfo addr_hints; + struct addrinfo *addr_result = NULL; + int err; + + memset(&addr_hints, 0, sizeof(struct addrinfo)); + addr_hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ + addr_hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */ + addr_hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */ + addr_hints.ai_protocol = 0; /* Any protocol */ + addr_hints.ai_canonname = NULL; + addr_hints.ai_addr = NULL; + addr_hints.ai_next = NULL; + + err = getaddrinfo((const char*)saddr, NULL, &addr_hints, &addr_result); + if (err != 0) { + fprintf(stderr,"error resolving '%s' hostname: %s\n",saddr,gai_strerror(err)); + return -1; + } + + // getaddrinfo() returns a list of address structures. We just take the + // first one. + ns_bcopy(addr_result->ai_addr, addr, addr_result->ai_addrlen); + if (addr_result->ai_family == AF_INET) { + addr->s4.sin_port = nswap16(port); + } else if (addr_result->ai_family == AF_INET6) { + addr->s6.sin6_port = nswap16(port); +#if defined(SIN6_LEN) /* this define is required by IPv6 if used */ + addr->s6.sin6_len = sizeof(struct sockaddr_in6); +#endif + } + + freeaddrinfo(addr_result); } return 0;