Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

xdr(3N)

RPC(3N)  —  NEWS-OS Programmer’s Manual

名称

rpc − リモートプロシージャ呼出しのためのライブラリルーチン

形式と解説

 これらのルーチンは、C プログラムがネットワークを介して他のマシン上でプロシージャ呼出しを行うことを可能にします。 まず、データパケットをサーバに送るプロシージャをクライアントが 呼び出します。 パケットを受け取ると、サーバは、要求されたサービスを実行する ディスパッチルーチンを呼び出し、応答を送り返します。 最後に、プロシージャ呼出しがクライアントに戻ります。

#include <rpc/rpc.h>

void
auth_destroy(auth)
AUTH ∗auth;

これは、 auth に関連する確認情報を破壊するマクロです。 破壊には通常、専用データ構造体の割り当て解除が伴います。 auth の使用は、 auth_destroy() の呼び出し後は未定義です。

AUTH ∗
authnone_create()

各リモートプロシージャ呼び出しで使用できない確認情報を渡す RPC 確認ハンドルを作成し、返します。 これは RPC が使用するデフォルトの確認です。

AUTH ∗
authdes_create(name, window, syncaddr, ckey)
char ∗name;
unsigned window;
struct sockaddr ∗addr;
des_block ∗ckey;

authdes_create() は、 DES 確認と呼ばれる RPC 安全確認システムにインターフェースする 2 つのルーチンのうちの第 1 の ルーチンです。 第 2 のルーチンは、下記に示す authdes_getucred() です。 注意 : DES 確認システムが動作するためには、キーサーバデーモン keyserv(8) が実行されなければなりません。

authdes_create() は、クライアント側で使用され、安全確認システムの使用を可能にする確認 ハンドルを戻します。 第 1 のパラメータ name は、サーバプロセスのオーナのネットワーク名、すなわち netname です。 このフィールドは通常、ユーティリティルーチン i" host2netname から引き出された hostname を表しますが、 user2netname を使用してユーザ名を表すこともできます。 第 2 のフィールドは、クライアントの credential の有効性に関するウィンドウで、 秒単位で表されます。 小さなウィンドウは大きなウィンドウより安全ですが、小さすぎるウィンドウ を選択すると、クロックドリフトのために再同期化の頻度が増加します。 第 3 のパラメータ syncaddr は任意選択です。 これが ナル の場合、確認システムは、ローカルクロックは常にサーバのクロックと同期を とっていると見なし、再同期化の試みは行いません。 しかし、アドレスが与えられた場合は、システムは、再同期化が要求されたときはいつでも、リモートタイムサーバを調べるためにそのアドレスを使用します。 このパラメータは通常、 RPC サーバ自身のアドレスです。 最後のパラメータ ckey も任意選択です。 これが ナル の場合、 確認システムは credential のエンクリプトのために使用されるランダム DES キーを生成します。 しかし、パラメータが与えられた場合は、それが代わりに使用されます。

authdes_getucred(adc, uid, gid, grouplen, groups)
struct authdes_cred ∗adc;
short ∗uid;
short ∗gid;
short ∗grouplen;
int ∗groups;

authdes_getucred() は、2 つの DES 確認ルーチンのうちの第2のルーチンであり、オペレーティングシステムに 依存しない DES credential を credential に変換するためにサーバ側で使用されます。 このルーチンは、 authdes_getucred() がキャッシュからその情報を引き出すユーティリティルーチン netname2user とは異なり、その情報を得るために呼び出されるたびに NIS の検索を 行う必要はありません。

AUTH ∗
authunix_create(host, uid, gid, len, aup_gids)
char ∗host;
int uid, gid, len, ∗aup.gids;

確認情報を含む RPC 確認ハンドルを作成し、戻します。 パラメータ host は、情報が作成されたマシンの名前です。 uid はユーザのユーザ ID 、 gid はユーザの現在のグループ ID です。 len および aup_gids は、ユーザが所属するグループのカウントされたアレイを指します。 ユーザを装うことは簡単です。

AUTH ∗
authunix_create_default()

適切なパラメータで authunix_create() を呼び出します。

callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out)
char ∗host;
u_long prognum, versnum, procnum;
char ∗in, ∗out;
xdrproc_t inproc, outproc;

