other versions
| GETGROUPLIST(3) | Linux Programmer's Manual | GETGROUPLIST(3) |
名前¶
getgrouplist - ユーザが所属するグループのリストを取得する書式¶
#include <grp.h>glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
説明¶
getgrouplist() 関数は、グループデータベース ( group(5) 参照) を調べて、 user が所属するグループのリストを取得する。 見つかったグループのうち最大 *ngroups 個のグループが、配列 groups に格納されて返される。返り値¶
user が所属しているグループ数が *ngroups 以下の場合、 *ngroups の値が返される。バージョン¶
この関数は 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(5), passwd(5)この文書について¶
この man ページは Linux man-pages プロジェクトのリリース 3.41 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。| 2009-07-03 | GNU |