Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all
名前
getlogin, getlogin_r, cuserid - ユーザー名を取得する
書式
#include <unistd.h> char *getlogin(void); int getlogin_r(char *buf, size_t bufsize); #include <stdio.h> char *cuserid(char *string); glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照): getlogin_r(): _POSIX_C_SOURCE >= 199506L cuserid(): glibc 2.24 以降: (_XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L) || _GNU_SOURCE glibc 2.23 以前: _XOPEN_SOURCE
説明
getlogin() は、現在のプロセスの制御端末にログインしているユーザー名の文字列への ポイン ターを返す。ユーザー名が決定できない場合はヌルポインターを返す。 文字列は静的領域に割り当 てられており、この後でこの関数や cuserid() が呼び出された際に上書きされることがある。 getlogin_r() は、上記の同じユーザー名を、大きさ bufsize の配列 buf に入れて返す。 cuserid() は、現在のプロセスの実効ユーザーID に対応するユーザー名の 文字列へのポインター を返す。 string がヌルポインター以外の場合、string は少なくとも L_cuserid 文字を保持できる 配列でなければならない。 string が ヌルポインターの場合には、静的領域に置かれた文字列への ポインターが返される。この文字列は静的領域に割り当てられており、後で この関数や getlogin() が呼び出された際に上書きされることがある。 マクロ L_cuserid は integer の定数で、ユーザー名を保持するために 必要な配列の長さを示す。 L_cuserid は stdio.h で宣言されて いる。 これらの関数を使うと、プログラムを実行しているユーザー (cuserid()) や このセッションにロ グインしているユーザー (getlogin()) を明確に特定することができる (ただし set-user-ID プロ グラムでは、状況が違うこともある)。 たいていの目的では、ユーザーの特定には環境変数 LOGNAME を調べ るほうが便利である。LOGNAME 変数はユーザーが自由に設定できるので より柔軟な対応が可能になる。
返り値
getlogin() は成功した場合はユーザー名へのポインターを返す。 失敗した場合は NULL を返し、 errno にエラーの原因を示す値を設定する。 getlogin_r() は成功すると 0 を返し、失敗すると 0 以外を返す。
エラー
POSIX では以下のエラーが規定されている: EMFILE The per-process limit on the number of open file descriptors has been reached. ENFILE オープンされたファイルの総数がシステム全体の上限に達していた。 ENXIO 呼び出し元プロセスには制御端末がない。 ERANGE (getlogin_r) (終端のヌルバイト ('\0') も含めた) ユーザー名の長さが bufsize よりも 長い。 Linux/glibc には以下のエラーもある。 ENOENT utmp ファイルに対応するエントリーがなかった。 ENOMEM passwd 構造体を割り当てるのに十分なメモリーがない。 ENOTTY 標準入力が端末を参照していない (「バグ」の節を参照)。
ファイル
/etc/passwd パスワードデータベースのファイル /var/run/utmp (伝統的には /etc/utmp が使われている; libc の中には /var/adm/utmp を使うものもある)
属性
この節で使用されている用語の説明については、 attributes(7) を参照。 ┌─────────────────┬───────────────┬───────────────────────────────────────┐ │インターフェース │ 属性 │ 値 │ ├─────────────────┼───────────────┼───────────────────────────────────────┤ │getlogin() │ Thread safety │ MT-Unsafe race:getlogin race:utent │ │ │ │ sig:ALRM timer locale │ ├─────────────────┼───────────────┼───────────────────────────────────────┤ │getlogin_r() │ Thread safety │ MT-Unsafe race:utent sig:ALRM timer │ │ │ │ locale │ ├─────────────────┼───────────────┼───────────────────────────────────────┤ │cuserid() │ Thread safety │ MT-Unsafe race:cuserid/!string locale │ └─────────────────┴───────────────┴───────────────────────────────────────┘ In the above table, utent in race:utent signifies that if any of the functions setutent(3), getutent(3), or endutent(3) are used in parallel in different threads of a program, then data races could occur. getlogin() and getlogin_r() call those functions, so we use race:utent to remind users.
準拠
getlogin() and getlogin_r(): POSIX.1-2001, POSIX.1-2008. System V にも cuserid() があるが、 これは実効ユーザー ID ではなく、実ユーザー ID を使用す る。 cuserid() 関数は 1988 年版の POSIX には含まれていたが、 1990 年版では削除された。 SUSv2 に存在したが、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() は「使わない」こと。
関連項目
logname(1), geteuid(2), getuid(2), utmp(5)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの 説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。