マシン host 上の prognum、 versnum および procnum に関連するリモートプロシージャを呼び出します。 パラメータ in はプロシージャの引数のアドレスで、 out は結果(1つまたは複数)が入れられるアドレスです。 inproc はプロシージャのパラメータをコード化するために使用され、 outproc はプロシージャの結果をデコードするために使用されます。 このルーチンは、成功した場合はゼロを返し、失敗した場合は enum clnt_stat の値を整数にしたものを返します。 ルーチン clnt_perrno() は、失敗のステータスをメッセージに変換するのに便利です。

警告 : このルーチンでリモートプロシージャを呼び出す場合は、 UDP/IP がトランスポートとして使用されます。 制限については clntudp_create() を参照してください。 このルーチンを使用してタイムアウトまたは確認の制御を行うことはできません。

enum clnt_stat
clnt_broadcast(prognum, versnum, procnum, inproc, in, outproc, out, eachresult)
u_long prognum, versnum, procnum;
char ∗in, ∗out;
xdrproc_t inproc, outproc;
resultproc_t eachresult;

これは、呼び出しメッセージがローカルに接続された同報通信ネットすべてに 同報通信されることを除いて、 callrpc() と同じです。 このルーチンは、応答を受け取るたびに eachresult() を呼び出します。 その形式は下記の通りです。

eachresult(out, addr)
char ∗out;
struct sockaddr_in ∗addr;

ここで、 out は clnt_broadcast() に渡された out と同じですが、その場合はリモートプロシージャの出力がデコードされる点 だけが異なります。 addr は、結果を送るマシンのアドレスを指します。 eachresult() がゼロを返した場合、 clnt_broadcast() はさらに応答を待ちます。 それ以外の場合は、適切なステータスで返します。

警告 : 同報通信ソケットのサイズは、データリンクの最大転送単位に制限 されています。 ethernet の場合は、この値は 1500 バイトです。

enum clnt_stat
clnt_call(clnt, procnum, inproc, in, outproc, out, tout)
CLIENT ∗clnt;
u_long
procnum;
xdrproc_t inproc, outproc;
char ∗in, ∗out;
struct timeval tout;

これは、 clnt_create() などの RPC クライアント作成ルーチンで得られるクライアントハンドル clnt に関連するリモートプロシージャ procnum を呼び出すマクロです。 パラメータ in はプロシージャの引数のアドレスで、 out は結果(1つまたは複数)が入れられるアドレスです。 inproc はプロシージャのパラメータをコード化するために使用され、 outproc はプロシージャの結果をデコードするために使用されます。 tout は、結果が戻るのに見込まれた時間です。

clnt_destroy(clnt)
CLIENT ∗clnt;

クライアントの RPC ハンドルを破壊するマクロです。 破壊には通常、 clnt 自身を含む専用データ構造体の割り当て解除が伴います。 clnt の使用は、 clnt_destroy() の呼出しの後では未定義です。 RPC ライブラリが関連するソケットをオープンした場合は、それもクローズされます。 そうでない場合は、ソケットはオープンされたままです。

CLIENT ∗
clnt_create(host, prog, vers, proto)
char ∗host;
u_long prog, vers;
char ∗proto;

総称的なクライアント作成ルーチンです。 host は、サーバが置かれるリモートホストの名前を示します。 proto は、どの種類のトランスポートプロトコルが使用されるかを示します。 このフィールドについて現在サポートされている値は、“udp” と “tcp” です。 デフォルトのタイムアウトが設定されていますが、 clnt_control() を使用して変更することができます。

警告 : UDP の使用には欠点があります。 UDPベースの RPC メッセージは最高 8 K バイトのコード化データしかもつことができないため、 大きな引数を使ったり莫大な結果を返したりするプロシージャにこの トランスポートを使用することはできません。

bool_t
clnt_control(cl, req, info)
CLIENT ∗cl;
char ∗info;

クライアントのオブジェクトに関する各種の情報を変更、または検索するために使用されるマクロです。 req はオペレーションのタイプを示し、 info は情報を指すポインタを示します。 UDP の場合も TCP の場合も、 req のサポートされている値とそれらの引数のタイプ、およびそれらが何を行うかは、 下記の通りです。

CLSET_TIMEOUTstruct timevalタイムアウトの合計をセットする
CLGET_TIMEOUTstruct timevalタイムアウトの合計を得る

注意 : clnt_control() を使用してタイムアウトを設定する場合、 clnt_call() に渡されたタイムアウトのパラメータは、将来のすべての呼び出しで 無視されます。

