Provided by: manpages-ja-dev_0.5.0.0.20221215+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(): _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_cuseridstdio.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/ に書かれている。