RCMD(3) — NEWS-OS Programmer’s Manual
名称
rcmd, rresvport, ruserok − ストリームをリモートコマンドへ返すルーチン
形式
rem = rcmd(ahost, inport, locuser, remuser, cmd, fd2p);
char ∗∗ahost;
int inport;
char ∗locuser, ∗remuser, ∗cmd;
int ∗fd2p;
s = rresvport(port);
int ∗port;
ruserok(rhost, superuser, ruser, luser);
char ∗rhost;
int superuser;
char ∗ruser, ∗luser;
解説
rcmd は、 スーパーユーザがリモートマシン上でコマンドを 実行するルーチンで、 あらかじめ予約されたポート番号を 基にしたあるアクセス権の決定方式を 使用します。 rresvport は、 ソケットの記述子を 返すルーチンです。 この記述子は、 ある特権ポート空間のアドレスを 持つものです。 ruserok は、 サーバが特定のクライアントから要求されるサービスに応えるために 使用するルーチンで、 rcmd を使用します。 これら 3 つの関数は、 すべて同じファイル内にあり、 特に rshd(8C) のサーバに使用されます。
rcmd は、 gethostbyname(3N) を 使用して、 ホスト ∗ahost を 検索します。 そして、 ホストが存在しない場合、 −1 を返します。 そうでない場合、 ∗ahost を ホストの標準名にセットします。 そして、 サーバが、 既知のインターネットポートに常駐し、 コネクションが確立します。
正常にコネクションが成立した場合、 インターネットドメイン内に SOCK_STREAM タイプの ソケットが呼び出し側に返され、 stdin および stdout としてリモートコマンドに与えられます。 fd2p がゼロでない場合、 制御プロセスへの予備チャネルが設定され、 その記述子を ∗fd2p にセットします。 制御プロセスは、 このチャンネル上にコマンド (ユニット 2) からの診断出力を 返します。 さらに、 このチャンネル上で UNIX のシグナル番号としてデータを 受信し、 コマンドのプロセスグループへ転送します。 fd2p が 0 の場合、 stderr (リモートコマンドのユニット 2) は、 stdout と同じように作成されます。 外部のデータの使用によって、 警告を 受ける可能性がありますが、 リモートプロセスへ任意のシグナルを 送信する規約はありません。
プロトコルについては、 rshd(8C) で詳細に述べられています。
rresvport ルーチンは、 特定のアドレスと結び付けられたソケットを 獲得するのに使用します。 このソケットは、 rcmd などのルーチンで使用するのに適しています。 特定のインターネットポートは、 0 から 1023 の範囲です。 スーパーユーザだけが、 この種のアドレスを ソケットに結び付けることが許可されています。
ruserok は、 gethostbyaddr(3N) が返すものと同様のリモートホスト名、 2 個のユーザ名と、 ローカルユーザ名がスーパーユーザかどうかを 示すフラグを 受け取ります。 そして サービスの要求を許可するかどうかを決定するために /etc/host.equiv ファイルを検査し、許可していない場合には、 ローカルユーザのホームディレクトリの .rhosts も検査します。 マシン名が“hosts.equiv”に記載されているか、 あるいはホストおよびリモートユーザ名が“.rhosts”ファイルに見つかった場合、 値 0 が返ります。 そうでない場合、 値 -1 が返ります。 superuser フラグが1の場合、 “hosts.equiv”ファイルの検査は行いません。 ローカルドメイン (gethostname(2)から得られた) が、 リモートドメインと同じ場合、 マシン名だけを指定することができます。
関連事項
rlogin(1C), rsh(1C), intro(2), hosts.equiv(5), rexec(3), rexecd(8C), rlogind(8C), rshd(8C)
診断
rcmd は正常終了した場合、 有効なソケット記述子を 返します。 エラーを 発生した場合 −1 を 返し、 標準エラーに診断メッセージを 書き込みます。
rresvport は正常終了した場合、 指定範囲内の有効なソケット記述子を 返します。 エラーを 発生した場合は −1 を 返し、 エラーの原因に応じて、 グローバル変数 errno がセットされます。 エラーコード EAGAIN は、 “すべてのネットワークポートが使われている”の意味になります。
NEWS-OSRelease 4.2.1R