CLGET_SERVER_ADDRstruct sockaddrサーバのアドレスを得る

下記のオペレーションは、 UDP の場合のみ有効です。

CLSET_RETRY_TIMEOUTstruct timeval再試行タイムアウトをセットする
CLGET_RETRY_TIMEOUTstruct timeval再試行タイムアウトを得る

再試行タイムアウトは、要求を再転送する前にサーバの応答を UDP RPC が待つ時間です。

clnt_freeres(clnt, outproc, out)
CLIENT ∗clnt;
xdrproc_t outproc;
char ∗out;

RPC 呼出しの結果をデコードしたときに RPC/XDR が割り当てたあらゆるデータを解放するマクロです。 パラメータ out は結果のアドレスで、 outproc は結果を記述する XDR ルーチンです。 このルーチンは、結果の解放に成功した場合は 1 を返し、 そうでない場合はゼロを返します。

void
clnt_geterr(clnt, errp)
CLIENT ∗clnt;
struct rpc_err ∗errp;

クライアントハンドルからエラー構造体をアドレス errp の構造体にコピーするマクロです。

void
clnt_pcreateerror(s)
char ∗s;

クライアントの RPC ハンドルがどうして作成できなかったのかを示す、標準エラーに対する メッセージを表示します。 メッセージは、文字列 s およびコロンでプリペンドされます。 clnt_create()、 clntraw_create()、 clnttcp_create() または clntudp_create() 呼出しが失敗したときに使用されます。

void
clnt_perrno(stat)
enum clnt_stat stat;

stat によって示される状態に対応する標準エラーに対するメッセージを表示します。 callrpc() の後で使用されます。

clnt_perror(clnt, s)
CLIENT ∗clnt;
char ∗s;

RPC 呼出しがどうして失敗したのかを示す、標準エラーに対するメッセージを 表示します。 clnt は、呼出しを行うために使用されたハンドルです。 メッセージは、文字列 s およびコロンでプリペンドされます。 clnt_call() の後で使用されます。

char ∗
clnt_spcreateerror
char ∗s;

標準エラーに対する表示を行う代わりに文字列を返す点を除いて、 clnt_pcreateerror() と同じです。

バグ : 各呼び出しに重ね書きされる、静的データを指すポインタを返します。

char ∗
clnt_sperrno(stat)
enum clnt_stat stat;

clnt_perrno(), と同じ引数をとりますが、 RPC 呼出しがどうして失敗したかを示す標準エラーに対するメッセージを送る 代わりに、そのメッセージを含む文字列を指すポインタを返します。 文字列の終わりは 復帰改行 です。

clnt_sperrno() は、プログラムが標準エラー(サーバが行う可能性が全くないようなプログラムの実行など)をもたない場合、あるいはプログラマが printf でメッセージを出力することを望まない場合、あるいは clnt_perrno() で使用されるものとは異なるメッセージのフォーマットが使用される場合に、 clnt_perrno() の代わりに使用されます。 注意 : clnt_sperror() や clnt_spcreaterror() とは異なり、 clnt_sperrno() は静的データを返さないため、結果は各呼び出しに重ね書きされません。

char ∗
clnt_sperror(rpch, s)
CLIENT ∗rpch;
char ∗s;

( clnt_sperrno() と同様に)標準エラーに対する表示を行う代わりに文字列を返す点を除いて、 clnt_perror() と同じです。

バグ : 各呼び出しに重ね書きされる静的データを指すポインタを返します。

CLIENT ∗
clntraw_create(prognum, versnum)
u_long prognum, versnum;

このルーチンは、リモートプログラム prognum、 バージョン versnum のためのトイ RPC クライアントを作成します。 メッセージをサービスに渡すために使用されるトランスポートは、実際はプロセスのアドレス空間内のバッファであるため、対応する RPC サーバは同じアドレス空間になければなりません。 svcraw_create() を参照して下さい。 これは、カーネルの干渉なしに、 RPC のシミュレーションや、往復時間などの RPC のオーバヘッドの入手を可能にします。 このルーチンは、失敗した場合は ナル を返します。

CLIENT ∗
clnttcp_create(addr, prognum, versnum, sockp, sendsz, recvsz)
struct sockaddr_in ∗addr;
u_long prognum, versnum;
int ∗sockp;
u_int sendsz, recvsz;

