GETLOGIN(2) | FreeBSD System Calls Manual | GETLOGIN(2) |
名称
getlogin, getlogin_r, setlogin — ログイン名を取得/設定するライブラリ
Standard C Library (libc, -lc)書式
#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(3) 関数は setsid() を呼び出しますが、これは制御端末を切り離してフォークでバックグラウンドに入る理想的な方法です。
特に、 ioctl( ttyfd, TIOCNOTTY, ...) または setpgrp( ...) では十分では ありません。
親プロセスがいったん setsid() システムコールを行えば、セッションリーダでないそのプロセスの子が setlogin() を行うことも受け入れられますが、親を含めてセッション内のすべてのプロセスが同時にログイン名を変更されることに注意してください。
これは特権を継承する従来の UNIX の動作と同じではありません。
setlogin() システムコールはスーパユーザに制限されているので、セキュリティ侵犯を防止するために (他の特権のあるすべてのプログラムと同じように) プログラマが適切な注意を払うものだと仮定しています。
戻り値
getlogin() の呼び出しが成功すると、静的バッファ内のヌル文字で終わる文字列へのポインタが返されます。名前が設定されていない場合は、 NULL が返されます。 getlogin_r() 関数の呼び出しが成功すると、0 が返されます。失敗するとエラー番号が返されます。
The setlogin() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.
エラー
これらの呼び出しによって以下のエラーが返される可能性があります:- [ EFAULT]
- name 引数が無効なアドレスを与えました。
- [ EINVAL]
- name 引数が長すぎる文字列を指しています。ログイン名は ( < sys/param.h> の) MAXLOGNAME 文字までに制限されます。現時点ではヌルを含めて 17 文字です。
- [ EPERM]
- ログイン名を設定しようとした呼び出し元がスーパユーザではありませんでした。
- [ ERANGE]
- 返される結果よりバッファのサイズが小さすぎます。
規格
getlogin() システムコールと getlogin_r() 関数は、 ISO/IEC 9945-1:1996 (“POSIX.1”) に適合しています。歴史
getlogin() システムコールは、 4.4BSD ではじめて登場しました。 getlogin_r() の戻り値は、 ISO/IEC 9945-1:1996 (“POSIX.1”) に適合するために FreeBSD の初期のバージョンから変更されました。バグ
システムの以前のバージョンでは、 getlogin() はプロセスがログイン端末に対応していない限り処理に失敗しました。現在の実装では、 ( setlogin() を使用して) プロセスに制御端末がないときでも getlogin は正常に完了します。初期のバージョンでは、 getlogin() によって返される値はユーザ ID をチェックせずには信頼することができませんでした。移植性の高いプログラムはおそらくまだこのチェックを行っているはずです。June 9, 1993 | FreeBSD |