#include <pwd.h> 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
 
passwd 構造体は <pwd.h> において以下のように定義されている。
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 に返される。
struct passwd * getpwent_r(struct passwd *pwd, char *buf, int buflen);
より良いものでは、以下のようになっている。
int
getpwent_r(struct passwd *pwd, char *buf, int buflen,
           FILE **pw_fp);
 
#define _GNU_SOURCE
#include <pwd.h>
#include <stdio.h>
#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);
}