このルーチンは、リモートプログラム prognum バージョン versnum のための RPC クライアントを作成します。 クライアントは、トランスポートとして TCP/IP を使用します。 リモートプログラムは、インターネット(Internet)アドレス ∗addr に置かれます。 ­addr−>sin_port がゼロの場合は、リモートプログラムがリストされている実際のポートに設定されます(この情報については、リモート portmap サービスが調べられます)。 パラメータ sockp はソケットです。 これが RPC_ANYSOCK である場合、このルーチンは新しいソケットをオープンし、 sockp を設定します。 TCP ベースの RPC がバッファ付き I/O を使用するため、ユーザはパラメータ sendsz および recvsz で送信バッファおよび受信バッファのサイズを指定することができます。 値をゼロにすると、適切なデフォルトが選択されます。 このルーチンは、失敗した場合は ナル を返します。

CLIENT ∗
clntudp_create(addr, pronum, versnum, wait, sockp)
struct sockaddr_in ∗addr;
u_long prognum, versnum;
struct timeval wait;
int ∗sockp;

このルーチンは、リモートプログラム prognum 、バージョン versnum のための RPC クライアントを作成します。 クライアントは、トランスポートとして UDP/IP を使用します。 リモートプログラムは、インターネット(Internet)アドレス addr に置かれます。 ­addr−>sin_port がゼロの場合は、リモートプログラムがリストされている実際のポートに 設定されます(この情報については、リモート portmap サービスが調べられます)。 パラメータ sockp はソケットです。 これが RPC_ANYSOCK である場合、このルーチンは新しいソケットをオープンし、 sockp を設定します。 UDP トランスポートは、応答が受け取られるか、あるいは呼出しがタイムアウトを 起こすまで、 wait 時間のインタバルに呼び出しメッセージを再び送ります。 呼出しがタイムアウトを起こすまでの時間の合計は、 clnt_call() によって指定されます。

警告 : UDP ベースの RPC メッセージは最高8Kバイトのコード化データしかもつことができないため、 大きな引数を使ったり莫大な結果を返したりするプロシージャにこのトランス ポートを使用することはできません。

host2netname(name, host, domain)
char ∗name;
char ∗host;
char ∗domain;

ドメイン固有のホスト名からオペレーティングシステム独立のネット名に 変換します。 成功した場合は 真 を、失敗した場合は 偽 を返します。 これは、 netname2host() の逆です。

key_decryptsession(remotename, deskey)
char ∗remotename;
des_block ∗deskey;

key_decryptsession() は、 RPC の安全確認システム (DES 確認)と関連するキーサーバデーモンに対するインターフェースです。 ユーザプログラムがこのルーチンや、これに関連するルーチン key_encryptsession()、 key_gendes() および key_setsecret() を呼び出す必要はほとんどありません。 login などのシステムコマンドや RPC ライブラリが、これらの 4 つのルーチンの主なクライアントです。

key_decryptsession() は、サーバネット名と des キーをとり、サーバのパブリックキーおよび 呼び出しプロセスの有効な uid と関連するシークレットキーを使用してキーを デクリプトします。 これは、 key_encryptsession() の逆です。

key_encryptsession(remotename, deskey)
char ∗remotename;
des_block ∗deskey;

key_encryptsession() は、キーサーバインターフェースルーチンです。 これは、サーバネット名と des キーをとり、サーバのパブリックキーおよび 呼び出しプロセスの有効な uid と関連するシークレットキーを使用して エンクリプトします。 これは、 key_decryptsession() の逆です。

key_gendes(deskey)
des_block ∗deskey;

key_gendes() は、キーサーバインターフェースルーチンです。 これは、キーサーバに安全な会話キーを要求するために使用されます。 現在の時間を使用するなどの乱数を選択する一般的な方法は非常に推測 されやすいので、“ランダム” に1つを選択することは通常、 十分によい方法とは言えません。

key_setsecret(key)
char ∗key;

key_setsecret() は、キーサーバインターフェースルーチンです。 これは、呼び出しプロセスの有効な uid のためのキーを設定するために使用されます。

void
get_myaddress(addr)
struct sockaddr_in ∗addr;

/etc/hosts を扱うライブラリルーチンを調べることなく、マシンの IP アドレスを ∗addr にスタッフします。 ポート番号は常に、 htons(PMAPPORT) に設定されます。

