#include <sys/types.h> #include <pwd.h> struct passwd *getpwnam(const char *name); struct passwd *getpwuid(uid_t uid); int getpwnam_r(const char *name, struct passwd *pwbuf,
char *buf, size_t buflen, struct passwd **pwbufp); int getpwuid_r(uid_t uid, struct passwd *pwbuf,
char *buf, size_t buflen, struct passwd **pwbufp);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
getpwnam_r(), getpwuid_r(): _POSIX_C_SOURCE || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE
getpwuid() 関数は、ユーザ ID uid にマッチするパスワード・データベースのエントリを 要素毎に分解し、各要素を格納した構造体へのポインタを返す。
getpwnam_r() と getpwuid_r() 関数は (上記の関数と) 同じ情報を取得するが、 取得した passwd 構造体を pwbuf が指す領域に格納する。 この passwd 構造体には文字列へのポインタが含まれ、 これらの文字列はサイズ buflen のバッファ buf に格納される。 成功した場合 *pwbufp には結果へのポインタが格納される。 エントリが見つからなかった場合やエラーが発生した場合には *pwbufp には NULL が入る。
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; /* シェルプログラム */ };
buf に最大必要なサイズは、 sysconf(3) に引き数 _SC_GETPW_R_SIZE_MAX を指定して実行することで分かる。
返り値は静的な領域を指しており、その後の getpwent(3), getpwnam(), getpwuid() の呼び出しで上書きされるかもしれない。
getpwnam_r() と getpwuid_r() 関数は、 成功した場合に 0 を返す。 エラーの場合は、エラー番号が返される。
フィールド pw_dir には、ユーザの作業ディレクトリ名の初期値が格納される。 ログインプロセスは、このフィールドの値を使って、 ログインシェルの HOME 環境変数を初期化する。 アプリケーションが、ユーザのホーム・ディレクトリを決定する場合には、 (getpwuid(getuid())->pw_dir の値ではなく) HOME の値を検査するようにすべきである。 なぜなら、このようにすることで、ユーザがログイン・セッション中で 「ホーム・ディレクトリ」の意味を変更できるようになるからである。 別のユーザのホーム・ディレクトリ (の初期値) を知るには getpwnam(username)->pw_dir か同様の方法を使う必要がある。