mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
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:
@ -1,5 +1,14 @@
|
|||||||
2000-07-23 Ulrich Drepper <drepper@redhat.com>
|
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
|
* grp/initgroups.c (initgroups): Don't limit the possible number
|
||||||
of groups to NGROUPS_MAX. Allow dynamic resizing. Loop around
|
of groups to NGROUPS_MAX. Allow dynamic resizing. Loop around
|
||||||
the setgroups call while the call fails and descrease the number
|
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
|
in doing a port, please contact the glibc maintainers by sending
|
||||||
electronic mail to <bug-glibc@gnu.org>.
|
electronic mail to <bug-glibc@gnu.org>.
|
||||||
|
|
||||||
The GNU C library now includes Michael Glad's Ultra Fast Crypt, which
|
There are some add-ons which can be used together with GNU libc. They
|
||||||
provides the Unix `crypt' function, plus some other entry points.
|
are designed in a way to ease the installation by integrating them in
|
||||||
Because of the United States export restriction on DES
|
the libc source tree. Simply get the add-ons you need and use the
|
||||||
implementations, we are distributing this code separately from the
|
--enable-add-ons option of the `configure' script to tell where the
|
||||||
rest of the C library. There is an extra distribution tar file just
|
add-ons are found. Please read the FAQ file for more details.
|
||||||
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.
|
|
||||||
|
|
||||||
See the file INSTALL to find out how to configure, build, install, and port
|
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
|
the GNU C library. You might also consider reading the WWW pages for the
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Hierarchial argument parsing, layered over getopt
|
/* 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.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
@ -615,9 +615,9 @@ parser_finalize (struct parser *parser,
|
|||||||
group++)
|
group++)
|
||||||
if (group->args_processed == 0)
|
if (group->args_processed == 0)
|
||||||
err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0);
|
err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0);
|
||||||
for (group = parser->groups;
|
for (group = parser->egroup - 1;
|
||||||
group < parser->egroup && (!err || err==EBADKEY);
|
group >= parser->groups && (!err || err==EBADKEY);
|
||||||
group++)
|
group--)
|
||||||
err = group_parse (group, &parser->state, ARGP_KEY_END, 0);
|
err = group_parse (group, &parser->state, ARGP_KEY_END, 0);
|
||||||
|
|
||||||
if (err == EBADKEY)
|
if (err == EBADKEY)
|
||||||
|
@ -49,7 +49,7 @@ extern service_user *__nss_group_database;
|
|||||||
|
|
||||||
static enum nss_status
|
static enum nss_status
|
||||||
compat_call (service_user *nip, const char *user, gid_t group, long int *start,
|
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;
|
struct group grpbuf;
|
||||||
size_t buflen = __sysconf (_SC_GETGR_R_SIZE_MAX);
|
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. */
|
/* Need a bigger buffer. */
|
||||||
gid_t *newgroups;
|
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)
|
if (newgroups == NULL)
|
||||||
goto done;
|
goto done;
|
||||||
*groupsp = groups = newgroups;
|
*groupsp = groups = newgroups;
|
||||||
*size *= 2;
|
*size = newsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
groups[*start] = grpbuf.gr_gid;
|
groups[*start] = grpbuf.gr_gid;
|
||||||
@ -147,10 +158,12 @@ initgroups (user, group)
|
|||||||
/* Start is one, because we have the first group as parameter. */
|
/* Start is one, because we have the first group as parameter. */
|
||||||
long int start = 1;
|
long int start = 1;
|
||||||
long int size;
|
long int size;
|
||||||
|
long int limit;
|
||||||
gid_t *groups;
|
gid_t *groups;
|
||||||
int result;
|
int result;
|
||||||
#ifdef NGROUPS_MAX
|
#ifdef NGROUPS_MAX
|
||||||
size = NGROUPS_MAX;
|
size = NGROUPS_MAX;
|
||||||
|
limit = -1;
|
||||||
#else
|
#else
|
||||||
long int limit = __sysconf (_SC_NGROUPS_MAX);
|
long int limit = __sysconf (_SC_NGROUPS_MAX);
|
||||||
|
|
||||||
@ -184,14 +197,14 @@ initgroups (user, group)
|
|||||||
if (fct == NULL)
|
if (fct == NULL)
|
||||||
{
|
{
|
||||||
status = compat_call (nip, user, group, &start, &size, &groups,
|
status = compat_call (nip, user, group, &start, &size, &groups,
|
||||||
&errno);
|
limit, &errno);
|
||||||
|
|
||||||
if (nss_next_action (nip, NSS_STATUS_UNAVAIL) != NSS_ACTION_CONTINUE)
|
if (nss_next_action (nip, NSS_STATUS_UNAVAIL) != NSS_ACTION_CONTINUE)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
status = DL_CALL_FCT (fct, (user, group, &start, &size, &groups,
|
status = DL_CALL_FCT (fct, (user, group, &start, &size, &groups,
|
||||||
&errno));
|
limit, &errno));
|
||||||
|
|
||||||
/* This is really only for debugging. */
|
/* This is really only for debugging. */
|
||||||
if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
|
if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
#include "nss_hesiod.h"
|
#include "nss_hesiod.h"
|
||||||
|
|
||||||
@ -165,7 +166,8 @@ internal_gid_from_group (void *context, const char *groupname, gid_t *group)
|
|||||||
|
|
||||||
enum nss_status
|
enum nss_status
|
||||||
_nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
|
_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;
|
enum nss_status status = NSS_STATUS_SUCCESS;
|
||||||
char **list = NULL;
|
char **list = NULL;
|
||||||
@ -191,11 +193,22 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
|
|||||||
{
|
{
|
||||||
/* Need a bigger buffer. */
|
/* Need a bigger buffer. */
|
||||||
gid_t *newgroups;
|
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)
|
if (newgroups == NULL)
|
||||||
goto done;
|
goto done;
|
||||||
*groupsp = groups = newgroups;
|
*groupsp = groups = newgroups;
|
||||||
*size *= 2;
|
*size = newsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
groups[(*start)++] = group;
|
groups[(*start)++] = group;
|
||||||
@ -232,11 +245,22 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
|
|||||||
{
|
{
|
||||||
/* Need a bigger buffer. */
|
/* Need a bigger buffer. */
|
||||||
gid_t *newgroups;
|
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)
|
if (newgroups == NULL)
|
||||||
goto done;
|
goto done;
|
||||||
*groupsp = groups = newgroups;
|
*groupsp = groups = newgroups;
|
||||||
*size *= 2;
|
*size = newsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
groups[(*start)++] = group;
|
groups[(*start)++] = group;
|
||||||
|
@ -28,10 +28,10 @@ tmpdir=$tmp/ftwtest.d
|
|||||||
|
|
||||||
[ -f ${objpfx}elf/ld.so ] && ldso=${objpfx}elf/ld.so
|
[ -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
|
if test -d $tmpdir; then
|
||||||
chmod -R a+x $tmpdir
|
chmod -fR a+x $tmpdir
|
||||||
rm -fr $tmpdir
|
rm -fr $tmpdir
|
||||||
fi
|
fi
|
||||||
mkdir $tmpdir
|
mkdir $tmpdir
|
||||||
@ -112,7 +112,7 @@ EOF
|
|||||||
rm $testout
|
rm $testout
|
||||||
|
|
||||||
# For the next test everything must be readable.
|
# 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 |
|
LD_LIBRARY_PATH=$objpfx $ldso $testprogram --chdir $tmpdir |
|
||||||
sort > $testout
|
sort > $testout
|
||||||
|
@ -495,7 +495,9 @@ case ARGP_KEY_ARGS:
|
|||||||
@comment argp.h
|
@comment argp.h
|
||||||
@comment GNU
|
@comment GNU
|
||||||
@item ARGP_KEY_END
|
@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 argp.h
|
||||||
@comment GNU
|
@comment GNU
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include <rpcsvc/yp.h>
|
#include <rpcsvc/yp.h>
|
||||||
#include <rpcsvc/ypclnt.h>
|
#include <rpcsvc/ypclnt.h>
|
||||||
#include <rpcsvc/nis.h>
|
#include <rpcsvc/nis.h>
|
||||||
|
#include <sys/param.h>
|
||||||
#include <nsswitch.h>
|
#include <nsswitch.h>
|
||||||
|
|
||||||
#include "nss-nis.h"
|
#include "nss-nis.h"
|
||||||
@ -589,7 +590,8 @@ internal_getgrent_r (struct group *gr, ent_t *ent, char *buffer,
|
|||||||
|
|
||||||
enum nss_status
|
enum nss_status
|
||||||
_nss_compat_initgroups_dyn (const char *user, gid_t group, long int *start,
|
_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;
|
struct group grpbuf, *g;
|
||||||
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
|
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. */
|
/* Need a bigger buffer. */
|
||||||
gid_t *newgroups;
|
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)
|
if (newgroups == NULL)
|
||||||
goto done;
|
goto done;
|
||||||
*groupsp = groups = newgroups;
|
*groupsp = groups = newgroups;
|
||||||
*size *= 2;
|
*size = newsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
groups[*start] = g->gr_gid;
|
groups[*start] = g->gr_gid;
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <rpcsvc/yp.h>
|
#include <rpcsvc/yp.h>
|
||||||
#include <rpcsvc/ypclnt.h>
|
#include <rpcsvc/ypclnt.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
#include "nss-nis.h"
|
#include "nss-nis.h"
|
||||||
|
|
||||||
@ -138,7 +139,8 @@ internal_getgrent_r (struct group *grp, char *buffer, size_t buflen,
|
|||||||
|
|
||||||
enum nss_status
|
enum nss_status
|
||||||
_nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
|
_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;
|
struct group grpbuf, *g;
|
||||||
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
|
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. */
|
/* Need a bigger buffer. */
|
||||||
gid_t *newgroups;
|
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)
|
if (newgroups == NULL)
|
||||||
goto done;
|
goto done;
|
||||||
*groupsp = groups = newgroups;
|
*groupsp = groups = newgroups;
|
||||||
*size *= 2;
|
*size = newsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
groups[*start] = g->gr_gid;
|
groups[*start] = g->gr_gid;
|
||||||
|
@ -21,11 +21,13 @@
|
|||||||
|
|
||||||
#include <features.h>
|
#include <features.h>
|
||||||
|
|
||||||
/* Definitions for byte order, according to significance of bytes, from low
|
/* Definitions for byte order, according to significance of bytes,
|
||||||
addresses to high addresses. The value is what you get by putting '4'
|
from low addresses to high addresses. The value is what you get by
|
||||||
in the most significant byte, '3' in the second most significant byte,
|
putting '4' in the most significant byte, '3' in the second most
|
||||||
'2' in the second least significant byte, and '1' in the least
|
significant byte, '2' in the second least significant byte, and '1'
|
||||||
significant byte. */
|
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 __LITTLE_ENDIAN 1234
|
||||||
#define __BIG_ENDIAN 4321
|
#define __BIG_ENDIAN 4321
|
||||||
|
Reference in New Issue
Block a user