mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 08:11:08 +00:00
Update.
* manual/users.texi (Setting Groups): Correct initgroups documentation. Add documentation for getgrouplist. 2001-06-28 H.J. Lu <hjl@gnu.org> * locale/findlocale.c (locale_file_list): Renamed to ... (_nl_locale_file_list): This. Make it extern. (free_mem): Move to ... * locale/setlocale.c (free_mem): Here. 2001-06-28 Mark Kettenis <kettenis@gnu.org> 2001-06-20 Isamu Hasegawa <isamu@yamato.ibm.com> 2001-06-26 Isamu Hasegawa <isamu@yamato.ibm.com> * posix/regex.c (count_mbs_length): Use binary search for optimization.
This commit is contained in:
parent
5746ef6f2a
commit
90e5b29e14
19
ChangeLog
19
ChangeLog
@ -1,3 +1,15 @@
|
|||||||
|
2001-06-28 Mark Kettenis <kettenis@gnu.org>
|
||||||
|
|
||||||
|
* manual/users.texi (Setting Groups): Correct initgroups
|
||||||
|
documentation. Add documentation for getgrouplist.
|
||||||
|
|
||||||
|
2001-06-28 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
|
* locale/findlocale.c (locale_file_list): Renamed to ...
|
||||||
|
(_nl_locale_file_list): This. Make it extern.
|
||||||
|
(free_mem): Move to ...
|
||||||
|
* locale/setlocale.c (free_mem): Here.
|
||||||
|
|
||||||
2001-06-28 Mark Kettenis <kettenis@gnu.org>
|
2001-06-28 Mark Kettenis <kettenis@gnu.org>
|
||||||
|
|
||||||
* sysdeps/mach/hurd/read.c: Include <hurd/fd.h>.
|
* sysdeps/mach/hurd/read.c: Include <hurd/fd.h>.
|
||||||
@ -18,17 +30,16 @@
|
|||||||
|
|
||||||
* posix/Makefile: Add rules to build and run tst-regex.
|
* posix/Makefile: Add rules to build and run tst-regex.
|
||||||
|
|
||||||
2001-06-20 Isamu Hasegawa <isamu@yamato.ibm.com>
|
2001-06-20 Isamu Hasegawa <isamu@yamato.ibm.com>
|
||||||
|
|
||||||
* posix/regex.c (FREE_WCS_BUFFERS): New macro to free buffers.
|
* posix/regex.c (FREE_WCS_BUFFERS): New macro to free buffers.
|
||||||
(re_search_2): invoke convert_mbs_to_wcs and FREE_WCS_BUFFERS.
|
(re_search_2): invoke convert_mbs_to_wcs and FREE_WCS_BUFFERS.
|
||||||
(wcs_re_match_2_internal): Check whether the wcs buffers need
|
(wcs_re_match_2_internal): Check whether the wcs buffers need
|
||||||
seting up or not, and skip seting up routin if not needed.
|
seting up or not, and skip seting up routin if not needed.
|
||||||
|
|
||||||
2001-06-26 Isamu Hasegawa <isamu@yamato.ibm.com>
|
2001-06-26 Isamu Hasegawa <isamu@yamato.ibm.com>
|
||||||
|
|
||||||
* posix/regex.c (count_mbs_length): Use binary search for
|
* posix/regex.c (count_mbs_length): Use binary search for optimization.
|
||||||
optimization.
|
|
||||||
|
|
||||||
2001-06-27 Ulrich Drepper <drepper@redhat.com>
|
2001-06-27 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
@ -430,6 +430,7 @@ setlocale (int category, const char *locale)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern struct loaded_l10nfile *_nl_locale_file_list[];
|
||||||
|
|
||||||
static void __attribute__ ((unused))
|
static void __attribute__ ((unused))
|
||||||
free_mem (void)
|
free_mem (void)
|
||||||
@ -440,17 +441,30 @@ free_mem (void)
|
|||||||
if (category != LC_ALL)
|
if (category != LC_ALL)
|
||||||
{
|
{
|
||||||
struct locale_data *here = *_nl_current[category];
|
struct locale_data *here = *_nl_current[category];
|
||||||
|
struct loaded_l10nfile *runp = _nl_locale_file_list[category];
|
||||||
|
|
||||||
/* If this category is already "C" don't do anything. */
|
/* If this category is already "C" don't do anything. */
|
||||||
if (here == _nl_C[category])
|
if (here != _nl_C[category])
|
||||||
continue;
|
{
|
||||||
|
/* We have to be prepared that sometime later me still
|
||||||
|
might need the locale information. */
|
||||||
|
setdata (category, _nl_C[category]);
|
||||||
|
setname (category, _nl_C_name);
|
||||||
|
|
||||||
/* We have to be prepared that sometime later me still might
|
_nl_unload_locale (here);
|
||||||
need the locale information. */
|
}
|
||||||
setdata (category, _nl_C[category]);
|
|
||||||
setname (category, _nl_C_name);
|
|
||||||
|
|
||||||
_nl_unload_locale (here);
|
while (runp != NULL)
|
||||||
|
{
|
||||||
|
struct loaded_l10nfile *curr = runp;
|
||||||
|
struct locale_data *data = (struct locale_data *) runp->data;
|
||||||
|
|
||||||
|
if (data != NULL && data != here && data != _nl_C[category])
|
||||||
|
_nl_unload_locale (data);
|
||||||
|
runp = runp->next;
|
||||||
|
free ((char *) curr->filename);
|
||||||
|
free (curr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setname (LC_ALL, _nl_C_name);
|
setname (LC_ALL, _nl_C_name);
|
||||||
|
@ -454,10 +454,10 @@ The calling process is not privileged.
|
|||||||
|
|
||||||
@comment grp.h
|
@comment grp.h
|
||||||
@comment BSD
|
@comment BSD
|
||||||
@deftypefun int initgroups (const char *@var{user}, gid_t @var{gid})
|
@deftypefun int initgroups (const char *@var{user}, gid_t @var{group})
|
||||||
The @code{initgroups} function sets the process's supplementary group
|
The @code{initgroups} function sets the process's supplementary group
|
||||||
IDs to be the normal default for the user name @var{user}. If @var{gid}
|
IDs to be the normal default for the user name @var{user}. The group
|
||||||
is not -1, it includes that group also.
|
@var{group} is automatically included.
|
||||||
|
|
||||||
This function works by scanning the group database for all the groups
|
This function works by scanning the group database for all the groups
|
||||||
@var{user} belongs to. It then calls @code{setgroups} with the list it
|
@var{user} belongs to. It then calls @code{setgroups} with the list it
|
||||||
@ -467,6 +467,52 @@ The return values and error conditions are the same as for
|
|||||||
@code{setgroups}.
|
@code{setgroups}.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
|
If you are interested in the groups a particular user belongs to, but do
|
||||||
|
not want to change the process's supplementary group IDs, you can use
|
||||||
|
@code{getgrouplist}. To use @code{getgrouplist}, your programs should
|
||||||
|
include the header file @file{grp.h}.
|
||||||
|
@pindex grp.h
|
||||||
|
|
||||||
|
@comment grp.h
|
||||||
|
@comment BSD
|
||||||
|
@deftypefun int getgrouplist (const char *@var{user}, gid_t @var{group}, gid_t *@var{groups}, int *@var{ngroups})
|
||||||
|
The @code{getgrouplist} function scans the group database for all the
|
||||||
|
groups @var{user} belongs to. Up to *@var{ngroups} group IDs
|
||||||
|
corresponding to these groups are stored in the array @var{groups}; the
|
||||||
|
return value from the function is the number of group IDs actually
|
||||||
|
stored. If *@var{ngroups} is smaller than the total number of groups
|
||||||
|
found, then @code{getgrouplist} returns a value of @code{-1} and stores
|
||||||
|
the actual number of groups in *@var{ngroups}. The group @var{group} is
|
||||||
|
automatically included in the list of groups returned by
|
||||||
|
@code{getgrouplist}.
|
||||||
|
|
||||||
|
Here's how to use @code{getgrouplist} to read all supplementary groups
|
||||||
|
for @var{user}:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
@group
|
||||||
|
gid_t *
|
||||||
|
supplementary_groups (char *user)
|
||||||
|
@{
|
||||||
|
int ngroups = 16;
|
||||||
|
gid_t *groups
|
||||||
|
= (gid_t *) xmalloc (ngroups * sizeof (gid_t));
|
||||||
|
struct passwd *pw = getpwnam (user);
|
||||||
|
|
||||||
|
if (pw == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups) < 0)
|
||||||
|
@{
|
||||||
|
groups = xrealloc (ngroups * sizeof (gid_t));
|
||||||
|
getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups);
|
||||||
|
@}
|
||||||
|
return groups;
|
||||||
|
@}
|
||||||
|
@end group
|
||||||
|
@end smallexample
|
||||||
|
@end deftypefun
|
||||||
|
|
||||||
@node Enable/Disable Setuid
|
@node Enable/Disable Setuid
|
||||||
@section Enabling and Disabling Setuid Access
|
@section Enabling and Disabling Setuid Access
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user