getnetname(name)
char name[MAXNETNAMELEN];

getnetname() は、呼び出し側の一意の、オペレーティングシステム独立のネット名を固定長 アレイ name にインストールします。 成功した場合は 真 を返し、失敗した場合は 偽 を返します。

netname2host(name, host, hostlen)
char ∗name;
char ∗host;
int hostlen;

オペレーティングシステム独立のネット名からドメイン固有のホスト名に 変換します。 成功した場合は 真 を返し、失敗した場合は 偽 を返します。 これは、 host2netname() の逆です。

netname2user(name, uidp, gidp, gidlenp, gidlist)
char ∗name;
int ∗uidp;
int ∗gidp;
int ∗gidlenp;
int ∗gidlist;

オペレーティングシステム独立のネット名からドメイン固有のユーザ ID に変換します。 成功した場合は 真 を返し、失敗した場合は 偽 を返します。 これは、 user2netname() の逆です。

struct pmaplist ∗
pmap_getmaps(addr)
struct sockaddr_in ∗addr;

portmap サービスへのユーザインターフェースで、 IP アドレス ∗addr に置かれているホスト上の現在の RPC のプログラムからポートへのマッピングのリストを返します。 このルーチンは、 ナル を返すことがあります。 コマンド ‘rpcinfo −p’ はこのルーチンを使用します。

u_short
pmap_getport(addr, prognum, versnum, protocol)
struct sockaddr_in ∗addr;
u_long prognum, versnum, protocol;

プログラム番号 prognum、 バージョン versnum、 をサポートするサービスを待つポート番号を返し、 protocol と関連するトランスポートプロトコルを伝える、 portmap サービスへのユーザインターフェースです。 protocol の値は、最も適切なものか IPPROTO_TCP です。 リターン値がゼロの場合は、マッピングが存在しないか、あるいは RPC システムがリモート portmap サービスとの交信に失敗したことを意味します。 後者の場合、大域変数 rpc_createerr() は RPC ステータスを含みます。

enum clnt_stat
pmap_rmtcall(addr, prognum, versnum, procnum, inproc, in, outproc, out, tout, portp)
struct sockaddr_in ∗addr;
u_long prognum, versnum, procnum;
char ∗in, ∗out;
xdrproc_t inproc, outproc;
struct timeval tout;
u_long ∗portp;

portmap サービスへのユーザインターフェースで、 IP アドレス ∗addr にあるホスト上の portmap に対して、ユーザの代わりにそのホスト上でプロシージャを呼び出すように 指示します。 パラメータ ∗portp は、プロシージャが成功するとプログラムのポート番号に変更されます。 他のパラメータの定義は、 callrpc() および clnt_call() に説明してあります。 このプロシージャは、“ping” のためだけに使用してください。 clnt_broadcast() も参照してください。

pmap_set(prognum, versnum, protocol, port)
u_long prognum, versnum, protocol;
u_short port;

portmap サービスへのユーザインターフェースで、トリプル [prognum,versnum,protocol] とマシンの portmap サービス上の port との間のマッピングを確立します。 protocol の値は、最も適切なものか、 IPPROTO_TCP です。 このルーチンは、成功すると 1 を返し、失敗するとゼロを返します。 これは、 svc_register() によって自動的に行われます。

pmap_unset(prognum, versnum)
u_long prognum, versnum;

portmap サービスへのユーザインターフェースで、トリプル [prognum,versnum,∗] とマシンの portmap サービス上の ports との間のマッピングを確立します。 このルーチンは、成功すると 1 を返し、失敗するとゼロを返します。

registerrpc(prognum, versnum, procnum, procname, inproc, outproc)
u_long prognum, versnum, procnum;
char ∗(∗procname) () ;
xdrproc_t inproc, outproc;

RPC サービスパッケージでプロシージャ procname を登録します。 プログラム prognum、 バージョン versnum およびプロシージャ procnum についての要求が届いた場合は、 procname はそのパラメータ(1つまたは複数)を指すポインタで呼び出されます。 progname は、その静的な結果(1つまたは複数)を指すポインタを返します。 inproc はパラメータをデコードするために使用され、 outproc は結果をコード化するために使用されます。 このルーチンは、登録が成功した場合はゼロを返し、失敗した場合は −1 を返します。

警告 : この形式で登録されるリモートプロシージャは、 UDP/IP トランスポートを使用してアクセスされます。 制限については、 svcudp_create() を参照してください。

