diff options
Diffstat (limited to 'nss/nss_files')
-rw-r--r-- | nss/nss_files/files-XXX.c | 23 | ||||
-rw-r--r-- | nss/nss_files/files-alias.c | 25 | ||||
-rw-r--r-- | nss/nss_files/files-hosts.c | 30 | ||||
-rw-r--r-- | nss/nss_files/files-netgrp.c | 5 |
4 files changed, 59 insertions, 24 deletions
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c index 7472496a10..ac6b5fa94a 100644 --- a/nss/nss_files/files-XXX.c +++ b/nss/nss_files/files-XXX.c @@ -19,6 +19,7 @@ #include <stdio.h> #include <ctype.h> +#include <fcntl.h> #include <assert.h> #include <errno.h> #include <libc-lock.h> @@ -71,7 +72,27 @@ internal_setent (int stayopen) stream = fopen (DATAFILE, "r"); if (stream == NULL) - status = NSS_STATUS_UNAVAIL; + status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; + else + { + /* We have to make sure the file is `closed on exec'. */ + int result, flags; + + result = flags = fcntl (fileno (stream), F_GETFD, 0); + if (result >= 0) + { + flags |= FD_CLOEXEC; + result = fcntl (fileno (stream), F_SETFD, flags); + } + if (result < 0) + { + /* Something went wrong. Close the stream and return a + failure. */ + fclose (stream); + stream = NULL; + status = NSS_STATUS_UNAVAIL; + } + } } else rewind (stream); diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c index 341e9d4d68..aca89ed73c 100644 --- a/nss/nss_files/files-alias.c +++ b/nss/nss_files/files-alias.c @@ -1,5 +1,5 @@ /* Mail alias file parser in nss_files module. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -21,6 +21,7 @@ #include <aliases.h> #include <ctype.h> #include <errno.h> +#include <fcntl.h> #include <libc-lock.h> #include <stdlib.h> #include <stdio.h> @@ -48,7 +49,27 @@ internal_setent (void) stream = fopen ("/etc/aliases", "r"); if (stream == NULL) - status = NSS_STATUS_UNAVAIL; + status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; + else + { + /* We have to make sure the file is `closed on exec'. */ + int result, flags; + + result = flags = fcntl (fileno (stream), F_GETFD, 0); + if (result >= 0) + { + flags |= FD_CLOEXEC; + result = fcntl (fileno (stream), F_SETFD, flags); + } + if (result < 0) + { + /* Something went wrong. Close the stream and return a + failure. */ + fclose (stream); + stream = NULL; + status = NSS_STATUS_UNAVAIL; + } + } } else rewind (stream); diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c index d6dd6daea7..d6c4152507 100644 --- a/nss/nss_files/files-hosts.c +++ b/nss/nss_files/files-hosts.c @@ -26,7 +26,6 @@ /* Get implementation for some internal functions. */ #include "../resolv/mapv4v6addr.h" -#include "../resolv/mapv4v6hostent.h" #define ENTNAME hostent @@ -51,13 +50,7 @@ LINE_PARSER STRING_FIELD (addr, isspace, 1); /* Parse address. */ - if ((_res.options & RES_USE_INET6) - && inet_pton (AF_INET6, addr, entdata->host_addr) > 0) - { - result->h_addrtype = AF_INET6; - result->h_length = IN6ADDRSZ; - } - else if (inet_pton (AF_INET, addr, entdata->host_addr) > 0) + if (inet_pton (AF_INET, addr, entdata->host_addr) > 0) { if (_res.options & RES_USE_INET6) { @@ -72,6 +65,11 @@ LINE_PARSER result->h_length = INADDRSZ; } } + else if (inet_pton (AF_INET6, addr, entdata->host_addr) > 0) + { + result->h_addrtype = AF_INET6; + result->h_length = IN6ADDRSZ; + } else /* Illegal address: ignore line. */ return 0; @@ -81,22 +79,18 @@ LINE_PARSER entdata->h_addr_ptrs[1] = NULL; result->h_addr_list = entdata->h_addr_ptrs; - /* If we need the host entry in IPv6 form change it now. */ - if (_res.options & RES_USE_INET6) - { - char *bufptr = data->linebuffer; - int buflen = (char *) data + datalen - bufptr; - map_v4v6_hostent (result, &bufptr, &buflen); - } - STRING_FIELD (result->h_name, isspace, 1); }) #include "files-XXX.c" DB_LOOKUP (hostbyname, ,, - LOOKUP_NAME (h_name, h_aliases), - const char *name) + { + if (result->h_addrtype != ((_res.options & RES_USE_INET6) + ? AF_INET6 : AF_INET)) + continue; + LOOKUP_NAME (h_name, h_aliases) + }, const char *name) DB_LOOKUP (hostbyname2, ,, { diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c index d9dbf94a19..7552d4c3b1 100644 --- a/nss/nss_files/files-netgrp.c +++ b/nss/nss_files/files-netgrp.c @@ -1,5 +1,5 @@ /* Netgroup file parser in nss_files modules. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -170,8 +170,7 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result, /* Some sanity checks. */ if (cp == NULL) - /* User bug. setnetgrent() wasn't called before. */ - abort (); + return NSS_STATUS_NOTFOUND; /* First skip leading spaces. */ while (isspace (*cp)) |