GETLOGIN(2)

名称
getlogin, getlogin_r, setlogin - ログイン名を取得 / 設定

ライブラリ
libc

書式
<unistd.h> char * getlogin(void) <sys/param.h> int getlogin_r(char *name, int len) int setlogin(const char *name)

解説
getlogin() ルーチンは、 setlogin() で設定した現在のセッションに対応する ユーザのログイン名を返します。 通常、名前はセッションが作成された時点でログインシェルに対応し、 ログインシェルから派生する全てのプロセスに継承されます (これらのプロセスが別のユーザ ID を想定している場合、たとえば、 su(1) が使用されるときでも該当します)。

getlogin_r() は getlogin() と同様のサービスを提供しますが、 呼び出し側は結果を保持するための長さ len バイトのバッファ name を用意しなければなりません。バッファは少なくとも MAXLOGNAME バイトの長さがあるべきです。

setlogin() は、現在のセッションに対応するユーザのログイン名を name に対応させます。 この呼び出しはスーパユーザに制限されており、 新しいセッションがユーザのために 作成されるときにだけ使用されるのが普通です (たとえば、ログイン時、またはリモートシェルが 起動されるときです)。

注釈: セッションごとに 1 つのログイン名しかありません。

プロセスが、確実に親のセッションから切り離されるような 適切なステップを取った後にのみ、 setlogin() が呼び出されるようにすることは 非常に 重要です。 setsid() システムコール を行なうのがこれをする 唯一の 方法です。 daemon() ライブラリは setsid() を呼び出しますが、これは制御端末を切り離して フォークでバックグラウンドに入る理想的な方法です。

特に、 ioctl(ttyfd, TIOCNOTTY, ...) または setpgrp(...) では十分では ありません。

親プロセスがいったん setsid() 呼び出しを行なえば、セッションリーダでない そのプロセスの子が setlogin() を行なうことも受け入れられますが、親を含めてセッション内のすべての プロセスが同時にログイン名を変更されることに注意してください。

これは特権を継承する従来の UNIX の動作と同じではありません。

setlogin() システムコールはスーパユーザに制限されているので、セキュリティ侵犯を 防止するために (他の特権のあるすべてのプログラムと同じように) プログラマが適切な注意を払うものだと仮定しています。

戻り値
getlogin() の呼び出しが成功すると、静的バッファ内のヌルで終端された文字列への ポインタが返されます。 名前が設定されていない場合は、 NULL が返されます。 getlogin_r() の呼び出しが成功すると、0 が返されます。失敗するとエラー番号 が返されます。

エラー
これらの呼び出しによって以下のエラーが返される可能性があります。

[EFAULT]
    name パラメータで無効なアドレスを与えました。

[EINVAL]
    name パラメータが長すぎる文字列を指しています。ログイン名は (<sys/param.h> の) MAXLOGNAME 文字までに制限されます。現時点ではヌルを含めて 17 文字です。

[EPERM]
    ログイン名を設定しようとした呼び出し元が スーパユーザではありませんでした。

[ERANGE]
    返される結果よりバッファのサイズが小さすぎます。

関連項目
setsid(2), daemon(3)

バグ
システムの以前のバージョンでは、 getlogin() はプロセスがログイン端末に対応していない限り 処理に失敗しました。現在では、 (setlogin() を使用して) プロセスに制御端末がないときでも getlogin は正常に完了します。初期のバージョンでは、 getlogin() が返す値はユーザ ID をチェックせずには 信頼することができませんでした。 移植性の高いプログラムはおそらくまだこのチェックを行なっているはずです。

歴史
getlogin() 関数は 4.4BSD ではじめて登場しました。 getlogin_r() の戻り値は p1003.1-96 に準拠するために FreeBSD の初期のバージョンから変更されました。

規格
getlogin() と getlogin_r() は p1003.1-96 に準拠しています。