Manpages

名 前

getgrouplist − ユ ー ザ ー が 所 属 す る グ ル ー プ の リ ス ト を 取 得 す る

書 式

#include <grp.h>

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 よ り 多 く の グ ル ー プ に 所 属 し て い る 場 合 、 getgrouplist() は −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 <stdio.h>
#include <stdlib.h>
#include <grp.h>
#include <pwd.h>

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 <user> <ngroups>\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_member(3), group(5), passwd(5)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。