GETLOGIN(3) | Linux Programmer's Manual | GETLOGIN(3) |
名前
getlogin, getlogin_r, cuserid -ユーザー名を取得する書式
#include <unistd.h>glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
説明
getlogin() は、現在のプロセスの制御端末にログインしているユーザー名の文字列へのポインタを返す。ユーザー名が決定できない場合は NULL ポインタを返す。文字列は静的領域に割り当てられており、この後でこの関数や cuserid() が呼び出された際に上書きされることがある。getlogin_r() は、上記の同じユーザ名を、大きさ bufsize の配列 buf に入れて返す。
cuserid() は、現在のプロセスの実効ユーザーID に対応するユーザー名の文字列へのポインタを返す。 string が NULL ポインタ以外の場合、 string は少なくとも L_cuserid 文字を保持できる配列でなければならない。 string が NULL ポインタの場合には、静的領域に置かれた文字列へのポインタが返される。この文字列は静的領域に割り当てられており、後でこの関数や getlogin() が呼び出された際に上書きされることがある。
マクロ L_cuserid は integer の定数で、ユーザー名を保持するために必要な配列の長さを示す。 L_cuserid は stdio.h で宣言されている。
これらの関数を使うと、プログラムを実行しているユーザー ( cuserid()) やこのセッションにログインしているユーザー ( getlogin()) を明確に特定することができる (ただし set-user-ID プログラムでは、状況が違うこともある)。
たいていの目的では、ユーザーの特定には環境変数 LOGNAME を調べるほうが便利である。LOGNAME 変数はユーザーが自由に設定できるのでより柔軟な対応が可能になる。
返り値
getlogin() は成功した場合はユーザ名へのポインタを返し、失敗した場合は NULL を返す。 getlogin_r() は成功すると 0 を返し、失敗すると 0 以外を返す。エラー
POSIX では以下のエラーが規定されている:- EMFILE
- 呼び出し元プロセスがオープンしているファイル数がすでにプロセスあたりの上限に達している。
- ENFILE
- システム全体でオープンしているファイル数がすでに上限に達している。
- ENXIO
- 呼び出し元プロセスには制御端末がない。
- ERANGE
- (getlogin_r) (終端の NULL バイトも含めた) ユーザ名の長さが bufsize よりも長い。
Linux/glibc には以下のエラーもある。
- ENOENT
- utmp ファイルに対応するエントリがなかった。
- ENOMEM
- passwd 構造体を割り当てるのに十分なメモリがない。
- ENOTTY
- 標準入力が端末を参照していない (「バグ」の節を参照)。
ファイル
- /etc/passwd
- パスワードデータベースのファイル
- /var/run/utmp
- (伝統的には /etc/utmp が使われている; libc の中には /var/adm/utmp を使うものもある)
準拠
getlogin() と getlogin_r() は POSIX.1-2001 で規定されている。OpenBSD には getlogin() と setlogin() があり、セッションに対応したユーザ名がある。制御端末がないセッションの場合であっても、対応するユーザ名がある。
バグ
残念ながら、 getlogin() をだますのはそれほど難しいことではない。別のプログラムが utmp ファイルを壊してしまうと、全く動作しないこともある。またログイン名の最初の 8 文字しか返さないことも多い。また、プログラムの制御端末に現在ログインしているユーザーは、プログラムを実行したユーザーでない場合もある。セキュリティの絡む用途には getlogin() を用いるべきではない。glibc は POSIX 仕様には従っておらず、 /dev/tty ではなく 標準入力 (stdin) を使う。これはバグである。 (SunOS 5.8 や HP-UX 11.11 や FreeBSD 4.8 といった他の最近のシステムはいずれも、 標準入力 がリダイレクトされた場合でもログイン名を返す。)
cuserid() が何を行っているのか、実際のところを知っている者は誰もいない;移植性が求められるプログラムでは cuserid() は使うべきではない。というかどんなプログラムでも使うべきではない: 代わりに getpwuid(geteuid()) を用いるべきである (これが意図していることならば、だが)。 cuserid() は「使わない」こと。
関連項目
geteuid(2), getuid(2), utmp(5)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2008-06-29 | GNU |