getpwnam - ライブラリコールの説明 - Linux コマンド集 一覧表
名前
getpwnam, getpwnam_r, getpwuid, getpwuid_r - パスワードファイルのエントリの取得
書式
#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);
説明
getpwnam ()関数は、ユーザ名 name にマッチするパスワード・データベースのエントリを 要素毎に分解し、各要素を格納した構造体へのポインタを返す (パスワード・データベースの例: ローカルのパスワードファイル /etc/passwd ,NIS, LDAP)。
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 を指定して実行することで分かる。
返り値
getpwnam () と getpwuid () 関数は、 passwd 構造体へのポインタを返す。 一致するエントリが見つからなかった場合や、エラーが発生した場合は NULL を返す。 エラーが起こった場合、 errno が適切に設定される。 呼び出しの後で errno をチェックしたい場合は、 呼び出しの前に (この値を) 0 に設定しておくべきである。
返り値は静的な領域を指しており、その後の getpwent (), getpwnam (), getpwuid ()の呼び出しで上書きされるかもしれない。
getpwnam_r () と getpwuid_r () 関数は、 成功した場合に 0 を返す。 エラーの場合は、エラー番号が返される。
エラー
- 0 または ENOENT または ESRCH または EBADF または EPERM または ...
- 指定された name または uid が見つからなかった。
- EINTR
- シグナルがキャッチされた。
- EIO
- I/O エラー。
- EMFILE
- 呼び出したプロセスにおいて、 既に最大数 (OPEN_MAX) のファイルがオープンされている。
- ENFILE
- システム上で既に最大数のファイルがオープンされている。
- ENOMEM
- passwd 構造体を割り当てるためのメモリが不十分。
- ERANGE
- 与えられたバッファ空間が不十分である。
ファイル
- /etc/passwd
- ローカルのパスワード・データベースファイル
準拠
SVr4, 4.3BSD, POSIX.1-2001
注意
上記の「返り値」以下の記述は POSIX.1-2001 に拠る。
この標準は「(エントリが) 見つからないこと」をエラーとしていないので、
そのような場合に
errno
がどのような値になるかを定めていない。
そのため、エラーを認識することは不可能である。
POSIX に準拠して、エントリが見つからない場合は
errno
を変更しないようにすべきである、と主張する人もいるかもしれない。
様々な Unix 系のシステムで試してみると、そのような場合には
0, ENOENT, EBADF, ESRCH, EWOULDBLOCK, EPERM といった様々な値が返される。
他の値が返されるかもしれない。
フィールド
pw_dir
には、ユーザの作業ディレクトリ名の初期値が格納される。
ログインプロセスは、このフィールドの値を使って、
ログインシェルの HOME 環境変数を初期化する。
アプリケーションが、ユーザのホーム・ディレクトリを決定する場合には、
(
getpwuid(getuid())->pw_dir
の値ではなく) HOME の値を検査するようにすべきである。
なぜなら、このようにすることで、ユーザがログイン・セッション中で
「ホーム・ディレクトリ」の意味を変更できるようになるからである。
別のユーザのホーム・ディレクトリ (の初期値) を知るには
getpwnam("username")->pw_dir
か同様の方法を使う必要がある。
関連項目
endpwent
(3),
fgetpwent
(3),
getgrnam
(3),
getpw
(3),
getpwent
(3),
putpwent
(3),
setpwent
(3),
passwd
(5)