getgrouplistのヘルプ・マニュアル
日本語 英語
getgrouplist --help
man getgrouplist
GETGROUPLIST(3) Linux Programmer’s Manual GETGROUPLIST(3)
名前
getgrouplist - ユーザが所属するグループのリストを取得する
書式
#include
int getgrouplist(const char *user, gid_t group,
gid_t *groups, int *ngroups);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
getgrouplist(): _BSD_SOURCE
説明
getgrouplist() 関数は、グループデータベース (group(5) 参照) を調べて、
user が所属するグループのリストを取得する。見つかったグループのうち最大
*ngroups 個のグループが、配列 groups に格納されて返される。
引き数 group がグループデータベースに user が所属するグループがなかった
場合、 getgrouplist() が返すグループのリストに引き数 group も追加される
。 通常は、この引き数にはユーザ user のパスワードレコードに書かれている
グループ ID を指定する。
引き数 ngroups は、値渡しと結果の両方に使用される引き 数 (value-result
argument) であり、リターン時には、常に group も含めた user が所属するグ
ループ数が格納される。この値は groups に格納されたグループ数より大き く
なる可能性がある。
返り値
user が所属しているグループ数が *ngroups 以下の場合、 *ngroups の値が返
される。
指定されたユーザが *ngroups より多くのグループに所属している場合、 get-
grouplist() は -1 を返す。この場合、 *ngroups で返される値を使って、バ
ッファのサイズを変更してから、 getgrouplist() をもう一度呼び出すこと が
できる。
バージョン
この関数は glibc 2.2.4 から存在する。
準拠
この関数は非標準である。ほとんどの BSD に存在する。
バグ
バ ージョン 2.3.3 より前の glibc では、この関数の実装にはバッファオーバ
ーフローのバグがあり、 user が所属するグループ数が *ngroups より多い 場
合 であっても、 user が所属するグループの全リストを配列 groups に格納し
てしまう。
例
以下のプログラムは、一つ目のコマンドライン引き数で指定された名前のユ ー
ザ が所属するグループのリストを表示する。二番目のコマンドライン引き数に
は、 getgrouplist() に渡す ngroups の値を指定する。以下のシェルのセッシ
ョンはこのプログラムの使用例を示したものである。
$ ./a.out cecilia 0
getgrouplist() returned -1; ngroups = 3
$ ./a.out cecilia 3
ngroups = 3
16 (dialout)
33 (video)
100 (users)
プログラムのソース
#include
#include
#include
#include
int
main(int argc, char *argv[])
{
int j, ngroups;
gid_t *groups;
struct passwd *pw;
struct group *gr;
if (argc != 3) {
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(EXIT_FAILURE);
}
ngroups = atoi(argv[2]);
groups = malloc(ngroups * sizeof (gid_t));
if (groups == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
/* Fetch passwd structure (contains first group ID for user) */
pw = getpwnam(argv[1]);
if (pw == NULL) {
perror("getpwnam");
exit(EXIT_SUCCESS);
}
/* Retrieve group list */
if (getgrouplist(argv[1], pw->pw_gid, groups, &ngroups) == -1) {
fprintf(stderr, "getgrouplist() returned -1; ngroups = %d\n",
ngroups);
exit(EXIT_FAILURE);
}
/* Display list of retrieved groups, along with group names */
fprintf(stderr, "ngroups = %d\n", ngroups);
for (j = 0; j < ngroups; j++) {
printf("%d", groups[j]);
gr = getgrgid(groups[j]);
if (gr != NULL)
printf(" (%s)", gr->gr_name);
printf("\n");
}
exit(EXIT_SUCCESS);
}
関連項目
getgroups(2), setgroups(2), getgrent(3), group(5), passwd(5)
GNU 2009-07-03 GETGROUPLIST(3)
GETGROUPLIST(3) Linux Programmer’s Manual GETGROUPLIST(3)
NAME
getgrouplist - get list of groups to which a user belongs
SYNOPSIS
#include
int getgrouplist(const char *user, gid_t group,
gid_t *groups, int *ngroups);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
getgrouplist(): _BSD_SOURCE
DESCRIPTION
The getgrouplist() function scans the group database (see group(5)) to
obtain the list of groups that user belongs to. Up to *ngroups of
these groups are returned in the array groups.
If it was not among the groups defined for user in the group database,
then group is included in the list of groups returned by getgrou-
plist(); typically this argument is specified as the group ID from the
password record for user.
The ngroups argument is a value-result argument: on return it always
contains the number of groups found for user, including group; this
value may be greater than the number of groups stored in groups.
RETURN VALUE
If the number of groups of which user is a member is less than or equal
to *ngroups, then the value *ngroups is returned.
If the user is a member of more than *ngroups groups, then getgrou-
plist() returns -1. In this case the value returned in *ngroups can be
used to resize the buffer passed to a further call getgrouplist().
VERSIONS
This function is present since glibc 2.2.4.
CONFORMING TO
This function is non-standard; it appears on most BSDs.
BUGS
In glibc versions before 2.3.3, the implementation of this function
contains a buffer-overrun bug: it returns the complete list of groups
for user in the array groups, even when the number of groups exceeds
*ngroups.
EXAMPLE
The program below displays the group list for the user named in its
first command-line argument. The second command-line argument speci-
fies the ngroups value to be supplied to getgrouplist(). The following
shell session shows examples of the use of this program:
$ ./a.out cecilia 0
getgrouplist() returned -1; ngroups = 3
$ ./a.out cecilia 3
ngroups = 3
16 (dialout)
33 (video)
100 (users)
Program source
#include
#include
#include
#include
int
main(int argc, char *argv[])
{
int j, ngroups;
gid_t *groups;
struct passwd *pw;
struct group *gr;
if (argc != 3) {
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(EXIT_FAILURE);
}
ngroups = atoi(argv[2]);
groups = malloc(ngroups * sizeof (gid_t));
if (groups == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
/* Fetch passwd structure (contains first group ID for user) */
pw = getpwnam(argv[1]);
if (pw == NULL) {
perror("getpwnam");
exit(EXIT_SUCCESS);
}
/* Retrieve group list */
if (getgrouplist(argv[1], pw->pw_gid, groups, &ngroups) == -1) {
fprintf(stderr, "getgrouplist() returned -1; ngroups = %d\n",
ngroups);
exit(EXIT_FAILURE);
}
/* Display list of retrieved groups, along with group names */
fprintf(stderr, "ngroups = %d\n", ngroups);
for (j = 0; j < ngroups; j++) {
printf("%d", groups[j]);
gr = getgrgid(groups[j]);
if (gr != NULL)
printf(" (%s)", gr->gr_name);
printf("\n");
}
exit(EXIT_SUCCESS);
}
SEE ALSO
getgroups(2), setgroups(2), getgrent(3), group(5), passwd(5)
COLOPHON
This page is part of release 3.22 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
GNU 2008-07-03 GETGROUPLIST(3)