Update.
* string/endian.h: Explain the _*_ENDIAN constant values a bit more. Patch by scarlet@mit.edu [PR libc/1799]. * io/ftwtest-sh: Add -f parameter to chmod if -R is also given. [PR libc/1792]. * argp/argp-parse.c (parser_finalize): Reverse order in which parsers are run for ARGP_KEY_END. [PR libc/1755].
This commit is contained in:
parent
cf9e9ad98f
commit
7603ea28d3
@ -1,5 +1,14 @@
|
||||
2000-07-23 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* string/endian.h: Explain the _*_ENDIAN constant values a bit
|
||||
more. Patch by scarlet@mit.edu [PR libc/1799].
|
||||
|
||||
* io/ftwtest-sh: Add -f parameter to chmod if -R is also given.
|
||||
[PR libc/1792].
|
||||
|
||||
* argp/argp-parse.c (parser_finalize): Reverse order in which
|
||||
parsers are run for ARGP_KEY_END. [PR libc/1755].
|
||||
|
||||
* grp/initgroups.c (initgroups): Don't limit the possible number
|
||||
of groups to NGROUPS_MAX. Allow dynamic resizing. Loop around
|
||||
the setgroups call while the call fails and descrease the number
|
||||
|
27
README
27
README
@ -48,28 +48,11 @@ work anymore. Porting the library is not hard. If you are interested
|
||||
in doing a port, please contact the glibc maintainers by sending
|
||||
electronic mail to <bug-glibc@gnu.org>.
|
||||
|
||||
The GNU C library now includes Michael Glad's Ultra Fast Crypt, which
|
||||
provides the Unix `crypt' function, plus some other entry points.
|
||||
Because of the United States export restriction on DES
|
||||
implementations, we are distributing this code separately from the
|
||||
rest of the C library. There is an extra distribution tar file just
|
||||
for crypt; it is called `glibc-crypt-2.1.91.tar.gz'. You can just
|
||||
unpack the crypt distribution along with the rest of the C library and
|
||||
build; you can also build the library without getting crypt. Users
|
||||
outside the USA can get the crypt distribution via anonymous FTP from
|
||||
ftp.gwdg.de [134.76.11.100] in the directory pub/linux/glibc, or
|
||||
another archive site outside the USA. Archive maintainers are
|
||||
encouraged to copy this distribution to their archives outside the
|
||||
USA. Please get it from ftp.gwdg.de; transferring this distribution
|
||||
from ftp.gnu.org (or any other site in the USA) to a site outside the
|
||||
USA is in violation of US export laws.
|
||||
|
||||
Beside the separate crypt tar file there are some more add-ons which can be
|
||||
used together with GNU libc. They are designed in a way to ease the
|
||||
installation by integrating them in the libc source tree. Simply get the
|
||||
add-ons you need and use the --enable-add-ons option of the `configure'
|
||||
script to tell where the add-ons are found. Please read the FAQ file for
|
||||
more details.
|
||||
There are some add-ons which can be used together with GNU libc. They
|
||||
are designed in a way to ease the installation by integrating them in
|
||||
the libc source tree. Simply get the add-ons you need and use the
|
||||
--enable-add-ons option of the `configure' script to tell where the
|
||||
add-ons are found. Please read the FAQ file for more details.
|
||||
|
||||
See the file INSTALL to find out how to configure, build, install, and port
|
||||
the GNU C library. You might also consider reading the WWW pages for the
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Hierarchial argument parsing, layered over getopt
|
||||
Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||
|
||||
@ -615,9 +615,9 @@ parser_finalize (struct parser *parser,
|
||||
group++)
|
||||
if (group->args_processed == 0)
|
||||
err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0);
|
||||
for (group = parser->groups;
|
||||
group < parser->egroup && (!err || err==EBADKEY);
|
||||
group++)
|
||||
for (group = parser->egroup - 1;
|
||||
group >= parser->groups && (!err || err==EBADKEY);
|
||||
group--)
|
||||
err = group_parse (group, &parser->state, ARGP_KEY_END, 0);
|
||||
|
||||
if (err == EBADKEY)
|
||||
|
@ -49,7 +49,7 @@ extern service_user *__nss_group_database;
|
||||
|
||||
static enum nss_status
|
||||
compat_call (service_user *nip, const char *user, gid_t group, long int *start,
|
||||
long int *size, gid_t **groupsp, int *errnop)
|
||||
long int *size, gid_t **groupsp, long int limit, int *errnop)
|
||||
{
|
||||
struct group grpbuf;
|
||||
size_t buflen = __sysconf (_SC_GETGR_R_SIZE_MAX);
|
||||
@ -102,11 +102,22 @@ compat_call (service_user *nip, const char *user, gid_t group, long int *start,
|
||||
{
|
||||
/* Need a bigger buffer. */
|
||||
gid_t *newgroups;
|
||||
newgroups = realloc (groups, 2 * *size * sizeof (*groups));
|
||||
long int newsize;
|
||||
|
||||
if (limit > 0 && *size == limit)
|
||||
/* We reached the maximum. */
|
||||
goto done;
|
||||
|
||||
if (limit <= 0)
|
||||
newsize = 2 * *size;
|
||||
else
|
||||
newsize = MIN (limit, 2 * *size);
|
||||
|
||||
newgroups = realloc (groups, newsize * sizeof (*groups));
|
||||
if (newgroups == NULL)
|
||||
goto done;
|
||||
*groupsp = groups = newgroups;
|
||||
*size *= 2;
|
||||
*size = newsize;
|
||||
}
|
||||
|
||||
groups[*start] = grpbuf.gr_gid;
|
||||
@ -147,10 +158,12 @@ initgroups (user, group)
|
||||
/* Start is one, because we have the first group as parameter. */
|
||||
long int start = 1;
|
||||
long int size;
|
||||
long int limit;
|
||||
gid_t *groups;
|
||||
int result;
|
||||
#ifdef NGROUPS_MAX
|
||||
size = NGROUPS_MAX;
|
||||
limit = -1;
|
||||
#else
|
||||
long int limit = __sysconf (_SC_NGROUPS_MAX);
|
||||
|
||||
@ -184,14 +197,14 @@ initgroups (user, group)
|
||||
if (fct == NULL)
|
||||
{
|
||||
status = compat_call (nip, user, group, &start, &size, &groups,
|
||||
&errno);
|
||||
limit, &errno);
|
||||
|
||||
if (nss_next_action (nip, NSS_STATUS_UNAVAIL) != NSS_ACTION_CONTINUE)
|
||||
break;
|
||||
}
|
||||
else
|
||||
status = DL_CALL_FCT (fct, (user, group, &start, &size, &groups,
|
||||
&errno));
|
||||
limit, &errno));
|
||||
|
||||
/* This is really only for debugging. */
|
||||
if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
#include "nss_hesiod.h"
|
||||
|
||||
@ -165,7 +166,8 @@ internal_gid_from_group (void *context, const char *groupname, gid_t *group)
|
||||
|
||||
enum nss_status
|
||||
_nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
long int *size, gid_t **groupsp, int *errnop)
|
||||
long int *size, gid_t **groupsp, long int limit,
|
||||
int *errnop)
|
||||
{
|
||||
enum nss_status status = NSS_STATUS_SUCCESS;
|
||||
char **list = NULL;
|
||||
@ -191,11 +193,22 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
{
|
||||
/* Need a bigger buffer. */
|
||||
gid_t *newgroups;
|
||||
newgroups = realloc (groups, 2 * *size * sizeof (*groups));
|
||||
long int newsize;
|
||||
|
||||
if (limit > 0 && *size == limit)
|
||||
/* We reached the maximum. */
|
||||
goto done;
|
||||
|
||||
if (limit <= 0)
|
||||
newsize = 2 * *size;
|
||||
else
|
||||
newsize = MIN (limit, 2 * *size);
|
||||
|
||||
newgroups = realloc (groups, newsize * sizeof (*groups));
|
||||
if (newgroups == NULL)
|
||||
goto done;
|
||||
*groupsp = groups = newgroups;
|
||||
*size *= 2;
|
||||
*size = newsize;
|
||||
}
|
||||
|
||||
groups[(*start)++] = group;
|
||||
@ -232,11 +245,22 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
{
|
||||
/* Need a bigger buffer. */
|
||||
gid_t *newgroups;
|
||||
newgroups = realloc (groups, 2 * *size * sizeof (*groups));
|
||||
long int newsize;
|
||||
|
||||
if (limit > 0 && *size == limit)
|
||||
/* We reached the maximum. */
|
||||
goto done;
|
||||
|
||||
if (limit <= 0)
|
||||
newsize = 2 * *size;
|
||||
else
|
||||
newsize = MIN (limit, 2 * *size);
|
||||
|
||||
newgroups = realloc (groups, newsize * sizeof (*groups));
|
||||
if (newgroups == NULL)
|
||||
goto done;
|
||||
*groupsp = groups = newgroups;
|
||||
*size *= 2;
|
||||
*size = newsize;
|
||||
}
|
||||
|
||||
groups[(*start)++] = group;
|
||||
|
@ -28,10 +28,10 @@ tmpdir=$tmp/ftwtest.d
|
||||
|
||||
[ -f ${objpfx}elf/ld.so ] && ldso=${objpfx}elf/ld.so
|
||||
|
||||
trap 'chmod -R a+x $tmpdir; rm -fr $tmpdir $testout' 1 2 3 15
|
||||
trap 'chmod -fR a+x $tmpdir; rm -fr $tmpdir $testout' 1 2 3 15
|
||||
|
||||
if test -d $tmpdir; then
|
||||
chmod -R a+x $tmpdir
|
||||
chmod -fR a+x $tmpdir
|
||||
rm -fr $tmpdir
|
||||
fi
|
||||
mkdir $tmpdir
|
||||
@ -112,7 +112,7 @@ EOF
|
||||
rm $testout
|
||||
|
||||
# For the next test everything must be readable.
|
||||
chmod -R a+x $tmpdir
|
||||
chmod -fR a+x $tmpdir
|
||||
|
||||
LD_LIBRARY_PATH=$objpfx $ldso $testprogram --chdir $tmpdir |
|
||||
sort > $testout
|
||||
|
@ -495,7 +495,9 @@ case ARGP_KEY_ARGS:
|
||||
@comment argp.h
|
||||
@comment GNU
|
||||
@item ARGP_KEY_END
|
||||
There are no more command line arguments at all.
|
||||
There are no more command line arguments at all. The parser functions
|
||||
are called in different order (means children first) for this value
|
||||
which allows each parser to clean up its state for the parent.
|
||||
|
||||
@comment argp.h
|
||||
@comment GNU
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <rpcsvc/yp.h>
|
||||
#include <rpcsvc/ypclnt.h>
|
||||
#include <rpcsvc/nis.h>
|
||||
#include <sys/param.h>
|
||||
#include <nsswitch.h>
|
||||
|
||||
#include "nss-nis.h"
|
||||
@ -589,7 +590,8 @@ internal_getgrent_r (struct group *gr, ent_t *ent, char *buffer,
|
||||
|
||||
enum nss_status
|
||||
_nss_compat_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
long int *size, gid_t **groupsp, int *errnop)
|
||||
long int *size, gid_t **groupsp, long int limit,
|
||||
int *errnop)
|
||||
{
|
||||
struct group grpbuf, *g;
|
||||
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
|
||||
@ -631,11 +633,22 @@ _nss_compat_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
{
|
||||
/* Need a bigger buffer. */
|
||||
gid_t *newgroups;
|
||||
newgroups = realloc (groups, 2 * *size * sizeof (*groups));
|
||||
long int newsize;
|
||||
|
||||
if (limit > 0 && *size == limit)
|
||||
/* We reached the maximum. */
|
||||
goto done;
|
||||
|
||||
if (limit <= 0)
|
||||
newsize = 2 * *size;
|
||||
else
|
||||
newsize = MIN (limit, 2 * *size);
|
||||
|
||||
newgroups = realloc (groups, newsize * sizeof (*groups));
|
||||
if (newgroups == NULL)
|
||||
goto done;
|
||||
*groupsp = groups = newgroups;
|
||||
*size *= 2;
|
||||
*size = newsize;
|
||||
}
|
||||
|
||||
groups[*start] = g->gr_gid;
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <unistd.h>
|
||||
#include <rpcsvc/yp.h>
|
||||
#include <rpcsvc/ypclnt.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
#include "nss-nis.h"
|
||||
|
||||
@ -138,7 +139,8 @@ internal_getgrent_r (struct group *grp, char *buffer, size_t buflen,
|
||||
|
||||
enum nss_status
|
||||
_nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
long int *size, gid_t **groupsp, int *errnop)
|
||||
long int *size, gid_t **groupsp, long int limit,
|
||||
int *errnop)
|
||||
{
|
||||
struct group grpbuf, *g;
|
||||
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
|
||||
@ -181,11 +183,22 @@ _nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
{
|
||||
/* Need a bigger buffer. */
|
||||
gid_t *newgroups;
|
||||
newgroups = realloc (groups, 2 * *size * sizeof (*groups));
|
||||
long int newsize;
|
||||
|
||||
if (limit > 0 && *size == limit)
|
||||
/* We reached the maximum. */
|
||||
goto done;
|
||||
|
||||
if (limit <= 0)
|
||||
newsize = 2 * *size;
|
||||
else
|
||||
newsize = MIN (limit, 2 * *size);
|
||||
|
||||
newgroups = realloc (groups, newsize * sizeof (*groups));
|
||||
if (newgroups == NULL)
|
||||
goto done;
|
||||
*groupsp = groups = newgroups;
|
||||
*size *= 2;
|
||||
*size = newsize;
|
||||
}
|
||||
|
||||
groups[*start] = g->gr_gid;
|
||||
|
@ -21,11 +21,13 @@
|
||||
|
||||
#include <features.h>
|
||||
|
||||
/* Definitions for byte order, according to significance of bytes, from low
|
||||
addresses to high addresses. The value is what you get by putting '4'
|
||||
in the most significant byte, '3' in the second most significant byte,
|
||||
'2' in the second least significant byte, and '1' in the least
|
||||
significant byte. */
|
||||
/* Definitions for byte order, according to significance of bytes,
|
||||
from low addresses to high addresses. The value is what you get by
|
||||
putting '4' in the most significant byte, '3' in the second most
|
||||
significant byte, '2' in the second least significant byte, and '1'
|
||||
in the least significant byte, and then writing down one digit for
|
||||
each byte, starting with the byte at the lowest address at the left,
|
||||
and proceeding to the byte with the highest address at the right. */
|
||||
|
||||
#define __LITTLE_ENDIAN 1234
|
||||
#define __BIG_ENDIAN 4321
|
||||
|
Loading…
Reference in New Issue
Block a user