summaryrefslogtreecommitdiff
path: root/nss
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1996-11-10 02:21:51 +0000
committerUlrich Drepper <drepper@redhat.com>1996-11-10 02:21:51 +0000
commit2303f5fdd96d7bec2dea11b41cc0c07eddd50979 (patch)
tree9e840de64f211d9d2244f490be68f1229dfdad81 /nss
parentfe92af183235942f1aea400ce57a173d8f3235d6 (diff)
downloadglibc-2303f5fdd96d7bec2dea11b41cc0c07eddd50979.tar.gz
update from main archive 961109cvs/libc-961110
Sun Nov 10 02:37:15 1996 Ulrich Drepper <drepper@cygnus.com> * inet/gethstent_r.c: Update copyright. * nss/getXXbyYY_r.c: Likewise. * nss/nsswitch.c: Likewise. * nss/getXXent_r.c: Likewise. * nss/nss_files/files-XXX.c: Likewise. * nss/nss_files/files-netgroup.c: Likewise. * nss/nss_files/files-parse.c: Likewise. * nss/getXXent_r.c: Change implementation. It's not necessary to call all setXXent functions. Just find first available and when necessary let getXXent_r call the others. * nss/nss_files/files-XXX.c: Make really reentrant. Now calls of getXXent and getXXbyYY can be mixed. The cursor for traversing the database with getXXent will be remembered. * stdlib/test-canon.c (cwd): Change size to PATH_MAX. Sat Nov 9 15:34:48 1996 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/Dist: Add sys/mtio.h. * sysdeps/unix/sysv/linux/sys/mtio.h: New file. * signal/signal.h [__USE_BSD]: Add prototype for siggetmask. Fri Nov 8 13:29:30 1996 Ulrich Drepper <drepper@cygnus.com> * ctype/ctype.h (__isascii): Don't test for seventh bit not to be set. Instead for none beside the first seven bits to be set. X/Open allows the argument to be an `int' value. Reported by Alain Williams <addw@phcomp.co.uk>. (toascii, isascii): Define macro also when __USE_XOPEN. * sysdeps/posix/fpathconf.c: Use fstatfs to compute NAME_MAX, not PATH_MAX. Thu Nov 7 03:04:29 1996 Ulrich Drepper <drepper@cygnus.com> * nss/getXXXent_r.c (SETFUNC_NAME): Reset `nip' after loop to NULL so that GETFUNC will see first entry. (ENDFUNC_NAME): Likewise. Rewrite Netgroups implementation to avoid global data. * inet/netgroup.h: Add definition of name_list and struct __netgrent. Add prototypes for internal netgroup functions. * nss/nss_files/files-netgroup.c (_nss_files_setnetgrent): Take extra argument and use the included data instead of global vars. (_nss_files_endnetgrent): Likewise. (_nss_netgroup_parseline): Change to be static and use data included in the RESULT structure. * inet/getnetgrent_r.c (startp): Move into setup function. (known_groups, needed_groups): new part of the __netgrent sruct. (freememory): Take extra argument and use included data. (__internal_endnetgrent): Likewise. (internal_setnetgrent): Renamed to __internal_setnetgrent_reuse and take extra argument. (__internal_setnetgrent): New function. Call __internal_setnetgrent_reuse after calling free_memory. (setnetgrent): Only call __internal_setnetgrent. (__getnetgrent_r): Split into two functions. __getnetgrent_r calls __internal_getnetgrent after locking. (innetgr): Use dynamic data only. I.e., innetgr now is fully reentrant. Thu Nov 7 00:15:14 1996 Ulrich Drepper <drepper@cygnus.com> * sysdeps/stub/setenv.c: Correct typo: unseenv -> unsetenv. Reported by Joshua Cowan <jcowan@jcowan.reslife.okstate.edu>. Wed Nov 6 13:13:37 1996 Ulrich Drepper <drepper@cygnus.com> * manual/creature.texi: Document that _GNU_SOURCE is no longer the default when no *_SOURCE macro is given. Reported by Karsten Weiss <karsten@addx.au.s.shuttle.de>. * NOTES: remade from manual/creature.texi. * manual/libc.texinfo: Add back line about GPL translation which somehow got lost. * Make-dist (dist.tar): Depend on README being updated. * rellns-sh: Correct thinko in removing leading /. Reported by Andreas Jaeger <aj@arthur.pfalz.de>. * pwd/fgetpwent_r.c: Recognize lines containing only names starting with `+' or `-' in parser. * grp/fgetgrent_r.c: Likewise. * shadow/sgetspent_r.c: Likewise. * nss/nss_files/files-spwd.c: Don't accept entries starting with `+' or `-'. * sysdeps/stub/lchown.c: New file.
Diffstat (limited to 'nss')
-rw-r--r--nss/getXXbyYY_r.c34
-rw-r--r--nss/getXXent_r.c88
-rw-r--r--nss/nss_files/files-XXX.c60
-rw-r--r--nss/nss_files/files-netgrp.c114
-rw-r--r--nss/nss_files/files-parse.c34
-rw-r--r--nss/nss_files/files-spwd.c3
-rw-r--r--nss/nsswitch.c34
7 files changed, 203 insertions, 164 deletions
diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c
index d85169ab81..1295772819 100644
--- a/nss/getXXbyYY_r.c
+++ b/nss/getXXbyYY_r.c
@@ -1,21 +1,21 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include "nsswitch.h"
diff --git a/nss/getXXent_r.c b/nss/getXXent_r.c
index 1d06a9477a..52e2136dd8 100644
--- a/nss/getXXent_r.c
+++ b/nss/getXXent_r.c
@@ -1,21 +1,21 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <libc-lock.h>
@@ -48,17 +48,17 @@ Boston, MA 02111-1307, USA. */
/* To make the real sources a bit prettier. */
#define REENTRANT_GETNAME APPEND_R (GETFUNC_NAME)
-#define APPEND_R(name) APPEND_R1 (name)
-#define APPEND_R1(name) name##_r
-#define INTERNAL(name) INTERNAL1 (name)
-#define INTERNAL1(name) __##name
+#define APPEND_R(Name) CONCAT2_2 (Name, _r)
+#define INTERNAL(Name) CONCAT2_2 (__, Name)
+#define CONCAT2_1(Pre, Post) CONCAT2_2 (Pre, Post)
+#define CONCAT2_2(Pre, Post) Pre##Post
#define SETFUNC_NAME_STRING STRINGIZE (SETFUNC_NAME)
#define GETFUNC_NAME_STRING STRINGIZE (REENTRANT_GETNAME)
#define ENDFUNC_NAME_STRING STRINGIZE (ENDFUNC_NAME)
#define DATABASE_NAME_STRING STRINGIZE (DATABASE_NAME)
-#define STRINGIZE(name) STRINGIZE1 (name)
-#define STRINGIZE1(name) #name
+#define STRINGIZE(Name) STRINGIZE1 (Name)
+#define STRINGIZE1(Name) #Name
#define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup)
#define CONCAT3_1(Pre, Name, Post) CONCAT3_2 (Pre, Name, Post)
@@ -74,9 +74,13 @@ Boston, MA 02111-1307, USA. */
#endif
/* Some databases take the `stayopen' flag. */
-#ifndef STAYOPEN
-#define STAYOPEN void
-#define STAYOPEN_VAR
+#ifdef STAYOPEN
+# define STAYOPEN_TMP CONCAT2_1 (STAYOPEN, _tmp)
+# define STAYOPEN_TMPVAR CONCAT2_1 (STAYOPEN_VAR, _tmp)
+#else
+# define STAYOPEN void
+# define STAYOPEN_VAR
+# define STAYOPEN_TMPVAR
#endif
/* Prototype for the setXXXent functions we use here. */
@@ -95,6 +99,13 @@ static service_user *nip;
/* Remember the first service_entry, it's always the same. */
static service_user *startp;
+#ifdef STAYOPEN_TMP
+/* We need to remember the last `stayopen' flag given by the user
+ since the `setent' function is only called for the first available
+ service. */
+static STAYOPEN_TMP;
+#endif
+
/* Protect above variable against multiple uses at the same time. */
__libc_lock_define_initialized (static, lock)
@@ -143,15 +154,21 @@ SETFUNC_NAME (STAYOPEN)
__libc_lock_lock (lock);
- /* Cycle through all the services and run their setXXent functions. */
+ /* Cycle through the services and run their `setXXent' functions until
+ we find an available service. */
no_more = setup ((void **) &fct, SETFUNC_NAME_STRING, 1);
while (! no_more)
{
- /* Ignore status, we force check in __NSS_NEXT. */
- (void) (*fct) (STAYOPEN_VAR);
+ enum nss_status status = (*fct) (STAYOPEN_VAR);
- no_more = __nss_next (&nip, SETFUNC_NAME_STRING, (void **) &fct, 0, 1);
+ no_more = __nss_next (&nip, SETFUNC_NAME_STRING, (void **) &fct,
+ status, 1);
}
+ nip = NULL;
+
+#ifdef STAYOPEN_TMP
+ STAYOPEN_TMPVAR = STAYOPEN_VAR;
+#endif
__libc_lock_unlock (lock);
}
@@ -182,6 +199,7 @@ ENDFUNC_NAME (void)
no_more = __nss_next (&nip, ENDFUNC_NAME_STRING, (void **) &fct, 0, 1);
}
+ nip = NULL;
__libc_lock_unlock (lock);
}
@@ -214,10 +232,26 @@ INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen,
no_more = setup ((void **) &fct, GETFUNC_NAME_STRING, 0);
while (! no_more)
{
+ service_user *current_nip = nip;
+
status = (*fct) (resbuf, buffer, buflen H_ERRNO_VAR);
no_more = __nss_next (&nip, GETFUNC_NAME_STRING, (void **) &fct,
status, 0);
+
+ if (! no_more && current_nip != nip)
+ /* Call the `setXXent' function. This wasn't done before. */
+ do
+ {
+ set_function *sfct;
+
+ no_more = __nss_lookup (&nip, SETFUNC_NAME_STRING,
+ (void **) &sfct);
+
+ if (! no_more)
+ status = (*sfct) (STAYOPEN_TMPVAR);
+ }
+ while (! no_more && status != NSS_STATUS_SUCCESS);
}
__libc_lock_unlock (lock);
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c
index 404a9f9750..b6702b0366 100644
--- a/nss/nss_files/files-XXX.c
+++ b/nss/nss_files/files-XXX.c
@@ -1,21 +1,21 @@
/* Common code for file-based databases in nss_files module.
-Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+ Copyright (C) 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <stdio.h>
#include <ctype.h>
@@ -54,6 +54,8 @@ __libc_lock_define_initialized (static, lock)
/* Maintenance of the shared stream open on the database file. */
static FILE *stream;
+static fpos_t position;
+static enum { none, getent, getby } last_use;
static int keep_stream;
/* Open database file if not already opened. */
@@ -90,6 +92,15 @@ CONCAT(_nss_files_set,ENTNAME) (int stayopen)
status = internal_setent (stayopen);
+ if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0)
+ {
+ fclose (stream);
+ stream = NULL;
+ status = NSS_STATUS_UNAVAIL;
+ }
+
+ last_use = getent;
+
__libc_lock_unlock (lock);
return status;
@@ -182,11 +193,25 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result,
char *buffer, int buflen H_ERRNO_PROTO)
{
/* Return next entry in host file. */
- int status;
+ int status = NSS_STATUS_SUCCESS;
__libc_lock_lock (lock);
- status = internal_getent (result, buffer, buflen H_ERRNO_ARG);
+ /* If the last use was not by the getent function we need the
+ position the stream. */
+ if (last_use != getent)
+ if (fsetpos (stream, &position) < 0)
+ status = NSS_STATUS_UNAVAIL;
+ else
+ last_use = getent;
+
+ if (status == NSS_STATUS_SUCCESS)
+ {
+ status = internal_getent (result, buffer, buflen H_ERRNO_ARG);
+
+ /* Remember this position. */
+ fgetpos (stream, &position);
+ }
__libc_lock_unlock (lock);
@@ -218,6 +243,9 @@ _nss_files_get##name##_r (proto, \
/* Reset file pointer to beginning or open file. */ \
internal_setent (keep_stream); \
\
+ /* Tell getent function that we have repositioned the file pointer. */ \
+ last_use = getby; \
+ \
while ((status = internal_getent (result, buffer, buflen H_ERRNO_ARG)) \
== NSS_STATUS_SUCCESS) \
{ break_if_match } \
diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c
index 427c6bfe8d..5f8b9398d8 100644
--- a/nss/nss_files/files-netgrp.c
+++ b/nss/nss_files/files-netgrp.c
@@ -1,26 +1,25 @@
/* Netgroup file parser in nss_files modules.
-Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+ Copyright (C) 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <ctype.h>
#include <errno.h>
-#include <libc-lock.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
@@ -31,39 +30,27 @@ Boston, MA 02111-1307, USA. */
#define DATAFILE "/etc/netgroup"
-/* Locks the static variables in this file. */
-__libc_lock_define_initialized (static, lock)
-
-/* We share a single place where we store the data for the current
- netgroup. This buffer is allocated by `setnetgrent' and freed on
- the next call of this function or when calling `endnetgrent'. */
-static char *data;
-static size_t data_size;
-static char *cursor;
-static int first;
-
-
#define EXPAND(needed) \
do \
{ \
- size_t old_cursor = cursor - data; \
+ size_t old_cursor = result->cursor - result->data; \
\
- data_size += 512 > 2 * needed ? 512 : 2 * needed; \
- data = realloc (data, data_size); \
+ result->data_size += 512 > 2 * needed ? 512 : 2 * needed; \
+ result->data = realloc (result->data, result->data_size); \
\
- if (data == NULL) \
+ if (result->data == NULL) \
{ \
status = NSS_STATUS_UNAVAIL; \
goto the_end; \
} \
\
- cursor = data + old_cursor; \
+ result->cursor = result->data + old_cursor; \
} \
while (0)
enum nss_status
-_nss_files_setnetgrent (const char *group)
+_nss_files_setnetgrent (const char *group, struct __netgrent *result)
{
FILE *fp;
enum nss_status status;
@@ -71,8 +58,6 @@ _nss_files_setnetgrent (const char *group)
if (group[0] == '\0')
return NSS_STATUS_UNAVAIL;
- __libc_lock_lock (lock);
-
/* Find the netgroups file and open it. */
fp = fopen (DATAFILE, "r");
if (fp == NULL)
@@ -86,7 +71,7 @@ _nss_files_setnetgrent (const char *group)
const ssize_t group_len = strlen (group);
status = NSS_STATUS_NOTFOUND;
- cursor = data;
+ result->cursor = result->data;
while (!feof (fp))
{
@@ -108,8 +93,9 @@ _nss_files_setnetgrent (const char *group)
{
/* Store the data from the first line. */
EXPAND (curlen - group_len);
- memcpy (cursor, &line[group_len + 1], curlen - group_len);
- cursor += (curlen - group_len) - 1;
+ memcpy (result->cursor, &line[group_len + 1],
+ curlen - group_len);
+ result->cursor += (curlen - group_len) - 1;
}
while (line[curlen - 1] == '\n' && line[curlen - 2] == '\\')
@@ -117,7 +103,7 @@ _nss_files_setnetgrent (const char *group)
/* Yes, we have a continuation line. */
if (found)
/* Remove these characters from the stored line. */
- cursor -= 2;
+ result->cursor -= 2;
/* Get netxt line. */
curlen = getline (&line, &line_len, fp);
@@ -130,11 +116,11 @@ _nss_files_setnetgrent (const char *group)
EXPAND (1 + curlen + 1);
/* Add separator in case next line starts immediately. */
- *cursor++ = ' ';
+ *result->cursor++ = ' ';
/* Copy new line. */
- memcpy (cursor, line, curlen + 1);
- cursor += curlen;
+ memcpy (result->cursor, line, curlen + 1);
+ result->cursor += curlen;
}
}
@@ -142,8 +128,8 @@ _nss_files_setnetgrent (const char *group)
{
/* Now we have read the line. */
status = NSS_STATUS_SUCCESS;
- cursor = data;
- first = 1;
+ result->cursor = result->data;
+ result->first = 1;
break;
}
}
@@ -154,33 +140,27 @@ _nss_files_setnetgrent (const char *group)
fclose (fp);
}
- __libc_lock_unlock (lock);
-
return status;
}
int
-_nss_files_endnetgrent (void)
+_nss_files_endnetgrent (struct __netgrent *result)
{
- __libc_lock_lock (lock);
-
/* Free allocated memory for data if some is present. */
- if (data != NULL)
+ if (result->data != NULL)
{
- free (data);
- data = NULL;
- data_size = 0;
- cursor = NULL;
+ free (result->data);
+ result->data = NULL;
+ result->data_size = 0;
+ result->cursor = NULL;
}
- __libc_lock_unlock (lock);
-
return NSS_STATUS_SUCCESS;
}
-enum nss_status
+static enum nss_status
_nss_netgroup_parseline (char **cursor, struct __netgrent *result,
char *buffer, int buflen)
{
@@ -216,31 +196,31 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result,
if (! last)
++cp;
*cursor = cp;
- first = 0;
+ result->first = 0;
return NSS_STATUS_SUCCESS;
}
- return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
+ return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
}
/* Match host name. */
host = ++cp;
while (*cp != ',')
if (*cp++ == '\0')
- return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
+ return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
/* Match user name. */
user = ++cp;
while (*cp != ',')
if (*cp++ == '\0')
- return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
+ return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
/* Match domain name. */
domain = ++cp;
while (*cp != ')')
if (*cp++ == '\0')
- return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
+ return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
++cp;
@@ -271,7 +251,7 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result,
/* Rememember where we stopped reading. */
*cursor = cp;
- first = 0;
+ result->first = 0;
}
return status;
@@ -283,11 +263,7 @@ _nss_files_getnetgrent_r (struct __netgrent *result, char *buffer, int buflen)
{
enum nss_status status;
- __libc_lock_lock (lock);
-
- status = _nss_netgroup_parseline (&cursor, result, buffer, buflen);
-
- __libc_lock_unlock (lock);
+ status = _nss_netgroup_parseline (&result->cursor, result, buffer, buflen);
return status;
}
diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c
index 6bebfa287c..1250bb9572 100644
--- a/nss/nss_files/files-parse.c
+++ b/nss/nss_files/files-parse.c
@@ -1,21 +1,21 @@
/* Common code for file-based database parsers in nss_files module.
-Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ Copyright (C) 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <ctype.h>
#include <errno.h>
diff --git a/nss/nss_files/files-spwd.c b/nss/nss_files/files-spwd.c
index df0106bdd6..27cc5882a4 100644
--- a/nss/nss_files/files-spwd.c
+++ b/nss/nss_files/files-spwd.c
@@ -32,6 +32,7 @@ struct spent_data {};
DB_LOOKUP (spnam, 1 + strlen (name), (".%s", name),
{
- if (! strcmp (name, result->sp_namp))
+ if (name[0] != '+' && name[0] != '-'
+ && ! strcmp (name, result->sp_namp))
break;
}, const char *name)
diff --git a/nss/nsswitch.c b/nss/nsswitch.c
index 9f27ef80ff..8ce1e8d122 100644
--- a/nss/nsswitch.c
+++ b/nss/nsswitch.c
@@ -1,21 +1,21 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <ctype.h>
#include <dlfcn.h>