bionic (3) cuserid.3.gz

Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all bug

名前

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

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

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

       マクロ L_cuserid は integer の定数で、ユーザー名を保持するために  必要な配列の長さを示す。  L_cuseridstdio.h で宣言されて いる。

       これらの関数を使うと、プログラムを実行しているユーザー  (cuserid())   や このセッションにログインしている
       ユーザー (getlogin())  を明確に特定することができる (ただし set-user-ID  プログラムでは、状況が違うことも
       ある)。

       たいていの目的では、ユーザーの特定には環境変数  LOGNAME を調べ るほうが便利である。LOGNAME 変数はユーザー
       が自由に設定できるので より柔軟な対応が可能になる。

返り値

       getlogin()  は成功した場合はユーザー名へのポインターを返す。 失敗した場合は NULL を返し、 errno  にエラー
       の原因を示す値を設定する。 getlogin_r()  は成功すると 0 を返し、失敗すると 0 以外を返す。

エラー

       POSIX では以下のエラーが規定されている:

       EMFILE 呼び出し元プロセスがオープンしているファイル数がすでにプロセスあたりの 上限に達している。

       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 を使うものもある)

属性

   マルチスレッディング (pthreads(7) 参照)
       getlogin() 関数はスレッドセーフではない。

       getlogin_r() 関数はスレッドセーフである。

       cuserid() 関数は、例外付きのスレッドセーフである。 パラメーター NULL で呼び出した場合はスレッドセーフでは
       ない。

準拠

       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 文字  しか返さないことも多い。また、プログラム
       の制御端末に現在ログインしているユーザーは、プログラムを実行したユーザーでない場合もある。 セキュリティの
       絡む用途には 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.79 の一部 である。プロジェクトの説明とバグ報告
       に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。