Add missing errnop parameter to the NSS functions.
[kopensolaris-gnu/glibc.git] / resolv / nss_dns / dns-host.c
index f772184..4d46384 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -87,8 +87,8 @@
 #include "nsswitch.h"
 
 /* Get implementation for some internal functions.  */
-#include "../resolv/mapv4v6addr.h"
-#include "../resolv/mapv4v6hostent.h"
+#include <resolv/mapv4v6addr.h>
+#include <resolv/mapv4v6hostent.h>
 
 /* Maximum number of aliases we allow.  */
 #define MAX_NR_ALIASES 48
@@ -120,11 +120,12 @@ typedef union querybuf
 static enum nss_status getanswer_r (const querybuf *answer, int anslen,
                                    const char *qname, int qtype,
                                    struct hostent *result, char *buffer,
-                                   size_t buflen, int *h_errnop);
+                                   size_t buflen, int *errnop, int *h_errnop);
 
 enum nss_status
 _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
-                          char *buffer, size_t buflen, int *h_errnop)
+                          char *buffer, size_t buflen, int *errnop,
+                          int *h_errnop)
 {
   querybuf host_buffer;
   int size, type, n;
@@ -141,7 +142,7 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
     break;
   default:
     *h_errnop = NETDB_INTERNAL;
-    __set_errno (EAFNOSUPPORT);
+    *errnop = EAFNOSUPPORT;
     return NSS_STATUS_UNAVAIL;
   }
 
@@ -158,25 +159,30 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
 
   n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf));
   if (n < 0)
-    return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+    {
+      *h_errnop = h_errno;
+      *errnop = errno;
+      return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+    }
 
   return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen,
-                     h_errnop);
+                     errnop, h_errnop);
 }
 
 
 enum nss_status
 _nss_dns_gethostbyname_r (const char *name, struct hostent *result,
-                         char *buffer, size_t buflen, int *h_errnop)
+                         char *buffer, size_t buflen, int *errnop,
+                         int *h_errnop)
 {
   enum nss_status status = NSS_STATUS_NOTFOUND;
 
   if (_res.options & RES_USE_INET6)
     status = _nss_dns_gethostbyname2_r (name, AF_INET6, result, buffer,
-                                       buflen, h_errnop);
+                                       buflen, errnop, h_errnop);
   if (status == NSS_STATUS_NOTFOUND)
     status = _nss_dns_gethostbyname2_r (name, AF_INET, result, buffer,
-                                       buflen, h_errnop);
+                                       buflen, errnop, h_errnop);
 
   return status;
 }
@@ -185,7 +191,7 @@ _nss_dns_gethostbyname_r (const char *name, struct hostent *result,
 enum nss_status
 _nss_dns_gethostbyaddr_r (const char *addr, int len, int af,
                          struct hostent *result, char *buffer, size_t buflen,
-                         int *h_errnop)
+                         int *errnop, int *h_errnop)
 {
   static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff };
   static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
@@ -221,13 +227,13 @@ _nss_dns_gethostbyaddr_r (const char *addr, int len, int af,
       size = IN6ADDRSZ;
       break;
     default:
-      __set_errno (EAFNOSUPPORT);
+      *errnop = EAFNOSUPPORT;
       *h_errnop = NETDB_INTERNAL;
       return NSS_STATUS_UNAVAIL;
     }
   if (size != len)
     {
-      __set_errno (EAFNOSUPPORT);
+      *errnop = EAFNOSUPPORT;
       *h_errnop = NETDB_INTERNAL;
       return NSS_STATUS_UNAVAIL;
     }
@@ -242,7 +248,7 @@ _nss_dns_gethostbyaddr_r (const char *addr, int len, int af,
       qp = qbuf;
       for (n = IN6ADDRSZ - 1; n >= 0; n--)
        qp += sprintf (qp, "%x.%x.", uaddr[n] & 0xf, (uaddr[n] >> 4) & 0xf);
-      strcpy(qp, "ip6.int");
+      strcpy (qp, "ip6.int");
       break;
     default:
       /* Cannot happen.  */
@@ -251,12 +257,20 @@ _nss_dns_gethostbyaddr_r (const char *addr, int len, int af,
   n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf,
                 sizeof host_buffer);
   if (n < 0)
-    return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+    {
+      *h_errnop = h_errno;
+      *errnop = errno;
+      return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+    }
 
   status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
-                       h_errnop);
+                       errnop, h_errnop);
   if (status != NSS_STATUS_SUCCESS)