struct rpc_createerr     rpc_createerr;

成功しなかった RPC クライアント作成ルーチンによって値が設定される大域変数です。 原因を表示させるには、ルーチン clnt_pcreateerror() を使用します。

svc_destroy(xprt)
SVCXPRT ∗
xprt;

RPC サービストランスポートハンドル xprt を破壊するマクロです。 破壊には通常、専用データ構造体の割り当て解除が伴います。 xprt の使用は、このルーチンの呼出しの後では未定義です。

fd_set svc_fdset;

RPC サービス側の読み取りファイルディスクリプタビットマスクを反映する 大域変数です。 これは、 select システム呼び出しに対するパラメータとして適切です。 これは、サービスインプリメンタが svc_run() を呼び出さず、独自の非同期イベント処理を行う場合だけ関心をもたれます。 この変数は読み取り専用です(そのアドレスを select !  に渡しません)が、 svc_getreqset() または何らかの作成ルーチンに対する呼出しの後で変化する場合があります。

int svc_fds;

svc_fedset() と同じですが、32ディスクリプタに制限されます。 このインターフェースは、 svc_fdset() によって陳腐化されます。

svc_freeargs(xprt, inproc, in)
SVCXPRT ∗xprt;
xdrproc_t inproc;
char ∗in;

svc_getargs() を使用してサービスプロシージャに対する引数をデコードしたときに RPC/XDR システムが割り当てたあらゆるデータを解放するマクロです。 このルーチンは、結果の解放に成功した場合は 1 を返し、失敗した場合は ゼロを返します。

svc_getargs(xprt, inproc, in)
SVCXPRT ∗xprt;
xdrproc_t inproc;
char ∗in;

RPC サービストランスポートハンドル xprt に関連する RPC 要求の引数をデコードするマクロです。 パラメータ in は、引数が置かれるアドレスです。 inproc は、引数のデコードに使用される XDR ルーチンです。 このルーチンは、デコードが成功した場合は 1 を返し、失敗した場合はゼロを 返します。

struct sockaddr_in ∗
svc_getcaller(xprt)
SVCXPRT ∗xprt;

RPC サービストランスポートハンドル xprt に関連するプロシージャの呼出し側のネットワークアドレスを得るための 承認された方法です。

svc_getreqset(rdfds)
fd_set ∗rdfds;

このルーチンは、サービスインプリメンタが svc_run() を呼び出さず、代わりにカスタム非同期イベント処理を実現する場合だけ 関心をもたれます。 これは、 select システム呼出しが、 RPC 要求が RPC socket (1つまたは複数)に届いたことを確認したときに呼び出されます。 rdfds は、結果として生じる読み取りファイルディスクリプタビットマスクです。 このルーチンは、 rdfds の値に関連するすべてのソケットに対するサービスが終わると戻ります。

svc_getreq(rdfds)
int rdfds;

svc_getreqset() と同じですが、32ディスクリプタに制限されています。 このインターフェースは、 svc_getreqset() によって陳腐化されます。

svc_register(xprt, prognum, versnum, dispatch, protocol)
SVCXPRT ∗xprt;
u_long prognum, versnum;
void (∗dispatch) ();
u_long protocol;

prognum および versnum をサービスディスパッチプロシージャ dispatch と関連させます。 protocol がゼロの場合、このサービスは portmap サービスでは登録されません。 protocol がゼロでない場合、トリプル [prognum,versnum,protocol] の ­xprt−>xp_port に対するマッピングが portmap サービスで確立されます(一般的には protocol はゼロですが、そうでない場合)。 プロシージャ dispatch の形式は下記の通りです。

dispatch(request, xprt)
struct svc_req ∗request;
SVCXPRT ∗xprt;

svc_register() ルーチンは、成功した場合は 1 を返し、失敗した場合はゼロを返します。

svc_run()

このルーチンは、値を返しません。 このルーチンは、 RPC 要求が届くのを待って、1つの要求が届くと svc_getreq() を使用して適切なサービスプロシージャを呼び出します。 このプロシージャは通常、 select() システム呼出しが値を返すのを待っています。

svc_sendreply(xprt, outproc, out)
SVCXPRT ∗xprt;
xdrproc_t outproc;
char ∗out;

