Manpages

名 前

getgroups, setgroups − 補 助 グ ル ー プ ID の リ ス ト を 取 得 /設 定 す る

書 式

#include <sys/types.h>
#include <unistd.h>

int getgroups(int size, gid_t list[]);

#include <grp.h>

int setgroups(size_t size, const gid_t *list);

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

setgroups(): _BSD_SOURCE

説 明

getgroups() は 呼 び 出 し 元 プ ロ セ ス の 補 助 グ ル ー プ (supplementary group) ID を list に 返 す 。 size 引 き 数 に は 、 list に よ り 参 照 さ れ る バ ッ フ ァ ー に 格 納 で き る 要 素 の 最 大 数 を 設 定 す べ き で あ る 。 呼 び 出 し 元 プ ロ セ ス が size 個 よ り 多 く の 補 助 グ ル ー プ の メ ン バ の 場 合 に は 、 エ ラ ー と な る 。 こ の 関 数 を 呼 び 出 し た プ ロ セ ス の 実 効 グ ル ー プ ID が 、 返 さ れ る リ ス ト に 含 ま れ る か ど う か は 規 定 さ れ て い な い (し た が っ て 、 ア プ リ ケ ー シ ョ ン は getegid(2) を 呼 び 出 し 、 そ の 結 果 の 値 を 追 加 ・ 削 除 す べ き で あ る )。

size が 0 な ら ば 、 list は 修 正 さ れ な い が 、 そ の プ ロ セ ス の 補 助 グ ル ー プ ID の 合 計 数 が 返 さ れ る 。 こ れ を 使 う こ と で 、 そ れ 以 降 の getgroups() の 呼 び 出 し で 必 要 と な る 動 的 割 り 当 て バ ッ フ ァ ー list の サ イ ズ を 、 呼 び 出 し 元 が 決 定 す る こ と が で き る 。

setgroups() は 、 呼 び 出 し 元 プ ロ セ ス の 補 助 グ ル ー プ ID を 設 定 す る 。 適 切 な 特 権 (Linux で は CAP_SETGID ケ ー パ ビ リ テ ィ (capability)) が 必 要 で あ る 。 size 引 き 数 に は 、 list に よ り 参 照 さ れ る バ ッ フ ァ ー に 格 納 さ れ た 補 助 グ ル ー プ ID の 数 を 指 定 す る 。

返 り 値

getgroups() は 、 成 功 す る と 補 助 グ ル ー プ ID の 数 を 返 す 。 エ ラ ー の 場 合 −1 を 返 し 、 errno を 適 切 に 設 定 す る 。

setgroups() は 、 成 功 す る と 0 を 返 す 。 エ ラ ー の 場 合 −1 を 返 し 、 errno を 適 切 に 設 定 す る 。

エ ラ ー

EFAULT

list が 不 正 な ア ド レ ス で あ る 。

getgroups() は 、 上 記 に 加 え て 以 下 の エ ラ ー で 失 敗 す る 可 能 性 が あ る 。

EINVAL

size が 補 助 グ ル ー プ ID の 数 よ り 小 さ い が 0 で な い 。

setgroups() は 、 上 記 に 加 え て 以 下 の エ ラ ー で 失 敗 す る 可 能 性 が あ る 。

EINVAL

sizeNGROUPS_MAX よ り 大 き い (NGROUPS_MAX は Linux 2.6.4 よ り 前 で は 32、 Linux 2.6.4 以 降 で は 65536)。

ENOMEM

メ モ リ ー 不 足 。

EPERM 呼 び 出 し 元 プ ロ セ ス が 十 分 な 特 権 を 持 っ て い な い 。

準 拠

SVr4, 4.3BSD. getgroups() 関 数 は POSIX.1−2001 に 準 拠 し て い る 。 setgroups() は 特 権 を 必 要 と す る た め 、 POSIX.1−2001 に 従 っ て い な い 。

注 意

プ ロ セ ス は 、 実 効 グ ル ー プ ID に 加 え 、 最 大 NGROUPS_MAX ま で の 補 助 グ ル ー プ ID を 持 つ こ と が で き る 。 定 数 NGROUPS_MAX<limits.h> で 定 義 さ れ て い る 。 補 助 グ ル ー プ ID の 集 合 は 親 プ ロ セ ス か ら 継 承 さ れ 、 execve(2) の 前 後 で 保 持 さ れ る 。 補 助 グ ル ー プ ID の 最 大 数 は 、 実 行 時 に sysconf(3) を 使 っ て 以 下 の よ う に し て 調 べ る こ と が で き る :

long ngroups_max;
ngroups_max = sysconf(_SC_NGROUPS_MAX);

getgroups() の 返 り 値 の 最 大 値 は 、 こ の 値 よ り 大 き く な る こ と は な い 。 Linux 2.6.4 以 降 で は 、 補 助 グ ル ー プ ID の 最 大 数 も Linux 固 有 の 読 み 込 み 専 用 の フ ァ イ ル /proc/sys/kernel/ngroups_max 経 由 で 公 開 さ れ て い る 。 元 々 の Linux の getgroups() シ ス テ ム コ ー ル は 16 ビ ッ ト の グ ル ー プ ID だ け に 対 応 し て い た 。 そ の 後 、 Linux 2.4 で 、 32 ビ ッ ト の ID に 対 応 し た getgroups() が 追 加 さ れ た 。 glibc の getgroups の ラ ッ パ ー 関 数 は カ ー ネ ル バ ー ジ ョ ン に よ る こ の 違 い を 吸 収 し て い る 。

関 連 項 目

getgid(2), setgid(2), getgrouplist(3), group_member(3), initgroups(3), capabilities(7), credentials(7)

こ の 文 書 に つ い て

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