/* 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 <bits/libc-lock.h>
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. */
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;
if (buflen < key->size + 1)
{
no_more_room:
- __set_errno (ERANGE);
+ *errnop = ERANGE;
return NSS_STATUS_TRYAGAIN;
}
}
\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;
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;
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;