リモートプロシージャ呼び出しの結果を送るために、 RPC サービスのディスパッチルーチンによって呼び出されます。 パラメータ xprt は、要求の関連トランスポートハンドルです。 outproc は、結果をコード化するために使用されるルーチンです。 out は結果のアドレスです。 このルーチンは、成功した場合は 1 を、失敗した場合はゼロを返します。

void
svc_unregister(prognum, versnum)
u_long prognum, versnum;

ダブル [prognum,versnum] のディスパッチルーチンに対するマッピング、およびトリプル [prognum,versnum,∗] のポート番号に対するマッピングをすべて削除します。

void
svcerr_auth(xprt, why)
SVCXPRT ∗xprt;
enum auth_stat why;

確認エラーのためにリモートプロシージャの実行を拒絶するサービス ディスパッチルーチンによって呼び出されます。

void
svcerr_decode(xprt)
SVCXPRT ∗xprt;

パラメータのデコードに失敗したサービスディスパッチルーチンによって呼び出されます。 svc_getargs() を参照してください。

void
svcerr_noproc(xprt)
SVCXPRT ∗xprt;

呼び出し側が要求するプロシージャ番号を実現しないサービスディスパッチ ルーチンによって呼び出されます。

void
svcerr_noprog(xprt)
SVCXPRT ∗xprt;

希望するプログラムが RPC パッケージで登録されない場合に呼び出されます。 サービスインプリメンタは通常はこのルーチンを必要としません。

void
svcerr_progvers(xprt)
SVCXPRT ∗xprt;

希望するバージョンのプログラムが RPC パッケージで登録されない場合に呼び出されます。 サービスインプリメンタは通常はこのルーチンを必要としません。

void
svcerr_systemerr(xprt)
SVCXPRT ∗xprt;

特定のプロトコルでカバーされないシステムエラーを検出したときにサービス ディスパッチルーチンによって呼び出されます。 例えば、あるサービスがこれ以上記憶域を割り当てることができない場合、 このルーチンが呼び出されます。

void
svcerr_weakauth(xprt)
SVCXPRT ∗xprt;

(正しいが)不十分な確認パラメータのためにリモートプロシージャの実行を 拒絶するサービスディスパッチルーチンによって呼び出されます。 このルーチンは、 svcerr_auth(xprt, AUTH_TOOWEAK) を呼び出します。

SVCXPRT ∗
svcraw_create()

このルーチンは、トイ RPC サービストランスポートを作成し、それに対してポインタを返します。 トランスポートは実際にはプロセスのアドレス空間内のバッファであるため、 対応する RPC クライアントは同じアドレス空間になければなりません。 clntraw_create() を参照してください。 このルーチンは、カーネルの干渉なしに、 RPC のシミュレーションおよび(往復時間などの) RPC のオーバヘッドの入手を可能にします。 このルーチンは、失敗した場合は ナル を返します。

SVCXPRT ∗
svctcp_create(sock, send_buf_size, recv_buf_size)
int sock;
u_int send_buf_size, recv_buf_size;

このルーチンは、 TCP/IP ベースの RPC サービストランスポートを作成し、それに対してポインタを返します。 トランスポートはソケット sock と関連づけられます。 これは、 RPC_ANYSOCK でも構いませんが、この場合は新しいソケットが作成されます。 ソケットがローカル TCP ポートに結び付けられていない場合は、このルーチンはそれを任意のポートに 結び付けます。 これが完了すると、 ­xprt−>xp_sock がトランスポートのソケットディスクリプタとなり、 ­xprt−>xp_port がトランスポートのポート番号になります。 このルーチンは、失敗した場合は ナル を返します。 TCP ベースの RPC ではバッファ付きの I/O が使用されるため、ユーザはバッファのサイズを指定することができます。 ゼロの値を選択すると、適切なデフォルトが使用されます。

void
svcfd_create(fd, sendsize, recvsize)
int fd;
u_int sendsize;
u_int recvsize;

任意のオープンディスクリプタの上にサービスを作成します。 一般的には、このディスクリプタは TCP などのストリームプロトコルのための接続されたソケットです。 sendsize および recvsize は、送信バッファおよび受信バッファのサイズを示します。 これらがゼロの場合は、適切なデフォルトが選択されます。

SVCXPRT ∗
svcudp_create(sock)
int sock;

