Merged silc_1_0_branch to trunk.
[silc.git] / lib / silcutil / silcnet.c
index 07207030c044be91c64b6a814bc604bc1b681080..a77311cde20b4b2aca836d6fe62a3415d898c040 100644 (file)
@@ -8,8 +8,7 @@
 
   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
@@ -246,8 +245,12 @@ bool silc_net_gethostbyaddr(const char *addr, char *name, SilcUInt32 name_len)
   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))
@@ -288,7 +291,8 @@ bool silc_net_check_host_by_sock(int sock, char **hostname, char **ip)
   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"));
@@ -309,8 +313,10 @@ bool silc_net_check_host_by_sock(int sock, char **hostname, char **ip)
     return FALSE;
 #else
   struct sockaddr_in remote;
+  char *host_ip;
 
-  *hostname = NULL;
+  if (hostname)
+    *hostname = NULL;
   *ip = NULL;
 
   SILC_LOG_DEBUG(("Resolving remote hostname and IP address"));
@@ -330,19 +336,22 @@ bool silc_net_check_host_by_sock(int sock, char **hostname, char **ip)
     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;
@@ -360,7 +369,8 @@ bool silc_net_check_local_by_sock(int sock, char **hostname, char **ip)
   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"));
@@ -381,8 +391,10 @@ bool silc_net_check_local_by_sock(int sock, char **hostname, char **ip)
     return FALSE;
 #else
   struct sockaddr_in local;
+  char *host_ip;
 
-  *hostname = NULL;
+  if (hostname)
+    *hostname = NULL;
   *ip = NULL;
 
   SILC_LOG_DEBUG(("Resolving local hostname and IP address"));
@@ -402,19 +414,22 @@ bool silc_net_check_local_by_sock(int sock, char **hostname, char **ip)
     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;