-    return status;
+    {
+      *h_errnop = h_errno;
+      *errnop = errno;
+      return status;
+    }
 
 #ifdef SUNSECURITY
   This is not implemented because it is not possible to use the current
@@ -283,7 +297,7 @@ _nss_dns_gethostbyaddr_r (const char *addr, int len, int af,
 static enum nss_status
 getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
             struct hostent *result, char *buffer, size_t buflen,
-            int *h_errnop)
+            int *errnop, int *h_errnop)
 {
   struct host_data
   {
@@ -335,7 +349,17 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
   n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
   if (n < 0 || (*name_ok) (bp) == 0)
     {
-      *h_errnop = NO_RECOVERY;
+      if (errno == EMSGSIZE)
+       {
+         /* There is not enough room in the input buffer.  */
+         *errnop = ERANGE;
+         *h_errnop = NETDB_INTERNAL;
+       }
+      else
+       {
+         *errnop = errno;
+         *h_errnop = NO_RECOVERY;
+       }
       return NSS_STATUS_UNAVAIL;
     }
   cp += n + QFIXEDSZ;
@@ -349,7 +373,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
       n = strlen (bp) + 1;             /* for the \0 */
       if (n >= MAXHOSTNAMELEN)
        {
-         __set_h_errno (NO_RECOVERY);
+         *h_errnop = NO_RECOVERY;
          return NSS_STATUS_TRYAGAIN;
        }
       result->h_name = bp;
@@ -420,8 +444,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
              ++had_error;
              continue;
            }
-         strcpy (bp, tbuf);            /* Cannot overflow.  */
-         result->h_name = bp;
+         result->h_name = strcpy (bp, tbuf);   /* Cannot overflow.  */
          bp += n;
          linebuflen -= n;
          continue;
@@ -430,25 +453,34 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
       if (qtype == T_PTR && type == T_CNAME)
        {
          n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf);
-         if (n < 0 || res_hnok (tbuf) == 0)
+         if (n < 0 || res_dnok (tbuf) == 0)
            {
              ++had_error;
              continue;
            }
          cp += n;
-         /* Get canonical name. */
+         /* Get canonical name.  */
          n = strlen (tbuf) + 1;   /* For the \0.  */
          if ((size_t) n > buflen || n >= MAXHOSTNAMELEN)
            {
              ++had_error;
              continue;
            }
-         strcpy (bp, tbuf);            /* Cannot overflow.  */
-         tname = bp;
+         tname = strcpy (bp, tbuf);    /* Cannot overflow.  */
          bp += n;
          linebuflen -= n;
          continue;
        }
+      if (type == T_SIG || type == T_KEY || type == T_NXT)
+       {
+         /* We don't support DNSSEC yet.  For now, ignore the record
+            and send a low priority message to syslog.  */
+         syslog (LOG_DEBUG | LOG_AUTH,
+              "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"",
+                 qname, p_class (C_IN), p_type(qtype), p_type (type));
+         cp += n;
+         continue;
+       }
       if (type != qtype)
        {
          syslog (LOG_NOTICE | LOG_AUTH,
@@ -561,7 +593,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
     {
       *ap = NULL;
       *hap = NULL;
-#if defined(RESOLVSORT)
+#if defined RESOLVSORT
       /*
        * Note: we sort even if host can take only one address
        * in its return structures - should give it the "best"
@@ -576,8 +608,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
          n = strlen (qname) + 1;       /* For the \0.  */
          if (n > linebuflen || n >= MAXHOSTNAMELEN)
            goto no_recovery;
-         strcpy (bp, qname);           /* Cannot overflow.  */
-         result->h_name = bp;
+         result->h_name = strcpy (bp, qname);  /* Cannot overflow.  */
          bp += n;
          linebuflen -= n;
        }