getpwent_rのヘルプ・マニュアル
日本語 英語
getpwent_r --help
man getpwent_r
GETPWENT_R(3) Linux Programmer’s Manual GETPWENT_R(3)
名前
getpwent_r, fgetpwent_r - パスワードファイルのエントリをリエントラント
で取り出す
書式
#include
int getpwent_r(struct passwd *pwbuf, char *buf,
size_t buflen, struct passwd **pwbufp);
int fgetpwent_r(FILE *fp, struct passwd *pwbuf, char *buf,
size_t buflen, struct passwd **pwbufp);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
getpwent_r(), _BSD_SOURCE || _SVID_SOURCE
fgetpwent_r(): _SVID_SOURCE
説明
関数 getpwent_r() と fgetpwent_r() は getpwent(3) と fgetpwent(3) の リ
エ ントラント (reentrant) 版である。前者は、 setpwent(3) によって初期化
されたストリームから、次のパスワードエントリを読み込む。後者は、スト リ
ーム fp から次のパスワードエントリを読み込む。
passwd 構造体は において以下のように定義されている。
struct passwd {
char *pw_name; /* ユーザ名 */
char *pw_passwd; /* ユーザのパスワード */
uid_t pw_uid; /* ユーザ ID */
gid_t pw_gid; /* グループ ID */
char *pw_gecos; /* 実際の名前 */
char *pw_dir; /* ホームディレクトリ */
char *pw_shell; /* シェルプログラム */
};
リ エントラントでない関数は静的な格納領域へのポインタを返す。この静的な
格納領域には、更にユーザ名・パスワード・gecos フィールド・ホームディ レ
ク トリ・シェルへのポインタが含まれる。ここで説明されているリエントラン
ト版の関数は、呼び出し側から提供されるバッファにユーザ名など全てを返 す
。 最初の引き数として struct passwd を保持できるバッファ pwbuf がある。
次にその他の文字列を保持できるサイズ buflen のバッファ buf がある。これ
ら の関数の結果 (ストリームから読み込まれた struct passwd) は、提供され
たバッファ *pwbuf に格納され、この struct passwd へのポインタは *pwbufp
に返される。
返り値
成功した場合、これらの関数は 0 を返し、 *pwbufp は struct passwd へのポ
インタとなる。エラーの場合、これらの関数はエラー値を返し、 *pwbufp は
NULL になる。
エラー
ENOENT 次のエントリがない。
ERANGE 十分なバッファ空間が与えられていない。もっと大きなバッファで再度
実行すること。
準拠
これらの関数は GNU 拡張であり、POSIX 版の関数 getpwnam_r(3) の形式に 似
せてある。他のシステムでは以下のプロトタイプが使われている。
struct passwd *
getpwent_r(struct passwd *pwd, char *buf, int buflen);
より良いものでは、以下のようになっている。
int
getpwent_r(struct passwd *pwd, char *buf, int buflen,
FILE **pw_fp);
注意
関 数 getpwent_r() は本当のリエントラントではない。なぜなら、ストリーム
の読み込み位置を他の全てのスレッドと共有しているためである。
例
#define _GNU_SOURCE
#include
#include
#define BUFLEN 4096
int
main(void)
{
struct passwd pw, *pwp;
char buf[BUFLEN];
int i;
setpwent();
while (1) {
i = getpwent_r(&pw, buf, BUFLEN, &pwp);
if (i)
break;
printf("%s (%d)\tHOME %s\tSHELL %s\n", pwp->pw_name,
pwp->pw_uid, pwp->pw_dir, pwp->pw_shell);
}
endpwent();
exit(EXIT_SUCCESS);
}
関連項目
fgetpwent(3), getpw(3), getpwent(3), getpwnam(3), getpwuid(3), putp-
went(3), passwd(5)
GNU 2007-07-26 GETPWENT_R(3)
GETPWENT_R(3) Linux Programmer’s Manual GETPWENT_R(3)
NAME
getpwent_r, fgetpwent_r - get passwd file entry reentrantly
SYNOPSIS
#include
int getpwent_r(struct passwd *pwbuf, char *buf,
size_t buflen, struct passwd **pwbufp);
int fgetpwent_r(FILE *fp, struct passwd *pwbuf, char *buf,
size_t buflen, struct passwd **pwbufp);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
getpwent_r(), _BSD_SOURCE || _SVID_SOURCE
fgetpwent_r(): _SVID_SOURCE
DESCRIPTION
The functions getpwent_r() and fgetpwent_r() are the reentrant versions
of getpwent(3) and fgetpwent(3). The former reads the next passwd
entry from the stream initialized by setpwent(3). The latter reads the
next passwd entry from the stream fp.
The passwd structure is defined in as follows:
struct passwd {
char *pw_name; /* username */
char *pw_passwd; /* user password */
uid_t pw_uid; /* user ID */
gid_t pw_gid; /* group ID */
char *pw_gecos; /* real name */
char *pw_dir; /* home directory */
char *pw_shell; /* shell program */
};
The non-reentrant functions return a pointer to static storage, where
this static storage contains further pointers to user name, password,
gecos field, home directory and shell. The reentrant functions
described here return all of that in caller-provided buffers. First of
all there is the buffer pwbuf that can hold a struct passwd. And next
the buffer buf of size buflen that can hold additional strings. The
result of these functions, the struct passwd read from the stream, is
stored in the provided buffer *pwbuf, and a pointer to this struct
passwd is returned in *pwbufp.
RETURN VALUE
On success, these functions return 0 and *pwbufp is a pointer to the
struct passwd. On error, these functions return an error value and
*pwbufp 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 passwd *
getpwent_r(struct passwd *pwd, char *buf, int buflen);
or, better,
int
getpwent_r(struct passwd *pwd, char *buf, int buflen,
FILE **pw_fp);
NOTES
The function getpwent_r() is not really reentrant since it shares the
reading position in the stream with all other threads.
EXAMPLE
#define _GNU_SOURCE
#include
#include
#define BUFLEN 4096
int
main(void)
{
struct passwd pw, *pwp;
char buf[BUFLEN];
int i;
setpwent();
while (1) {
i = getpwent_r(&pw, buf, BUFLEN, &pwp);
if (i)
break;
printf("%s (%d)\tHOME %s\tSHELL %s\n", pwp->pw_name,
pwp->pw_uid, pwp->pw_dir, pwp->pw_shell);
}
endpwent();
exit(EXIT_SUCCESS);
}
SEE ALSO
fgetpwent(3), getpw(3), getpwent(3), getpwnam(3), getpwuid(3), putp-
went(3), 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 2007-07-26 GETPWENT_R(3)