diff options
author | Ulrich Drepper <drepper@redhat.com> | 1996-11-10 02:21:51 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1996-11-10 02:21:51 +0000 |
commit | 2303f5fdd96d7bec2dea11b41cc0c07eddd50979 (patch) | |
tree | 9e840de64f211d9d2244f490be68f1229dfdad81 /nss/nss_files/files-netgrp.c | |
parent | fe92af183235942f1aea400ce57a173d8f3235d6 (diff) | |
download | glibc-2303f5fdd96d7bec2dea11b41cc0c07eddd50979.tar.gz glibc-2303f5fdd96d7bec2dea11b41cc0c07eddd50979.tar.xz glibc-2303f5fdd96d7bec2dea11b41cc0c07eddd50979.zip |
update from main archive 961109 cvs/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/nss_files/files-netgrp.c')
-rw-r--r-- | nss/nss_files/files-netgrp.c | 114 |
1 files changed, 45 insertions, 69 deletions
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; } |