GETLOGIN

Section: Linux Programmer's Manual (3)
Updated: 2007-07-26
Index JM Home Page roff 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(): _REENTRANT || _POSIX_C_SOURCE >= 199506L
cuserid(): _XOPEN_SOURCE  

説明

getlogin() は、現在のプロセスの制御端末にログインしているユーザー名の文字列への ポインタを返す。ユーザー名が決定できない場合は null ポインタを返す。 文字列は静的領域に割り当てられており、この後でこの関数や cuserid() が呼び出された際に上書きされることがある。

getlogin_r() は、上記の同じユーザ名を、大きさ bufsize の配列 buf に入れて返す。

cuserid() は、現在のプロセスの実効ユーザーID に対応するユーザー名の 文字列へのポインタを返す。 string が null ポインタ以外の場合、string は少なくとも L_cuserid 文字を保持できる配列でなければならない。 string が null ポインタの場合には、静的領域に置かれた文字列への ポインタが返される。この文字列は静的領域に割り当てられており、後で この関数や getlogin() が呼び出された際に上書きされることがある。

マクロ L_cuserid は integer の定数で、ユーザー名を保持するために 必要な配列の長さを示す。 L_cuseridstdio.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 構造体を割り当てるのに十分なメモリがない。
 

ファイル

/etc/passwd     パスワードデータベースのファイル

/var/run/utmp (伝統的には /etc/utmp が使われている; libc の中には /var/adm/utmp を使うものもある)
/etc/utmp (か /var/adm/utmp、あるいは最近では、 とにかくどこかにある utmp - 正確な場所は libc のバージョンによる)  

準拠

getlogin() と getlogin_r() は POSIX.1-2001 で規定されている。

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

OpenBSD には getlogin() と setlogin() があり、 セッションに対応したユーザ名がある。制御端末がない セッションの場合であっても、対応するユーザ名がある。  

バグ

残念ながら、 getlogin() をだますのはそれほど難しいことではない。別のプログラムが utmp ファイルを 壊してしまうと、全く動作しないこともある。またログイン名の最初の 8 文字 しか返さないことも多い。またプログラムを制御している tty に 現在ログインしているユーザーは、プログラムを実行した ユーザーでない場合もある。 セキュリティの絡む用途には 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)


 

Index

名前
書式
説明
返り値
エラー
ファイル
準拠
バグ
関連項目

This document was created by man2html, using the manual pages.
Time: 04:31:43 GMT, November 19, 2007