This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
freeaddrinfo(ai);
#else
struct hostent *hp;
+ unsigned char a[16];
- hp = gethostbyaddr(addr, strlen(addr), AF_INET);
+ if (!silc_net_addr2bin(addr, a, sizeof(a)))
+ return FALSE;
+
+ hp = gethostbyaddr(a, 4, AF_INET);
if (!hp)
return FALSE;
if (name_len < strlen(hp->h_name))
struct sockaddr_storage remote;
char s[NI_MAXHOST];
- *hostname = NULL;
+ if (hostname)
+ *hostname = NULL;
*ip = NULL;
SILC_LOG_DEBUG(("Resolving remote hostname and IP address"));
struct sockaddr_in remote;
char *host_ip;
- *hostname = NULL;
+ if (hostname)
+ *hostname = NULL;
*ip = NULL;
SILC_LOG_DEBUG(("Resolving remote hostname and IP address"));
return FALSE;
#endif
- /* Get host by address */
- if (!silc_net_gethostbyaddr(*ip, host, sizeof(host)))
- return FALSE;
+ /* Do reverse lookup if we want hostname too. */
+ if (hostname) {
+ /* Get host by address */
+ if (!silc_net_gethostbyaddr(*ip, host, sizeof(host)))
+ return FALSE;
- *hostname = silc_memdup(host, strlen(host));
- SILC_LOG_DEBUG(("Resolved hostname `%s'", *hostname));
+ *hostname = silc_memdup(host, strlen(host));
+ SILC_LOG_DEBUG(("Resolved hostname `%s'", *hostname));
- /* Reverse */
- if (!silc_net_gethostbyname(*hostname, TRUE, host, sizeof(host)))
- return FALSE;
+ /* Reverse */
+ if (!silc_net_gethostbyname(*hostname, TRUE, host, sizeof(host)))
+ return FALSE;
- if (strcmp(*ip, host))
- return FALSE;
+ if (strcmp(*ip, host))
+ return FALSE;
+ }
SILC_LOG_DEBUG(("Resolved IP address `%s'", *ip));
return TRUE;
struct sockaddr_storage local;
char s[NI_MAXHOST];
- *hostname = NULL;
+ if (hostname)
+ *hostname = NULL;
*ip = NULL;
SILC_LOG_DEBUG(("Resolving local hostname and IP address"));
struct sockaddr_in local;
char *host_ip;
- *hostname = NULL;
+ if (hostname)
+ *hostname = NULL;
*ip = NULL;
SILC_LOG_DEBUG(("Resolving local hostname and IP address"));
return FALSE;
#endif
- /* Get host by address */
- if (!silc_net_gethostbyaddr(*ip, host, sizeof(host)))
- return FALSE;
+ /* Do reverse lookup if we want hostname too. */
+ if (hostname) {
+ /* Get host by address */
+ if (!silc_net_gethostbyaddr(*ip, host, sizeof(host)))
+ return FALSE;
- *hostname = silc_memdup(host, strlen(host));
- SILC_LOG_DEBUG(("Resolved hostname `%s'", *hostname));
+ *hostname = silc_memdup(host, strlen(host));
+ SILC_LOG_DEBUG(("Resolved hostname `%s'", *hostname));
- /* Reverse */
- if (!silc_net_gethostbyname(*hostname, TRUE, host, sizeof(host)))
- return FALSE;
+ /* Reverse */
+ if (!silc_net_gethostbyname(*hostname, TRUE, host, sizeof(host)))
+ return FALSE;
- if (strcmp(*ip, host))
- return FALSE;
+ if (strcmp(*ip, host))
+ return FALSE;
+ }
SILC_LOG_DEBUG(("Resolved IP address `%s'", *ip));
return TRUE;