GETUTENT(3)

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

書式
#include <utmp.h>

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

void pututline(struct utmp *ut);

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

void utmpname(const char *file);

説明
utmpname() は、他の utmp 関数がアクセスする (utmp フォー マットの) ファイルの名前を指定する。utmpname() が他の関数に先立っ てファイル名の指定に用いられない場合は、 <path.h> で定義されてい る _PATH_UTMP がファイル名とされる。

setutent() はファイルポインタを utmp ファイルの先頭に移動する。 通常は他の関数に先立ってこの関数を呼び出しておくと良い。

endutent() は utmp ファイルをクローズする。ユーザーコードで他の 関数群によるアクセスが終了したら、最後にこの関数を呼び出さなければなら ない。

getutent() は utmp ファイル中の現在のファイル位置から一行読み込 み、行の各フィールドの内容を収めた構造体へのポインタを返す。

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_type が USER_PROCESS または LOGIN_PROCESS で、 ut_line フィールドが ut->ut_line にマッチする最初の 行が返される。

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

返り値
getutent(), getutid(), getutline() は static struct utmp へのポインタを返す。

エラー
エラーの際には (struct utmp*)0 が返る。

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

#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(0)+strlen("/dev/"));
  /* only correct for ptys named /dev/tty[pqr][0-9a-z] */
  strcpy(entry.ut_id,ttyname(0)+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();
  return 0;
}

ファイル
/var/run/utmp 現在ログインしているユーザーのデータベース
/var/log/wtmp 過去のユーザーログインのデータベース

準拠
XPG 2, SVID 2, Linux FSSTND 1.2

関連項目
utmp(5)