スポンサーリンク

GETLOGIN(2) FreeBSD システムコールマニュアル GETLOGIN(2)

名称

getlogin, getlogin_r, setlogin − ログイン名を取得 / 設定する

ライブラリ

標準 C ライブラリ (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 が返されます。失敗すると エラー番号が返されます。

関数 setlogin() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。

エラー

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

       [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() の戻り値は ISO/IEC 9945-1:1996 (‘‘POSIX.1’’) に適合するために FreeBSD の 初期のバージョンから変更されました。

規格

getlogin() システムコールと getlogin_r() 関数は ISO/IEC 9945-1:1996 (‘‘POSIX.1’’) に適合しています。

FreeBSD 10.0 June 9, 1993 FreeBSD 10.0

スポンサーリンク