Manpages

名 前

getutent, getutid, getutline, pututline, setutent, endutent, utmpname − utmp フ ァ イ ル の エ ン ト リ ー に ア ク セ ス す る

書 式

#include <utmp.h>

struct utmp *getutent(void);
struct utmp *getutid(const struct utmp *
ut);
struct utmp *getutline(const struct utmp *
ut);

struct utmp *pututline(const struct utmp *ut);

void setutent(void);
void endutent(void);

int utmpname(const char *file);

説 明

新 し い ア プ リ ケ ー シ ョ ン で は 、 こ れ ら の 関 数 の "utmpx" 版 を 使 用 す べ き で あ る 。 こ れ ら は POSIX.1 で 規 定 さ れ て い る 。 「 準 拠 」 の 節 を 参 照 。

utmpname() は 、 他 の utmp 関 数 が ア ク セ ス す る (utmp フ ォ ー マ ッ ト の ) フ ァ イ ル の 名 前 を 指 定 す る 。 他 の 関 数 を 使 う 前 に utmpname() を 使 っ て フ ァ イ ル 名 の 指 定 を 行 わ な か っ た 場 合 は 、 <path.h> で 定 義 さ れ て い る _PATH_UTMP が フ ァ イ ル 名 と み な さ れ る 。

setutent() は 、 フ ァ イ ル ポ イ ン タ ー を utmp フ ァ イ ル の 先 頭 に 移 動 す る 。 一 般 的 に は 、 他 の 関 数 を 使 う 前 に こ の 関 数 を 呼 び 出 し て お く と 良 い だ ろ う 。

endutent() は utmp フ ァ イ ル を ク ロ ー ズ す る 。 ユ ー ザ ー コ ー ド で 他 の 関 数 を 使 っ て こ の フ ァ イ ル に ア ク セ ス を 行 っ た 時 は 、 最 後 に こ の 関 数 を 呼 び 出 す べ き で あ る 。

getutent() は utmp フ ァ イ ル の 現 在 の フ ァ イ ル 位 置 か ら 一 行 読 み 込 み 、 行 の 各 フ ィ ー ル ド の 内 容 を 収 め た 構 造 体 へ の ポ イ ン タ ー を 返 す 。 こ の 構 造 体 の 定 義 は utmp(5) に 書 か れ て い る 。

getutid() は 、 utmp フ ァ イ ル 中 の 現 在 の 位 置 か ら 順 方 向 (末 尾 に 向 か う 方 向 ) へ ut に 基 く 検 索 を 行 う 。 ut−>ut_type が RUN_LVL, BOOT_TIME, NEW_TIME, OLD_TIME の い ず れ か な ら 、 getutid() は ut_type フ ィ ー ル ド が ut−>ut_type に 一 致 す る 最 初 の エ ン ト リ ー を 探 す 。 ut−>ut_type が INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS, DEAD_PROCESS の い ず れ か な ら 、 getutid() は ut_id フ ィ ー ル ド が ut−>ut_id に 一 致 す る 最 初 の エ ン ト リ ー を 探 す 。

getutline() は 、 utmp フ ァ イ ル の 現 在 の 位 置 か ら 末 尾 に 向 か っ て 検 索 を 行 う 。 ut_typeUSER_PROCESS ま た は LOGIN_PROCESS で 、 ut_line フ ィ ー ル ド が ut−>ut_line に マ ッ チ す る 最 初 の 行 を 返 す 。

pututline() は utmp 構 造 体 ut の 内 容 を utmp フ ァ イ ル に 書 き 出 す 。 pututline() は getutid() を 用 い て 、 新 た な エ ン ト リ ー を 挿 入 す る の に ふ さ わ し い 場 所 を 探 す 。 ut を 挿 入 す る ふ さ わ し い 場 所 が 見 つ か ら な い 場 合 は 、 新 た な エ ン ト リ ー を フ ァ イ ル の 末 尾 に 追 加 す る 。

返 り 値

getutent(), getutid(), getutline() は 、 成 功 す る と struct utmp へ の ポ イ ン タ ー を 返 す 。 失 敗 す る と NULL を 返 す (レ コ ー ド が 見 つ か ら な か っ た 場 合 も 失 敗 と な る )。 こ の struct utmp は 静 的 な 記 憶 領 域 に 確 保 さ れ 、 次 に こ れ ら の 関 数 を 呼 び 出 し た 際 に 上 書 き さ れ る か も し れ な い 。

pututline() は 成 功 す る と ut を 返 す 。 失 敗 す る と NULL を 返 す 。

utmpname() は 、 新 し い 名 前 の 格 納 に 成 功 す る と 0 を 返 し 、 失 敗 す る と −1 を 返 す 。 エ ラ ー が 発 生 し た 場 合 、 こ れ ら の 関 数 は errno に エ ラ ー の 原 因 を 示 す 値 を 設 定 す る 。

エ ラ ー

ENOMEM メ モ リ ー 不 足 。

ESRCH レ コ ー ド が 見 つ か ら な か っ た 。 関 数

setutent(), pututline(), getut*() は open(2) に 書 か れ て い る 理 由 で も 失 敗 す る こ と が あ る 。

フ ァ イ ル

/var/run/utmp 現 在 ロ グ イ ン 中 の ユ ー ザ ー の デ ー タ ベ ー ス
/var/log/wtmp 過 去 の ユ ー ザ ー ロ グ イ ン の デ ー タ ベ ー ス

準 拠

XPG2, SVr4.