このルーチンは、 UDP/IP ベースの RPC サービストランスポートを作成し、それに対してポインタを返します。 トランスポートはソケット sock と関連づけられます。 これは、 RPC_ANYSOCK でも構いませんが、この場合は新しいソケットが作成されます。 ソケットがローカル UDP ポートに結び付けられていない場合は、このルーチンはそれを任意のポートに結び付けます。 これが完了すると、 ­xprt−>xp_sock がトランスポートのソケットディスクリプタとなり、 ­xprt−>xp_port がトランスポートのポート番号になります。 このルーチンは、失敗した場合は ナル を返します。

警告 : UDP ベースの RPC メッセージは最高 8 Kバイトのコードかデータしかもつことができないため、 大きな引数を使ったり莫大な結果を返したりするプロシージャにこの トランスポートを使用することはできません。

user2netname(name, uid, domain)
char ∗name;
int uid;
char ∗domain;

ドメイン固有のユーザ名からオペレーティングシステム独立のネット名に 変換します。 成功した場合は 真 を、失敗した場合は 偽 を返します。 これは、 netname2user() の逆です。

xdr_accepted_reply(xdrs, ar)
XDR ∗xdrs;
struct accepted_reply ∗ar;

RPC 応答メッセージをコード化するために使用されます。 このルーチンは、 RPC パッケージを使わずに RPC スタイルのメッセージを生成することを希望するユーザにとって便利です。

xdr_authunix_parms(xdrs, aupp)
XDR ∗xdrs;
struct authunix_parms ∗aupp;

UNIX credentials を記述するために使用されます。 このルーチンは、 RPC 確認パッケージを使わずにこれらのcredentials を生成することを希望する ユーザにとって便利です。

void
xdr_callhdr(xdrs, chdr)
XDR ∗xdrs;
struct rpc_msg ∗chdr;

RPC 呼び出しヘッダメッセージを記述するために使用されます。 このルーチンは、 RPC パッケージを使わずに RPC スタイルのメッセージを生成することを希望するユーザにとって便利です。

xdr_callmsg(xdrs, cmsg)
XDR ∗xdrs;
struct rpc_msg ∗cmsg;

RPC 呼び出しメッセージを記述するために使用されます。 このルーチンは、 RPC パッケージを使わずに RPC スタイルのメッセージを生成することを希望するユーザにとって便利です。

xdr_opaque_auth(xdrs, ap)
XDR ∗xdrs;
struct opaque_auth ∗ap;

RPC 確認情報メッセージを記述するために使用されます。 このルーチンは、 RPC パッケージを使わずに RPC スタイルのメッセージを生成することを希望するユーザにとって便利です。

xdr_pmap(xdrs, regs)
XDR ∗xdrs;
struct pmap ∗regs;

各種の portmap プロシージャに対するパラメータを記述するために、外部的に使用されます。 このルーチンは、 pmap インターフェースを使わずにこれらのパラメータを生成することを希望する ユーザにとって便利です。

xdr_pmaplist(xdrs, rp)
XDR ∗xdrs;
struct pmaplist ∗∗rp;

ポートマッピングのリストを記述するために、外部的に使用されます。 このルーチンは、 pmap インターフェースを使わずにこれらのパラメータを生成することを希望する ユーザにとって便利です。

xdr_rejected_reply(xdrs, rr)
XDR ∗xdrs;
struct rejected_reply ∗rr;

RPC 応答メッセージを記述するために使用されます。 RPC パッケージを使わずに RPC スタイルのメッセージを生成することを希望するユーザにとって便利です。

xdr_replymsg(xdrs, rmsg)
XDR ∗xdrs;
struct rpc_msg ∗rmsg;

RPC 応答メッセージを記述するために使用されます。 RPC パッケージを使わずに RPC スタイルのメッセージを生成することを希望するユーザにとって便利です。

void
xprt_register(xprt)
SVCXPRT ∗xprt;

After RPC サービストランスポートハンドルが作成されると、それらは自らを RPC パッケージで登録します。 このルーチンは、大域変数 svc_fds() を変更します。 サービスインプリメンタは通常、このルーチンを必要としません。

void
xprt_unregister(xprt)
SVCXPRT ∗xprt;

RPC サービストランスポートハンドルは、破壊される前に、自らを RPC サービスパッケージで登録解除します。 このルーチンは、大域変数 svc_fds() を変更します。 サービスインプリメンタは通常、このルーチンを必要としません。

関連事項

xdr(3N),

NEWS-OSRelease 4.1C

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026