getpwnam

Autres langues

Langue: ja

Version: 1996-05-27 (mandriva - 01/05/08)

Section: 3 (Bibliothèques de fonctions)

名前

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(3), 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)