getlogin_r(3) FreeBSD 一般コマンドマニュアル

getlogin_r

前のページ 上に戻る 次のページ

getlogin_r




書式

     #include <unistd.h>

     char *
     getlogin(void);

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

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

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

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


関連項目

     setsid(2), daemon(3)


バグ

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


歴史

     getlogin() 関数は 4.4BSD ではじめて登場しました。 getlogin_r() の戻り値は
     ISO/IEC 9945-1:1996 (``POSIX.1'') に準拠するために FreeBSD の初期のバー
     ジョンから変更されました。


規格

     getlogin() と getlogin_r() は ISO/IEC 9945-1:1996 (``POSIX.1'') に準拠し
     ています。

FreeBSD 4.4                      June 9, 1993                      FreeBSD 4.4

ABELNET VPSサービス