名 前
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
*pwd,
char *buf, size_t buflen, struct
passwd **result);
int
getpwuid_r(uid_t uid, struct passwd
*pwd,
char *buf, size_t buflen, struct
passwd **result);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
getpwnam_r(), getpwuid_r():
_POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE || _POSIX_SOURCE
説 明
getpwnam() 関 数 は 、 ユ ー ザ ー 名 name に マ ッ チ す る パ ス ワ ー ド デ ー タ ベ ー ス の エ ン ト リ ー を 要 素 毎 に 分 解 し 、 各 要 素 を 格 納 し た 構 造 体 へ の ポ イ ン タ ー を 返 す (パ ス ワ ー ド デ ー タ ベ ー ス の 例 : ロ ー カ ル の パ ス ワ ー ド フ ァ イ ル /etc/passwd, NIS, LDAP)。
getpwuid() 関 数 は 、 ユ ー ザ ー ID uid に マ ッ チ す る パ ス ワ ー ド デ ー タ ベ ー ス の エ ン ト リ ー を 要 素 毎 に 分 解 し 、 各 要 素 を 格 納 し た 構 造 体 へ の ポ イ ン タ ー を 返 す 。
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; /* シ ェ ル プ
ロ グ ラ ム */ }; こ れ
ら の フ ィ ー ル
ド の 詳 し い 情
報 に つ い て は
passwd(5) を 参 照 の
こ と 。
getpwnam_r() と getpwuid_r() 関 数 は 、 そ れ ぞ れ getpwnam() と getpwuid() と 同 じ 情 報 を 取 得 す る が 、 取 得 し た passwd 構 造 体 を pwd が 指 す 領 域 に 格 納 す る 。 passwd 構 造 体 の メ ン バ ー が 指 す 文 字 列 は 、 サ イ ズ buflen の バ ッ フ ァ ー buf に 格 納 さ れ る 。 成 功 し た 場 合 *result に は 結 果 へ の ポ イ ン タ ー が 格 納 さ れ る 。 エ ン ト リ ー が 見 つ か ら な か っ た 場 合 や エ ラ ー が 発 生 し た 場 合 に は *result に は NULL が 入 る 。 呼 び 出 し
sysconf(_SC_GETPW_R_SIZE_MAX) は 、 errno を 変 更 せ ず に −1 を 返 す か 、 buf の 初 期 サ イ ズ の 推 奨 値 を 返 す 。 (こ の サ イ ズ が 小 さ す ぎ る 場 合 、 呼 び 出 し は ERANGE で 失 敗 し 、 こ の 場 合 に は 呼 び 出 し 側 は バ ッ フ ァ ー を 大 き く し て か ら 再 度 呼 び 出 す こ と が で き る 。 )
返 り 値
getpwnam() と getpwuid() 関 数 は 、 passwd 構 造 体 へ の ポ イ ン タ ー を 返 す 。 一 致 す る エ ン ト リ ー が 見 つ か ら な か っ た 場 合 や 、 エ ラ ー が 発 生 し た 場 合 は NULL を 返 す 。 エ ラ ー が 起 こ っ た 場 合 、 errno が 適 切 に 設 定 さ れ る 。 呼 び 出 し の 後 で errno を チ ェ ッ ク し た い 場 合 は 、 呼 び 出 し の 前 に (こ の 値 を ) 0 に 設 定 し て お く べ き で あ る 。 返 り 値 は 静 的 な 領 域 を 指 し て お り 、 そ の 後 の getpwent(3), getpwnam(), getpwuid() の 呼 び 出 し で 上 書 き さ れ る か も し れ な い 。 (返 さ れ た ポ イ ン タ ー を free(3) に 渡 さ な い こ と 。 ) 成 功 す る と 、 getpwnam_r() と getpwuid_r() は 0 を 返 し 、 *result に pwd を 設 定 す る 。 マ ッ チ す る パ ス ワ ー ド エ ン ト リ ー が 見 つ か ら な か っ た 場 合 に は 、 0 を 返 し 、 *result に NULL を 設 定 す る 。 エ ラ ー の 場 合 、 エ ラ ー 番 号 を 返 し 、 *result に NULL を 設 定 す る 。
エ ラ ー
0 ま た は ENOENT ま た は ESRCH ま た は EBADF ま た は EPERM ま た は ... 指 定 さ れ た name ま た は uid が 見 つ か ら な か っ た 。
EINTR シ グ ナ ル が 捕 捉 さ れ た 。 |
||
EIO |
I/O エ ラ ー 。
EMFILE 呼 び 出 し 元 プ ロ セ ス が オ ー プ ン し て い る フ ァ イ ル 数 が す で に 上 限 |
(OPEN_MAX) で あ っ た 。
ENFILE シ ス テ ム で オ ー プ ン さ れ て い る フ ァ イ ル 数 が す で に 上 限 で あ っ た 。 | |
ENOMEM |
passwd 構 造 体 に 割 り 当 て る メ モ リ ー が 十 分 な か っ た 。
ERANGE 与 え ら れ た バ ッ フ ァ ー 空 間 が 不 十 分 で あ る 。 |
フ ァ イ ル
/etc/passwd ロ ー カ ル の パ ス ワ ー ド デ ー タ ベ ー ス フ ァ イ ル
属 性
マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 getpwnam() と getpwuid() は ス レ ッ ド セ ー フ で は な い 。 関 数 getpwnam_r() と getpwuid_r() は ス レ ッ ド セ ー フ で あ る 。
準 拠
SVr4, 4.3BSD, POSIX.1−2001. pw_gecos フ ィ ー ル ド は POSIX で は 規 定 さ れ て い な い が 、 ほ と ん ど の 実 装 に 存 在 す る 。
注 意
上 記 の 「 返 り 値 」 以 下 の 記 述 は 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 か 同 様 の 方 法 を 使 う 必 要 が あ る 。
例
以 下 の プ ロ グ ラ ム は getpwnam_r() の 使 用 例 を 示 し た も の で 、 コ マ ン ド ラ イ ン 引 き 数 で 渡 さ れ た ユ ー ザ ー 名 に 対 す る 完 全 な ユ ー ザ ー 名 と ユ ー ザ ー ID を 探 す も の で あ る 。
#include
<pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int
main(int argc, char *argv[])
{
struct passwd pwd;
struct passwd *result;
char *buf;
size_t bufsize;
int s;
if (argc != 2)
{
fprintf(stderr, "Usage: %s username\n", argv[0]);
exit(EXIT_FAILURE); }
bufsize =
sysconf(_SC_GETPW_R_SIZE_MAX);
if (bufsize == −1) /* 値 を 決
定 で き な か っ
た */
bufsize = 16384; /* 十 分 大 き
な 値 に す べ き */
buf =
malloc(bufsize);
if (buf == NULL) {
perror("malloc");
exit(EXIT_FAILURE); }
s =
getpwnam_r(argv[1], &pwd, buf, bufsize, &result);
if (result == NULL) {
if (s == 0)
printf("Not found\n");
else {
errno = s;
perror("getpwnam_r"); }
exit(EXIT_FAILURE); }
printf("Name:
%s; UID: %ld\n", pwd.pw_gecos, (long) pwd.pw_uid);
exit(EXIT_SUCCESS); }
関 連 項 目
endpwent(3), fgetpwent(3), getgrnam(3), getpw(3), getpwent(3), getspnam(3), putpwent(3), setpwent(3), passwd(5)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。