GETLOGIN

Section: Linux Programmer's Manual (3)
Updated: 2019-03-06
Index JM Home Page
 

名前

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/ に書かれている。

関連キーワード

ユーザー名   getlogin   cuserid   端末   ログイン   utmp   race   制御   ポインター   utent   ヌルポインター   領域   セッション   バグ   Thread   safety   locale   マクロ   実効   保持   特定   変数   成功   passwd   timer

Linux マニュアル 一覧

関連するコマンド・関数

cuserid.3   getlogin_r.3   users.1   tcgetsid.3   login.3   tty.4
 

Index

名前
書式
説明
返り値
エラー
ファイル
属性
準拠
バグ
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 04:39:28 GMT, October 11, 2026