getgrent_rのヘルプ・マニュアル
日本語 英語
getgrent_r --help
man getgrent_r
GETGRENT_R(3) Linux Programmer’s Manual GETGRENT_R(3)
名前
getgrent_r, fgetgrent_r - グ ループファイルエントリをリエントラント
(reentrant) に取り出す
書式
#include
int getgrent_r(struct group *gbuf, char *buf,
size_t buflen, struct group **gbufp);
int fgetgrent_r(FILE *fp, struct group *gbuf, char *buf,
size_t buflen, struct group **gbufp);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
getgrent_r(): _GNU_SOURCE
fgetgrent_r(): _SVID_SOURCE
説明
関数 getgrent_r() と fgetgrent_r() は getgrent(3) と fgetgrent(3) の リ
エントラント版である。前者は、 setgrent(3) によって初期化されたストリー
ムから、次のグループファイルのエントリを読み込む。後者は、ストリーム fp
から次のグループファイルのエントリを読み込む。
group 構造体は において以下のように定義されている:
struct group {
char *gr_name; /* グループ名 */
char *gr_passwd; /* グループパスワード */
gid_t gr_gid; /* グループ ID */
char **gr_mem; /* グループメンバ */
};
リ エントラントでない関数は静的な格納領域へのポインタを返す。この静的な
格納領域には、更にグループ名・パスワード・メンバへのポインタが含まれ る
。 ここで説明されているリエントラントな関数は、呼び出し側から提供される
バッファにグループ名など全てを返す。最初の引き数として struct group を
保 持 で きるバッファ gbuf がある。次にその他の文字列を保持できるサイズ
buflen のバッファ buf がある。これらの関数の結果 (ストリームから読み 込
ま れ た struct group) は、提供されたバッファ *gbuf に格納され、この
struct group へのポインタは *gbufp に返される。
返り値
成功した場合、これらの関数は 0 を返し、 *gbufp は struct group へのポイ
ンタとなる。エラーの場合、これらの関数はエラー値を返し、 *gbufp は NULL
になる。
エラー
ENOENT 次のエントリがない。
ERANGE 十分なバッファ空間が与えられていない。もっと大きなバッファで再度
実行すること。
準拠
こ れらの関数は GNU 拡張であり、POSIX 版の関数 getpwnam_r(3) の形式に似
せてある。他のシステムでは以下のプロトタイプが使われている。
struct group *getgrent_r(struct group *grp, char *buf,
int buflen);
より良いものでは、以下のようになっている。
int getgrent_r(struct group *grp, char *buf, int buflen,
FILE **gr_fp);
注意
関数 getgrent_r() は本当のリエントラントではない。なぜなら、ストリー ム
の読み込み位置を他の全てのスレッドと共有しているためである。
例
#define _GNU_SOURCE
#include
#include
#include
#define BUFLEN 4096
int
main(void)
{
struct group grp, *grpp;
char buf[BUFLEN];
int i;
setgrent();
while (1) {
i = getgrent_r(&grp, buf, BUFLEN, &grpp);
if (i)
break;
printf("%s (%d):", grpp->gr_name, grpp->gr_gid);
for (i = 0; ; i++) {
if (grpp->gr_mem[i] == NULL)
break;
printf(" %s", grpp->gr_mem[i]);
}
printf("\n");
}
endgrent();
exit(EXIT_SUCCESS);
}
関連項目
fgetgrent(3), getgrent(3), getgrgid(3), getgrnam(3), putgrent(3),
group(5)
GNU 2007-07-26 GETGRENT_R(3)
GETGRENT_R(3) Linux Programmer’s Manual GETGRENT_R(3)
NAME
getgrent_r, fgetgrent_r - get group file entry reentrantly
SYNOPSIS
#include
int getgrent_r(struct group *gbuf, char *buf,
size_t buflen, struct group **gbufp);
int fgetgrent_r(FILE *fp, struct group *gbuf, char *buf,
size_t buflen, struct group **gbufp);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
getgrent_r(): _GNU_SOURCE
fgetgrent_r(): _SVID_SOURCE
DESCRIPTION
The functions getgrent_r() and fgetgrent_r() are the reentrant versions
of getgrent(3) and fgetgrent(3). The former reads the next group entry
from the stream initialized by setgrent(3). The latter reads the next
group entry from the stream fp.
The group structure is defined in as follows:
struct group {
char *gr_name; /* group name */
char *gr_passwd; /* group password */
gid_t gr_gid; /* group ID */
char **gr_mem; /* group members */
};
The non-reentrant functions return a pointer to static storage, where
this static storage contains further pointers to group name, password
and members. The reentrant functions described here return all of that
in caller-provided buffers. First of all there is the buffer gbuf that
can hold a struct group. And next the buffer buf of size buflen that
can hold additional strings. The result of these functions, the struct
group read from the stream, is stored in the provided buffer *gbuf, and
a pointer to this struct group is returned in *gbufp.
RETURN VALUE
On success, these functions return 0 and *gbufp is a pointer to the
struct group. On error, these functions return an error value and
*gbufp is NULL.
ERRORS
ENOENT No more entries.
ERANGE Insufficient buffer space supplied. Try again with larger
buffer.
CONFORMING TO
These functions are GNU extensions, done in a style resembling the
POSIX version of functions like getpwnam_r(3). Other systems use pro-
totype
struct group *getgrent_r(struct group *grp, char *buf,
int buflen);
or, better,
int getgrent_r(struct group *grp, char *buf, int buflen,
FILE **gr_fp);
NOTES
The function getgrent_r() is not really reentrant since it shares the
reading position in the stream with all other threads.
EXAMPLE
#define _GNU_SOURCE
#include
#include
#include
#define BUFLEN 4096
int
main(void)
{
struct group grp, *grpp;
char buf[BUFLEN];
int i;
setgrent();
while (1) {
i = getgrent_r(&grp, buf, BUFLEN, &grpp);
if (i)
break;
printf("%s (%d):", grpp->gr_name, grpp->gr_gid);
for (i = 0; ; i++) {
if (grpp->gr_mem[i] == NULL)
break;
printf(" %s", grpp->gr_mem[i]);
}
printf("\n");
}
endgrent();
exit(EXIT_SUCCESS);
}
SEE ALSO
fgetgrent(3), getgrent(3), getgrgid(3), getgrnam(3), putgrent(3),
group(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 2007-07-26 GETGRENT_R(3)