GETLOGIN

Section: Linux Programmer's Manual (3)
Updated: 2008-06-29
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 構造体を割り当てるのに十分なメモリがない。
ENOTTY
標準入力が端末を参照していない (「バグ」の節を参照)。
 

ファイル

/etc/passwd
パスワードデータベースのファイル
/var/run/utmp
(伝統的には /etc/utmp が使われている; libc の中には /var/adm/utmp を使うものもある)
 

準拠

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), utmp(5)


 

Index

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

This document was created by man2html, using the manual pages.
Time: 03:26:43 GMT, April 25, 2010