XPG2 と SVID 2 で は 、 pututline() 関 数 は 値 を 返 さ な い と さ れ て お り 、 (AIX, HP−UX な ど の ) 多 く の シ ス テ ム で は そ う な っ て い る 。 HP−UX で は 、 上 述 の pututline() と 同 じ プ ロ ト タ イ プ を 持 つ 新 し い 関 数 _pututline() が 導 入 さ れ て い る 。 現 在 で は 、 Linux 以 外 の シ ス テ ム で は 、 こ れ ら の 関 数 は 全 て 廃 止 さ れ て い る 。 SUSv1 の 後 に 出 て き た POSIX.1−2001 で は 、 も は や こ れ ら の 関 数 は な く 、 代 わ り に 以 下 の も の を 使 う 。

#include <utmpx.h>

struct utmpx *getutxent(void);
struct utmpx *getutxid(const struct utmpx *);
struct utmpx *getutxline(const struct utmpx *);
struct utmpx *pututxline(const struct utmpx *);
void setutxent(void);
void endutxent(void);
こ れ ら の 関 数 は glibc に よ り 提 供 さ れ て お り 、 "x" が な い 関 数 と 同 じ 処 理 を 行 う が 、 struct utmpx を 使 用 す る 。 Linux で は 、 こ の 構 造 体 の 定 義 は struct utmp と 同 じ に な っ て い る 。 完 全 を 期 す た め に 、 glibc で は utmpxname() も 提 供 し て い る 。 こ の 関 数 は POSIX.1 で は 規 定 さ れ て い な い 。

Linux 以 外 の シ ス テ ム で は 、 utmpx 構 造 体 は utmp 構 造 体 の 上 位 集 合 (superset) に な っ て い て 、 追 加 の フ ィ ー ル ド が あ っ た り 、 既 存 の フ ィ ー ル ド の サ イ ズ が 大 き く な っ て い た り す る も の も あ る 。 複 数 の フ ァ イ ル が 使 用 さ れ て い る 場 合 も あ り 、 多 く の 場 合 /var/*/utmpx/var/*/wtmpx と い う フ ァ イ ル が 使 わ れ る 。 一 方 、 Linux glibc で は 複 数 の utmpx フ ァ イ ル は 使 わ れ て い な い 。 utmp 構 造 体 が 十 分 に 大 き い か ら で あ る 。 上 記 の 名 前 に "x" が 付 い た 関 数 は "x" が 付 い て い な い 対 応 す る 関 数 の 別 名 と な っ て い る (例 え ば getutxent() は getutent() の 別 名 で あ る )。

注 意

glibc で の 注 意 上 記 の 関 数 群 は ス レ ッ ド セ ー フ で は な い 。 glibc に は リ エ ン ト ラ ン ト 版 (reentrant) が 追 加 さ れ て い る 。

#define _GNU_SOURCE /* or _SVID_SOURCE or _BSD_SOURCE;
feature_test_macros(7) 参 照 */
#include <utmp.h>

int getutent_r(struct utmp *ubuf, struct utmp **ubufp);

int getutid_r(struct utmp *ut,
struct utmp *
ubuf, struct utmp **ubufp);

int getutline_r(struct utmp *ut,
struct utmp *
ubuf, struct utmp **ubufp); こ れ ら の 関 数 は GNU で の 拡 張 で あ り 、 末 尾 の _r を と っ た 名 前 の 関 数 と 同 様 の 機 能 を 持 つ 。 ubuf パ ラ メ ー タ ー は 結 果 を 格 納 す る 場 所 を 指 定 す る 。 成 功 す る と 0 を 返 し 、 結 果 へ の ポ イ ン タ ー を *ubufp に 書 き 込 む 。 エ ラ ー の 場 合 −1 を 返 す 。 上 記 の 関 数 に 対 応 す る utmpx 版 は 存 在 し な い (POSIX.1 で は こ れ ら の 関 数 を 規 定 さ れ て い な い )。

以 下 の 例 で は 、 utmp の レ コ ー ド の 追 加 ・ 削 除 を 行 っ て い る 。 こ の コ ー ド は 、 擬 似 端 末 (pseudo terminal) か ら 実 行 さ れ る こ と を 想 定 し て い る 。 実 際 の ア プ リ ケ ー シ ョ ン で は getpwuid(3)ttyname(3) の 戻 り 値 を 検 査 す る べ き で あ る 。

#include <string.h>
#include <stdlib.h>
#include <pwd.h>
#include <unistd.h>
#include <utmp.h>

int
main(int argc, char *argv[])
{
struct utmp entry;

system("echo before adding entry:;who");

entry.ut_type = USER_PROCESS;
entry.ut_pid = getpid();
strcpy(entry.ut_line, ttyname(STDIN_FILENO) + strlen("/dev/"));
/* only correct for ptys named /dev/tty[pqr][0−9a−z] */
strcpy(entry.ut_id, ttyname(STDIN_FILENO) + strlen("/dev/tty"));
time(&entry.ut_time);
strcpy(entry.ut_user, getpwuid(getuid())−>pw_name);
memset(entry.ut_host, 0, UT_HOSTSIZE);
entry.ut_addr = 0;
setutent();
pututline(&entry);

system("echo after adding entry:;who");

entry.ut_type = DEAD_PROCESS;
memset(entry.ut_line, 0, UT_LINESIZE);
entry.ut_time = 0;
memset(entry.ut_user, 0, UT_NAMESIZE);
setutent();
pututline(&entry);

system("echo after removing entry:;who");

endutent();
exit(EXIT_SUCCESS); }

関 連 項 目

getutmp(3), utmp(5)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。