Move xdr_* functions from nis/nis_xdr.h.
[kopensolaris-gnu/glibc.git] / nss / nss_db / db-alias.c
index 51a63a8..27b7952 100644 (file)
@@ -1,5 +1,5 @@
 /* Mail alias file parser in nss_db module.
-   Copyright (C) 1996 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
 #include <aliases.h>
 #include <alloca.h>
 #include <ctype.h>
-#include <db.h>
+#include <db_185.h>
 #include <errno.h>
 #include <fcntl.h>
-#include <libc-lock.h>
+#include <bits/libc-lock.h>
 #include <paths.h>
 #include <string.h>
 
@@ -51,6 +51,26 @@ internal_setent (int stayopen)
 
       if (db == NULL)
        status = NSS_STATUS_UNAVAIL;
+      else
+       {
+         /* We have to make sure the file is  `closed on exec'.  */
+         int result, flags;
+
+         result = flags = fcntl ((*db->fd) (db), F_GETFD, 0);
+         if (result >= 0)
+           {
+             flags |= FD_CLOEXEC;
+             result = fcntl ((*db->fd) (db), F_SETFD, flags);
+           }
+         if (result < 0)
+           {
+             /* Something went wrong.  Close the stream and return a
+                failure.  */
+             (*db->close) (db);
+             db = NULL;
+             status = NSS_STATUS_UNAVAIL;
+           }
+       }
     }
 
   /* Remember STAYOPEN flag.  */
@@ -114,7 +134,7 @@ _nss_db_endaliasent (void)
    the result.  */
 static enum nss_status
 lookup (const DBT *key, struct aliasent *result, char *buffer,
-           size_t buflen)
+       size_t buflen, int *errnop)
 {
   enum nss_status status;
   DBT value;
@@ -134,7 +154,7 @@ lookup (const DBT *key, struct aliasent *result, char *buffer,
       if (buflen < key->size + 1)
        {
        no_more_room:
-         __set_errno (ERANGE);
+         *errnop = ERANGE;
          return NSS_STATUS_TRYAGAIN;
        }
 
@@ -198,16 +218,17 @@ lookup (const DBT *key, struct aliasent *result, char *buffer,
 }
 \f
 enum nss_status
-_nss_db_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen)
+_nss_db_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen,
+                      int *errnop)
 {
-  /* Return next entry in host file.  */
+  /* Return next entry in alias file.  */
   enum nss_status status;
   char buf[20];
   DBT key;
 
   __libc_lock_lock (lock);
-  key.size = 1 + snprintf (key.data = buf, sizeof buf, "0%u", entidx++);
-  status = lookup (&key, result, buffer, buflen);
+  key.size = snprintf (key.data = buf, sizeof buf, "0%u", entidx++);
+  status = lookup (&key, result, buffer, buflen, errnop);
   __libc_lock_unlock (lock);
 
   return status;
@@ -216,7 +237,7 @@ _nss_db_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen)
 
 enum nss_status
 _nss_db_getaliasbyname_r (const char *name, struct aliasent *result,
-                         char *buffer, size_t buflen)
+                         char *buffer, size_t buflen, int *errnop)
 {
   DBT key;
   enum nss_status status;
@@ -228,7 +249,7 @@ _nss_db_getaliasbyname_r (const char *name, struct aliasent *result,
   memcpy (&((char *) key.data)[1], name, key.size - 1);
 
   __libc_lock_lock (lock);
-  status = lookup (&key, result, buffer, buflen);
+  status = lookup (&key, result, buffer, buflen, errnop);
   __libc_lock_unlock (lock);
 
   return status;