]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/export/hostname.c
fix unexpiring
[nfs-utils.git] / support / export / hostname.c
index a37d4de44429ea670d450811415cc00b212adb3f..f88e0a485290cb878ab670f4b6917648c3903485 100644 (file)
@@ -16,6 +16,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <stdlib.h>
+#include <xlog.h>
 #ifdef TEST
 #define xmalloc malloc
 #else
@@ -104,7 +105,7 @@ hostent_dup (struct hostent *hp)
   char **sp;
   struct hostent *cp;
 
-  for (sp = hp->h_aliases; *sp; sp++)
+  for (sp = hp->h_aliases; sp && *sp; sp++)
     {
       num_aliases++;
       len_aliases += align (strlen (*sp) + 1, ALIGNMENT)
@@ -130,14 +131,14 @@ hostent_dup (struct hostent *hp)
   cp->h_aliases = (char **) &(((char *) cp) [pos]);
   pos += num_aliases * sizeof (char *);
   for (sp = hp->h_aliases, i = 0; i < num_aliases; i++, sp++)
-    if (*sp)
+    if (sp && *sp)
       {
        cp->h_aliases [i] = (char *) &(((char *) cp) [pos]);
        strcpy (cp->h_aliases [i], *sp);
        pos += align (strlen (*sp) + 1, ALIGNMENT);
       }
     else
-      cp->h_aliases [i] = *sp;
+      cp->h_aliases [i] = NULL;
 
   pos = len_ent + len_name + len_aliases;
   cp->h_addr_list = (char **) &(((char *) cp) [pos]);
@@ -216,6 +217,57 @@ matchhostname (const char *h1, const char *h2)
   return status;
 }
 
+
+/* Map IP to hostname, and then map back to addr to make sure it is a
+ * reliable hostname 
+ */
+struct hostent *
+get_reliable_hostbyaddr(const char *addr, int len, int type)
+{
+       struct hostent *hp;
+
+       char **sp;
+       struct hostent *forward = NULL;
+       char *tmpname;
+
+       hp = gethostbyaddr(addr, len , type);
+       if (!hp)
+               return hp;
+
+       /* must make sure the hostent is authorative. */
+
+       hp = hostent_dup (hp);
+       tmpname = xstrdup((hp)->h_name);
+       if (tmpname) {
+               forward = gethostbyname(tmpname);
+               free(tmpname);
+       }
+       if (forward) {
+               /* now make sure the "addr" is in the list */
+               for (sp = forward->h_addr_list ; *sp ; sp++) {
+                       if (memcmp(*sp, addr, forward->h_length)==0)
+                               break;
+               }
+               
+               if (!*sp) {
+                       /* it was a FAKE */
+                       xlog(L_WARNING, "Fake hostname %s for %s - forward lookup doesn't match reverse",
+                            forward->h_name, inet_ntoa(*(struct in_addr*)addr));
+                       return NULL;
+               }
+               free (hp);
+               hp = hostent_dup (forward);
+       }
+       else {
+               /* never heard of it. misconfigured DNS? */
+               xlog(L_WARNING, "Fake hostname %s for %s - forward lookup doesn't exist",
+                    forward->h_name, inet_ntoa(*(struct in_addr*)addr));
+               return NULL;
+       }
+       return hp;
+}
+
+
 #ifdef TEST
 void
 print_host (struct hostent *hp)