Change log directory to /var/log (FHS).
[kopensolaris-gnu/glibc.git] / nscd / nscd_gethst_r.c
index f78b104..c4ab364 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -20,6 +20,7 @@
 #include <errno.h>
 #include <netdb.h>
 #include <resolv.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/uio.h>
 #include <sys/un.h>
 
-#include "nscd.h"
+#include "nscd-client.h"
 #include "nscd_proto.h"
 
 int __nss_not_use_nscd_hosts;
 
 static int nscd_gethst_r (const char *key, size_t keylen, request_type type,
                          struct hostent *resultbuf, char *buffer,
-                         size_t buflen, int *h_errnop);
+                         size_t buflen, int *h_errnop) internal_function;
 
 
 int
@@ -66,7 +67,7 @@ __nscd_gethostbyname2_r (const char *name, int af, struct hostent *resultbuf,
 
 
 int
-__nscd_gethostbyaddr_r (const char *addr, int len, int type,
+__nscd_gethostbyaddr_r (const char *addr, size_t len, int type,
                        struct hostent *resultbuf, char *buffer, size_t buflen,
                        int *h_errnop)
 {
@@ -75,7 +76,7 @@ __nscd_gethostbyaddr_r (const char *addr, int len, int type,
   if (!((len == INADDRSZ && type == AF_INET)
        || (len == IN6ADDRSZ && type == AF_INET6)))
     /* LEN and TYPE do not match.  */
-    return 1;
+    return -1;
 
   reqtype = type == AF_INET6 ? GETHOSTBYADDRv6 : GETHOSTBYADDR;
 
@@ -113,6 +114,7 @@ open_socket (void)
 
 
 static int
+internal_function
 nscd_gethst_r (const char *key, size_t keylen, request_type type,
               struct hostent *resultbuf, char *buffer, size_t buflen,
               int *h_errnop)
@@ -125,7 +127,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
   if (sock == -1)
     {
       __nss_not_use_nscd_group = 1;
-      return 1;
+      return -1;
     }
 
   req.version = NSCD_VERSION;
@@ -135,21 +137,21 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
   if (nbytes != sizeof (request_header))
     {
       __close (sock);
-      return 1;
+      return -1;
     }
 
   nbytes = __write (sock, key, req.key_len);
   if (nbytes != req.key_len)
     {
       __close (sock);
-      return 1;
+      return -1;
     }
 
   nbytes = __read (sock, &hst_resp, sizeof (hst_response_header));
   if (nbytes != sizeof (hst_response_header))
     {
       __close (sock);
-      return 1;
+      return -1;
     }
 
   if (hst_resp.found == -1)
@@ -157,7 +159,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
       /* The daemon does not cache this database.  */
       __close (sock);
       __nss_not_use_nscd_hosts = 1;
-      return 1;
+      return -1;
     }
 
   if (hst_resp.found == 1)
@@ -165,7 +167,8 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
       struct iovec vec[4];
       size_t *aliases_len;
       char *cp = buffer;
-      uintptr_t align;
+      uintptr_t align1;
+      uintptr_t align2;
       size_t total_len;
       ssize_t cnt;
       char *ignore;
@@ -173,10 +176,13 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
 
       /* A first check whether the buffer is sufficently large is possible.  */
       /* Now allocate the buffer the array for the group members.  We must
-        align the pointer.  */
-      align = ((__alignof__ (char *) - (cp - ((char *) 0)))
-              & (__alignof__ (char *) - 1));
-      if (buflen < (align + hst_resp.h_name_len
+        align the pointer and the base of the h_addr_list pointers.  */
+      align1 = ((__alignof__ (char *) - (cp - ((char *) 0)))
+               & (__alignof__ (char *) - 1));
+      align2 = ((__alignof__ (char *) - ((cp + align1 + hst_resp.h_name_len)
+                                        - ((char *) 0)))
+               & (__alignof__ (char *) - 1));
+      if (buflen < (align1 + hst_resp.h_name_len + align2
                    + ((hst_resp.h_aliases_cnt + hst_resp.h_addr_list_cnt + 2)
                       * sizeof (char *))
                    + hst_resp.h_addr_list_cnt * (type == AF_INET
@@ -185,9 +191,9 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
        no_room:
          __set_errno (ERANGE);
          __close (sock);
-         return -1;
+         return ERANGE;
        }
-      cp += align;
+      cp += align1;
 
       /* Prepare the result as far as we can.  */
       resultbuf->h_aliases = (char **) cp;
@@ -196,7 +202,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
       cp += (hst_resp.h_addr_list_cnt + 1) * sizeof (char *);
 
       resultbuf->h_name = cp;
-      cp += hst_resp.h_name_len;
+      cp += hst_resp.h_name_len + align2;
       vec[0].iov_base = resultbuf->h_name;
       vec[0].iov_len = hst_resp.h_name_len;
 
@@ -264,7 +270,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
       if (__readv (sock, vec, n) != total_len)
        {
          __close (sock);
-         return 1;
+         return -1;
        }
 
       /*  Now we also can read the aliases.  */
@@ -285,7 +291,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
       if (__read (sock, resultbuf->h_aliases[0], total_len) != total_len)
        {
          __close (sock);
-         return 1;
+         return -1;
        }
 
       __close (sock);
@@ -297,6 +303,8 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
       *h_errnop = hst_resp.error;
 
       __close (sock);
-      return -1;
+      /* The `errno' to some value != ERANGE.  */
+      __set_errno (ENOENT);
+      return ENOENT;
     }
 }