GETLOGIN(3)

名前
getlogin, cuserid - ユーザー名を取得する

書式
#include <unistd.h>

char * getlogin ( void );

#include <stdio.h>

char * cuserid ( char *string );

説明
getlogin は、現在のプロセスを制御している端末にログインしているユーザー名の文字 列へのポインタを返す。ユーザー名が決定できない場合は null ポインタを返 す。文字列はスタティックな領域に配置されており、この関数がもう一度呼び 出されたり cuserid が呼び出されたときには上書きされる。

cuserid は現在のプロセスの実効ユーザー ID に対応するユーザー名の文字列へのポイ ンタを返す。 string は null ポインタでなければ配列となる。この配 列は、少なくとも L_cuserid 文字を保持することができる。文字列は この配列で返される。 逆に string が null ポインタの場合は、スタティックな領域に置かれ た文字列へのポインタが返される。文字列はスタティックにアロケートされて おり、この関数がもう一度呼び出されたり getlogin が呼び出されたと きには上書きされる。

マクロ L_cuserid は integer の定数で、ユーザー名を保持するために 必要な配列の長さを示す。 L_cuserid は stdio.h で宣言されて いる。

これらの関数は、プログラムを実行しているユーザー (cuserid) や現 在のセッションにログインしているユーザー (getlogin) を明確に特定す る (ただし setuid プログラムでは、これらの関数の結果が異なることもある)。 ユーザーはこれらの関数をだますことはできない。

たいていの目的では、ユーザーの特定には環境変数 LOGNAME を調べ るほうが便利である。LOGNAME 変数はユーザーが自由に設定できるので より柔軟な対応が可能になる。

エラー

ENOMEM
    passwd 構造体を割当てるメモリがない。

ファイル
/etc/passwd             パスワードデータベースのファイル
/etc/utmp (または /var/adm/utmp、あるいは最近では、 とにかくどこかにある utmp - 正確な場所は libc のバージョンによる)

準拠
POSIX.1。 System V にも cuserid があるが、これは実効ユーザー ID で はなく、実ユーザー ID を使用する。 cuserid 関数は 1988 年版の POSIX には含まれていたが、 1990 年版では削除された。

バグ
残念ながら、 getlogin() をだますのはそれほど難しいことではない。別のプ ログラムが utmp ファイルを壊してしまうと、全く動作しないこともある。ま たログイン名の最初の 8 文字しか返さないことも多い。またプログラムを制 御している tty に現在ログインしているユーザーは、プログラムを実行した ユーザーでない場合もある。

cuserid() が何を行っているのか、詳細を知っている者は誰もいない - 移植性が求められるプログラムでは cuserid() は使うべきではない - というかどんなプログラムでも使うべきではない - 代わりに getpwuid(geteuid()) を用いるべきである (これが意図していることならば、だが)。 とにかく cuserid() は使わないこと!

関連項目
geteuid(2), getuid(2)