.\" @(#)rpc.3n 2.4 88/08/08 4.0 RPCSRC; from 1.19 88/06/24 SMI .\" $FreeBSD$ .\" .TH RPC 3 "16 February 1988" .SH 名称 rpc \- リモートプロシージャコール用ライブラリルーチン .SH 書式と解説 このルーチンでは、C プログラムを使用して、 ネットワークを通して別のマシンでプロシージャ呼び出しを実行できます。 まずクライアントがプロシージャを呼び出し、 データパケットをサーバに送信します。 パケットを受け取ったサーバは、ディスパッチルーチンを呼び出し、 要求されたサービスを実行してから応答を送り返します。 最後に、プロシージャ呼び出しがクライアントに戻ります。 .LP Secure RPC (DES 認証) に使用するルーチンについては、 .BR rpc_secure (3) で説明します。 Secure RPC は DES 暗号化が使用できる場合にのみ使用できます。 .LP .ft B .nf .sp .5 #include .fi .ft R .br .if t .ne 8 .LP .ft B .nf .sp .5 void auth_destroy(auth) \s-1AUTH\s0 *auth; .fi .ft R .IP .IR auth に関連する認証情報を破壊するマクロです。 一般的に、破壊にはプライベートデータ構造の解放も含まれます。 .BR auth_destroy(\|) を呼び出した後で .I auth を使用した結果は不定になります。 .br .if t .ne 6 .LP .ft B .nf .sp .5 \s-1AUTH\s0 * authnone_create(\|) .fi .ft R .IP 各リモートプロシージャコールで使用できない認証情報を渡す .SM RPC 認証ハンドルを作成して戻します。 .SM RPC は、この認証をデフォルトで使用します。 .if t .ne 10 .LP .ft B .nf .sp .5 \s-1AUTH\s0 * authunix_create(host, uid, gid, len, aup_gids) char *host; int uid, gid, len, *aup.gids; .fi .ft R .IP 認証情報を含む .SM RPC .UX 認証ハンドルを作成して戻します。 パラメータ .I host は、情報を作成するマシンの名前です。 .I uid は、ユーザのユーザ .SM ID です。 .I gid は、ユーザの現行グループ .SM ID です。 .I len と .I aup_gids は、ユーザが属するグループの配列を表します。 あるユーザになりすますことが容易です。 .br .if t .ne 5 .LP .ft B .nf .sp .5 \s-1AUTH\s0 * authunix_create_default(\|) .fi .ft R .IP 適切なパラメータで .B authunix_create(\|) を呼び出します。 .br .if t .ne 13 .LP .ft B .nf .sp .5 callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out) char *host; u_long prognum, versnum, procnum; char *in, *out; xdrproc_t inproc, outproc; .fi .ft R .IP マシン .IR host . で .IR prognum , .IR versnum , および .I procnum に関連するリモートプロシージャを呼び出します。 パラメータ .I in は、プロシージャの引数アドレスで、 .I out は結果を配置するアドレスです。 .I inproc は、プロシージャのパラメータをデコードするために使用し、 .I outproc は、プロシージャの結果をデコードするために使用します。 このルーチンは、問題がなければ 0 を戻し、 問題がある場合は、正数を計算する .B "enum clnt_stat" の値を戻します。 エラーステータスをメッセージに変換するには、ルーチン .B clnt_perrno(\|) が便利です。 .IP 警告: このルーチンでリモートプロシージャを呼び出す場合は、 .SM UDP/IP がトランスポート層として使用されます。 制限事項については、 .B clntudp_create(\|) を参照してください。 このルーチンを使用した場合、タイムアウトや認証は制御できません。 .br .if t .ne 16 .LP .ft B .nf .sp .5 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; .fi .ft R .IP ローカルで接続されているすべてのブロードキャストネットに 呼び出しメッセージがブロードキャストされることを除けば、 .BR callrpc(\|) , と同じです。 このルーチンは、応答を受け取るたびに、以下の形式の .BR eachresult(\|) を呼び出します。 .IP .RS 1i .ft B .nf eachresult(out, addr) char *out; struct sockaddr_in *addr; .ft R .fi .RE .IP .I out は、リモートプロシージャの出力がデコードされることを除けば、 .BR clnt_broadcast(\|) に渡される .I out と同じです。 .I addr は、結果を送信するマシンのアドレスを指します。 .B eachresult(\|) が 0 を戻す場合、 .B clnt_broadcast(\|) は次の応答を待ちます。 0 を戻さない場合は、適切なステータスで戻ります。 .IP 警告: ブロードキャストソケットのサイズは、 データリンクの最大転送単位に制限されています。 イーサネットの場合、この値は 1500 バイトです。 .br .if t .ne 13 .LP .ft B .nf .sp .5 enum clnt_stat clnt_call(clnt, procnum, inproc, in, outproc, out, tout) \s-1CLIENT\s0 *clnt; u_long procnum; xdrproc_t inproc, outproc; char *in, *out; struct timeval tout; .fi .ft R .IP .BR clnt_create(\|) などの .SM RPC クライアント作成ルーチンで入手した、クライアントハンドル .IR clnt に関連するリモートプロシージャ .I procnum を呼び出すマクロです。 パラメータ .I in はプロシージャの引数のアドレスで、 .I out は結果を配置するアドレスです。 .I inproc はプロシージャのパラメータのデコードに使用し、 .I outproc はプロシージャの結果のデコードに使用します。 .I tout は、結果が戻るまでの時間です。 .br .if t .ne 7 .LP .ft B .nf .sp .5 clnt_destroy(clnt) \s-1CLIENT\s0 *clnt; .fi .ft R .IP クライアントの .SM RPC ハンドルを破壊するマクロです。 通常の場合、破壊には、 .I clnt も含めたプライベートデータ構造の解放も含まれます。 .BR clnt_destroy(\|) を呼び出した後で .I clnt を使用した結果は不定になります。 .SM RPC ライブラリが関連ソケットを開いた場合はそれも閉じます。 関連ソケットを開いていない場合、ソケットは開いたまま残ります。 .br .if t .ne 10 .LP .ft B .nf .sp .5 \s-1CLIENT\s0 * clnt_create(host, prog, vers, proto) char *host; u_long prog, vers; char *proto; .fi .ft R .IP 一般的なクライアント作成ルーチンです。 .I host は、サーバが配置されているリモートホストの名前を指定します。 .I proto は、使用する転送プロトコルの種類を指定します。 このフィールドで現在サポートされている値は、 \(lqudp\(rq と \(lqtcp\(rq です。 タイムアウトはデフォルトが設定されていますが、 .BR clnt_control(\|) を使用して修正できます。 .IP 警告: .SM UDP の使用には短所があります。 .SM UDP ベースの .SM RPC メッセージは、 8 キロバイトのエンコード済みデータまでしか維持できないので、 大きな引数を取るプロシージャや、 大きな結果を戻すプロシージャでは使用できません。 .br .if t .ne 10 .LP .ft B .nf .sp .5 bool_t clnt_control(cl, req, info) \s-1CLIENT\s0 *cl; char *info; .fi .ft R .IP クライアントオブジェクトのさまざまな情報の変更や取り出しを行うマクロです。 .I req はオペレーションのタイプを指定し、 .I info は情報のポインタです。 .SM UDP と .SM TCP\s0 の両方でサポートされている .I req の値、引数タイプ、実行内容は以下の通りです。 .IP .nf .ta +2.0i +2.0i +2.0i .SM CLSET_TIMEOUT\s0 struct timeval 総タイムアウトの設定 .SM CLGET_TIMEOUT\s0 struct timeval 総タイムアウトの入手 .fi .IP 注意: タイムアウトを .BR clnt_control(\|) で設定すると、 .B clnt_call(\|) に渡されるタイムアウトパラメータは、 後のすべての呼び出しで無視されます。 .IP .nf .SM CLGET_SERVER_ADDR\s0 struct sockaddr_in サーバのアドレスの入手 .fi .br .IP 以下のオペレーションは .SM UDP のみで有効です。 .IP .nf .ta +2.0i +2.0i +2.0i .SM CLSET_RETRY_TIMEOUT\s0 struct timeval 再試行タイムアウトの設定 .SM CLGET_RETRY_TIMEOUT\s0 struct timeval 再試行タイムアウトの入手 .fi .br .IP 再試行タイムアウトは、サーバが応答してから要求を再送することを .SM "UDP RPC" が待機する時間です。 .br .if t .ne 10 .LP .ft B .nf .sp .5 clnt_freeres(clnt, outproc, out) \s-1CLIENT\s0 *clnt; xdrproc_t outproc; char *out; .fi .ft R .IP .SM RPC/XDR システムが .SM RPC 呼び出しの結果をデコードする場合に割り振ったデータを解放するマクロです。 パラメータ .I out は結果のアドレスで、 .I outproc は結果を記述する .SM XDR ルーチンです。 このルーチンは、結果が問題なく解放された場合は 1 を戻し、 問題が発生した場合は 0 を戻します。 .br .if t .ne 6 .LP .ft B .nf .sp .5 void clnt_geterr(clnt, errp) \s-1CLIENT\s0 *clnt; struct rpc_err *errp; .fi .ft R .IP クライアントハンドルのエラー構造を、アドレス .IR errp の構造体にコピーするマクロです。 .br .if t .ne 8 .LP .ft B .nf .sp .5 void clnt_pcreateerror(s) char *s; .fi .ft R .IP クライアント .SM RPC ハンドルを作成できない理由を表すメッセージを標準エラーに出力します。 メッセージの最初には、文字列 .I s とコロンが付きます。 これは、 .BR clnt_create(\|) , .BR clntraw_create(\|) , .BR clnttcp_create(\|) , または .B clntudp_create(\|) がエラーとなった場合に使用します。 .br .if t .ne 8 .LP .ft B .nf .sp .5 void clnt_perrno(stat) enum clnt_stat stat; .fi .ft R .IP .IR stat が示す条件に対応するメッセージを標準エラーに出力します。 .BR callrpc(\|) の後で使用してください。 .br .if t .ne 8 .LP .ft B .nf .sp .5 clnt_perror(clnt, s) \s-1CLIENT\s0 *clnt; char *s; .fi .ft R .IP .SM RPC 呼び出しがエラーになった理由を示すメッセージを標準エラーに出力します。 .I clnt は、呼び出しの実行に使用したハンドルです。 メッセージ最初には、文字列 .I s とコロンが付きます。 .BR clnt_call(\|) の後で使用してください。 .br .if t .ne 9 .LP .ft B .nf .sp .5 char * clnt_spcreateerror char *s; .fi .ft R .IP 標準エラーに出力する代わりに文字列を戻すことを除けば、 .BR clnt_pcreateerror(\|) と同じです。 .IP バグ: 各呼び出しで上書きされた静的データのポインタを戻します。 .br .if t .ne 9 .LP .ft B .nf .sp .5 char * clnt_sperrno(stat) enum clnt_stat stat; .fi .ft R .IP .BR clnt_perrno(\|) と同じ引数を取りますが、 .SM RPC 呼び出しがエラーになった理由を示すメッセージを標準エラーに送信する代わりに、 メッセージを含む文字列のポインタを戻します。 文字列は改行で終わります。 .IP プログラムに標準エラーがない場合 (サーバとして実行しているプログラムには標準エラーがないことが多い)、 またはメッセージを .BR printf で出力する必要がない場合、 あるいは .B clnt_perrno(\|) がサポートするもの以外のメッセージフォーマットを使用する場合は、 .B clnt_perrno(\|) の代わりに .B clnt_sperrno(\|) を使用します。 .B clnt_sperror(\|) と .BR clnt_spcreaterror(\|) とは異なり、 .B clnt_sperrno(\|) は静的データのポインタを戻しますが、 結果は各呼び出しで上書きされないことに注意してください。 .br .if t .ne 7 .LP .ft B .nf .sp .5 char * clnt_sperror(rpch, s) \s-1CLIENT\s0 *rpch; char *s; .fi .ft R .IP .BR clnt_sperrno(\|) と同じように、標準エラーに出力せずに文字列を戻すことを除けば、 .BR clnt_perror(\|) と同じです。 .IP バグ: 各呼び出しで上書きされた静的データのポインタを戻します。 .br .if t .ne 10 .LP .ft B .nf .sp .5 \s-1CLIENT\s0 * clntraw_create(prognum, versnum) u_long prognum, versnum; .fi .ft R .IP リモートプログラム .IR prognum , バージョン .IR versnum のトイ .SM RPC クライアントを作成します。 サービスにメッセージを渡す実際のトランスポートは、 プロセスのアドレススペース内にあるバッファなので、 対応する .SM RPC サーバは同じアドレススペースに存在する必要があります。 .BR svcraw_create(\|) を参照してください。 これにより、 .SM RPC のシミュレーション、およびラウンドトリップタイムなど、 .SM RPC オーバヘッドの取得をカーネルの干渉なしに実行できます。 このルーチンは、エラーが発生すると .SM NULL を戻します。 .br .if t .ne 15 .LP .ft B .nf .sp .5 \s-1CLIENT\s0 * clnttcp_create(addr, prognum, versnum, sockp, sendsz, recvsz) struct sockaddr_in *addr; u_long prognum, versnum; int *sockp; u_int sendsz, recvsz; .fi .ft R .IP リモートプログラム .IR prognum , バージョン .IR versnum の .SM RPC クライアントを作成します。 クライアントは、トランスポートとして .SM TCP/IP を使用します。 リモートプログラムは、インターネットアドレス .IR *addr にあります。 .\"The following in-line font conversion is necessary for the hyphen indicator \fB\%addr\->sin_port\fR が 0 である場合は、 リモートプログラムが注意を向ける実際のポートに設定されます。 ( .B portmap サービスはこの情報で調べられます)。 パラメータ .I sockp はソケットです。このパラメータが .BR \s-1RPC_ANYSOCK\s0 である場合、このルーチンは新しいソケットを開いて .IR sockp を設定します。 .SM TCP\s0 ベースの .SM RPC はバッファによる .SM I/O を使用するので、ユーザはパラメータ .I sendsz と .IR recvsz で送信バッファと受信バッファのサイズを指定できます。 値を 0 にすると、適切なデフォルトが選択されます。 このルーチンは、エラーになると .SM NULL を戻します。 .br .if t .ne 15 .LP .ft B .nf .sp .5 \s-1CLIENT\s0 * clntudp_create(addr, prognum, versnum, wait, sockp) struct sockaddr_in *addr; u_long prognum, versnum; struct timeval wait; int *sockp; .fi .ft R .IP リモートプログラム .IR prognum , バージョン .IR versnum の .SM RPC クライアントを作成します。 クライアントは、トランスポートとして .SM UDP/IP を使用します。 リモートプログラムは、インターネットアドレス .IR addr にあります。 \fB\%addr\->sin_port\fR が 0 である場合は、 リモートプログラムが注意を向ける実際のポートに設定されます (リモート .B portmap サービスは、この情報で調べられます)。 パラメータ .I sockp はソケットです。 このパラメータが .BR \s-1RPC_ANYSOCK\s0 である場合、このルーチンは新しいソケットを開いて .IR sockp を設定します。 .SM UDP トランスポートは、応答を受け取るまで、 または呼び出しがタイムアウトになるまで、 .B wait 時間間隔で呼び出しメッセージを再送信します。 呼び出しがタイムアウトとなる時間は、 .BR clnt_call(\|) で指定します。 .IP 警告: .SM UDP ベースの .SM RPC メッセージは、 8 キロバイトのエンコード済みデータまでしか維持できないので、 大きな引数を取るプロシージャや 大きな結果を戻すプロシージャでは使用できません。 .br .if t .ne 8 .LP .ft B .nf .sp .5 \s-1CLIENT\s0 * clntudp_bufcreate(addr, prognum, versnum, wait, sockp, sendsize, recosize) struct sockaddr_in *addr; u_long prognum, versnum; struct timeval wait; int *sockp; unsigned int sendsize; unsigned int recosize; .fi .ft R .IP リモートプログラム .IR prognum , バージョン .IR versnum の .SM RPC クライアントを作成します。 クライアントは、トランスポートとして .SM UDP/IP を使用します。 リモートプログラムは、インターネットアドレス .IR addr にあります。 \fB\%addr\->sin_port\fR が 0 である場合は、 リモートプログラムが注意を向ける実際のポートに設定されます (リモート .B portmap サービスは、この情報で調べられます)。 パラメータ .I sockp はソケットです。このパラメータが .BR \s-1RPC_ANYSOCK\s0 である場合、このルーチンは新しいソケットを開いて .BR sockp を設定します。 .SM UDP トランスポートは、応答を受け取るまで、 または呼び出しがタイムアウトになるまで .B wait 時間間隔で呼び出しメッセージを再送信します。 呼び出しがタイムアウトになる時間は、 .BR clnt_call(\|) で指定します。 .IP ユーザは、 .SM UDP ベースの .SM RPC メッセージの送受信を行う、最大パケットサイズを指定できます。 .br .if t .ne 7 .LP .ft B .nf .sp .5 int get_myaddress(addr) struct sockaddr_in *addr; .fi .ft R .IP .BR /etc/hosts を処理するライブラリルーチンを参考にせず、マシンの .SM IP アドレスを .IR *addr に入れます。ポート番号は、常に .BR htons(\s-1PMAPPORT\s0) に設定されます。 問題がない場合は 0 を戻し、問題がある場合は 0 以外を戻します。 .br .if t .ne 10 .LP .ft B .nf .sp .5 struct pmaplist * pmap_getmaps(addr) struct sockaddr_in *addr; .fi .ft R .IP .B portmap サービスのユーザインタフェースで、 .SM IP アドレス .IR *addr にあるホストの .SM RPC プログラムとポートの現行のマッピングのリストを戻します。 このルーチンは .SM NULL を戻すことがあります。 コマンド .RB ` "rpcinfo \-p" ' はこのルーチンを使用します。 .br .if t .ne 12 .LP .ft B .nf .sp .5 u_short pmap_getport(addr, prognum, versnum, protocol) struct sockaddr_in *addr; u_long prognum, versnum, protocol; .fi .ft R .IP .B portmap サービスのユーザインタフェースで、 プログラム番号 .IR prognum , バージョン .IR versnum をサポートするサービスを待ち、 .IR protocol に関連する転送プロトコルを表すポート番号を戻します。 .I protocol の値は、ほとんどの場合 .B .SM IPPROTO_UDP か .BR \s-1IPPROTO_TCP\s0 です。マッピングが存在しない場合、または .SM RPC システムがリモート .B portmap サービスと接触できない場合、戻り値は 0 になります。 .SM RPC システムがリモート .B portmap サービスと接触できない場合、グローバル変数 .B rpc_createerr(\|) には .SM RPC ステータスが入ります。 .br .if t .ne 15 .LP .ft B .nf .sp .5 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; .fi .ft R .IP .B portmap サービスのユーザインタフェースで、 .SM IP アドレス .I *addr のホストのプロシージャを .SM RPC 呼び出しにするように、そのホストの .B portmap に命令します。 プロシージャで問題が発生しない場合、パラメータ .I *portp はプログラムのポート番号に修正されます。 その他のパラメータについては、 .B callrpc(\|) と .BR clnt_call(\|) を参照してください このプロシージャは、\(lqping\(rq 以外で使用することはありません。 .BR clnt_broadcast(\|) も参照してください。 .br .if t .ne 9 .LP .ft B .nf .sp .5 pmap_set(prognum, versnum, protocol, port) u_long prognum, versnum, protocol; u_short port; .fi .ft R .IP .B portmap サービスのユーザインタフェースで、 .RI [ prognum , versnum , protocol\fR] の 3 つ、およびマシンの .B portmap サービスでの .I port の間にマッピングを確立します。 .I protocol の値は、ほとんどの場合 .B .SM IPPROTO_UDP か .BR \s-1IPPROTO_TCP\s0 です。 このルーチンは問題がないと 1 を戻し、問題がある場合は 0 を戻します。 これは、 .BR svc_register(\|) で自動的に実行されます。 .br .if t .ne 7 .LP .ft B .nf .sp .5 pmap_unset(prognum, versnum) u_long prognum, versnum; .fi .ft R .IP .B portmap サービスのユーザインタフェースで、 .RI [ prognum , versnum , *\fR] の 3 つ、および .B portmap サービスでの .B port の間に存在するマッピングをすべて破壊します。 このルーチンは、問題がなければ 1 を戻し、問題がある場合は 0 を戻します。 .br .if t .ne 15 .LP .ft B .nf .sp .5 registerrpc(prognum, versnum, procnum, procname, inproc, outproc) u_long prognum, versnum, procnum; char *(*procname) (\|) ; xdrproc_t inproc, outproc; .fi .ft R .IP .SM RPC サービスパッケージでプロシージャ .I procname を登録します。 プログラム .IR prognum , バージョン .IR versnum , プロシージャ .IR procnum が要求されると、パラメータのポインタで .I procname が呼び出されます。 .I progname は、静的結果のポインタを戻します。 .I inproc はパラメータのデコードに使用され、 .I outproc は結果のエンコードに使用されます。 このルーチンは、登録で問題が発生しなければ 0 を戻し、 問題が発生したら \-1 を戻します。 .IP 警告: この形式で登録されたリモートプロシージャは、 .SM UDP/IP トランスポートでアクセスされます。 制限事項については .B svcudp_create(\|) を参照してください。 .br .if t .ne 5 .LP .ft B .nf .sp .5 struct rpc_createerr rpc_createerr; .fi .ft R .IP エラーになった .SM RPC クライアント作成ルーチンで値が設定されるグローバル変数です。 エラーの原因を出力するには、ルーチン .B clnt_pcreateerror(\|) を使用します。 .if t .ne 7 .LP .ft B .nf .sp .5 svc_destroy(xprt) \s-1SVCXPRT\s0 * xprt; .fi .ft R .IP .SM RPC サービス転送ハンドル .IR xprt を破壊するマクロです。 一般的に破壊処理には、 .I xprt も含むプライベートデータ構造の解放も含まれます。 このルーチンを呼び出した後で .I xprt を使用した結果は不定となります。 .br .if t .ne 8 .LP .ft B .nf .sp .5 fd_set svc_fdset; .fi .ft R .IP .SM RPC サービスサイドの読み込みファイル記述子ビットマスクを表すグローバル変数です。 .B select システムコールのテンプレートパラメータとして最適です。 サービスの設計者が .BR svc_run(\|) を呼び出さず、非同期のイベント処理を行う場合のみに重要です。 この変数は読み込み専用ですが (アドレスを .BR select に渡しませんが)、 .B svc_getreqset(\|) か作成ルーチンを呼び出した後で変更できます。 .br .BR FD_SETSIZE を越える記述子の制限がプロセスにある場合、この変数は .BR FD_SETSIZE 記述子でしか使用できないことに注意してください。 .br .if t .ne 6 .LP .ft B .nf .sp .5 int svc_fds; .fi .ft R .IP .BR svc_fedset(\|) に似ていますが、32 個の記述子に制限されています。 このインターフェースは .BR svc_fdset(\|) で置き換えられました。 .br .if t .ne 9 .LP .ft B .nf .sp .5 svc_freeargs(xprt, inproc, in) \s-1SVCXPRT\s0 *xprt; xdrproc_t inproc; char *in; .fi .ft R .IP .SM RPC/XDR システムが .BR svc_getargs(\|) を使用して引数をサービスプロシージャにデコードした場合に 割り振ったデータを解放するマクロです。 このルーチンは、結果が問題なく解放されると 1 を戻し、 問題が発生した場合は 0 を戻します。 .br .if t .ne 10 .LP .ft B .nf .sp .5 svc_getargs(xprt, inproc, in) \s-1SVCXPRT\s0 *xprt; xdrproc_t inproc; char *in; .fi .ft R .IP .SM RPC サービス転送ハンドル .IR xprt に関連した .SM RPC 要求の引数をデコードするマクロです。 パラメータ .I in は、引数を配置する場所のアドレスです。 .I inproc は、引数をデコードする .SM XDR ルーチンです。 このルーチンは、デコードで問題が発生しなければ 1 を戻し、 問題が発生した場合は 0 を戻します。 .br .if t .ne 9 .LP .ft B .nf .sp .5 struct sockaddr_in * svc_getcaller(xprt) \s-1SVCXPRT\s0 *xprt; .fi .ft R .IP .SM RPC サービス転送ハンドル .IR xprt に関連するプロシージャの呼び出し側の ネットワークアドレスを入手する確実な方法です。 .br .if t .ne 9 .LP .ft B .nf .sp .5 svc_getreqset(rdfds) fd_set *rdfds; .fi .ft R .IP このルーチンは、サービスの設計者が .BR svc_run(\|) を呼び出さず、独自の非同期イベント処理を実現する場合にのみ重要です。 .SM RPC 要求が .SM RPC ソケットに到着したと .B select システムコールが判断した場合に呼び出されます。 .I rdfds は、作成された読み込み記述子ビットマスクです。 このルーチンは、 .I rdfds の値に関連したすべてのソケットサービスを受けた場合に戻ります。 .br .if t .ne 6 .LP .ft B .nf .sp .5 svc_getreq(rdfds) int rdfds; .fi .ft R .IP .BR svc_getreqset(\|) に似ていますが、32 個の記述子に制限されています。 このインタフェースは .BR svc_getreqset(\|) で置き換えられました。 .br .if t .ne 17 .LP .ft B .nf .sp .5 svc_register(xprt, prognum, versnum, dispatch, protocol) \s-1SVCXPRT\s0 *xprt; u_long prognum, versnum; void (*dispatch) (\|); u_long protocol; .fi .ft R .IP .I prognum と .I versnum をサービスディスパッチプロシージャ .IR dispatch に関連付けます。 .I protocol が 0 である場合、サービスは .B portmap サービスで登録されません。 .I protocol が 0 以外である場合、 .RI [ prognum , versnum , protocol\fR] の 3 つと \fB\%xprt\->xp_port\fR のマッピングがローカル .B portmap サービスで確立されます (一般的に .I protocol は 0 か .B .SM IPPROTO_UDP か .B .SM IPPROTO_TCP です)。 プロシージャ .I dispatch の形式は以下の通りです。 .RS 1i .ft B .nf dispatch(request, xprt) struct svc_req *request; \s-1SVCXPRT\s0 *xprt; .ft R .fi .RE .IP .B svc_register(\|) ルーチンは、問題がなければ 1 を戻し、問題がある場合は 0 を戻します。 .br .if t .ne 6 .LP .ft B .nf .sp .5 svc_run(\|) .fi .ft R .IP このルーチンは戻りません。 .SM RPC 要求の到着を待ち、到着すると .B svc_getreq(\|) を使用して適切なサービスプロシージャを呼び出します。 通常の場合、このプロシージャは、 .B select(\|) システムコールが戻るのを待ちます。 .br .if t .ne 9 .LP .ft B .nf .sp .5 svc_sendreply(xprt, outproc, out) \s-1SVCXPRT\s0 *xprt; xdrproc_t outproc; char *out; .fi .ft R .IP .SM RPC サービスのディスパッチルーチンで呼び出され、 リモートプロシージャコールの結果を送信します。 パラメータ .I xprt は要求の関連転送ハンドルです。 .I outproc は、結果のエンコードに使用する .SM XDR ルーチンです。 .I out は結果のアドレスです。 このルーチンは、問題がなければ 1 を戻し、問題がある場合は 0 を戻します。 .br .if t .ne 7 .LP .ft B .nf .sp .5 void svc_unregister(prognum, versnum) u_long prognum, versnum; .fi .ft R .IP .RI [ prognum , versnum ] の 2 つとディスパッチルーチンのマッピング、および .RI [ prognum , versnum , *\fR] の 3 つとポート番号のマッチングをすべて削除します。 .br .if t .ne 9 .LP .ft B .nf .sp .5 void svcerr_auth(xprt, why) \s-1SVCXPRT\s0 *xprt; enum auth_stat why; .fi .ft R .IP 認証エラーのために、リモートプロシージャコールの実行を拒否する サービスディスパッチルーチンが呼び出します。 .br .if t .ne 7 .LP .ft B .nf .sp .5 void svcerr_decode(xprt) \s-1SVCXPRT\s0 *xprt; .fi .ft R .IP パラメータを問題なくデコードできない サービスディスパッチルーチンが呼び出します。 .BR svc_getargs(\|) も参照してください。 .br .if t .ne 7 .LP .ft B .nf .sp .5 void svcerr_noproc(xprt) \s-1SVCXPRT\s0 *xprt; .fi .ft R .IP 呼び出し側が要求したプロシージャ番号を 実現しないサービスディスパッチルーチンが呼び出します。 .br .if t .ne 7 .LP .ft B .nf .sp .5 void svcerr_noprog(xprt) \s-1SVCXPRT\s0 *xprt; .fi .ft R .IP 目的のプログラムが .SM RPC パッケージで登録されていない場合に呼び出されます。 サービスの設計者には、通常の場合このルーチンは必要ありません。 .br .if t .ne 7 .LP .ft B .nf .sp .5 void svcerr_progvers(xprt) \s-1SVCXPRT\s0 *xprt; .fi .ft R .IP プログラムの目的のバージョンが .SM RPC パッケージで登録されていない場合に呼び出されます。 サービスの設計者には、通常の場合このルーチンは必要ありません。 .br .if t .ne 7 .LP .ft B .nf .sp .5 void svcerr_systemerr(xprt) \s-1SVCXPRT\s0 *xprt; .fi .ft R .IP サービスディスパッチルーチンが、 特定プロトコルでカバーされていないシステムエラーを検出した場合に呼び出します。 たとえばサービスが記憶域を割り振れない場合は、 このルーチンが呼び出されます。 .br .if t .ne 8 .LP .ft B .nf .sp .5 void svcerr_weakauth(xprt) \s-1SVCXPRT\s0 *xprt; .fi .ft R .IP 認証パラメータが足りないために、 リモートプロシージャコールの実行を拒否する サービスディスパッチルーチンが呼び出します。 このルーチンは、 .BR "svcerr_auth(xprt, \s-1AUTH_TOOWEAK\s0)" を呼び出します。 .br .if t .ne 11 .LP .ft B .nf .sp .5 \s-1SVCXPRT\s0 * svcraw_create(\|) .fi .ft R .IP ポインタを戻すためのトイ .SM RPC クライアントを作成します。 実際のトランスポートは、 プロセスのアドレススペース内にあるバッファなので、対応する .SM RPC クライアントは同じアドレススペースに存在する必要があります。 .BR clntraw_create(\|) を参照してください。 このルーチンにより、 .SM RPC のシミュレーション、およびラウンドトリップタイムなど、 .SM RPC オーバヘッドの取得をカーネルの干渉なしに実行できます。 このルーチンは、エラーが発生すると .SM NULL を戻します。 .br .if t .ne 11 .LP .ft B .nf .sp .5 \s-1SVCXPRT\s0 * svctcp_create(sock, send_buf_size, recv_buf_size) int sock; u_int send_buf_size, recv_buf_size; .fi .ft R .IP ポインタを戻す、 .SM TCP/IP ベースの .SM RPC サービストランスポートを作成します。 トランスポートにはソケット .IR sock が関連します。ソケットが .BR \s-1RPC_ANYSOCK\s0 である場合は、新しいソケットが作成されます。 ソケットがローカル .SM TCP ポートに結合していない場合、 このルーチンはソケットを任意のポートに結合します。処理が終わると、 \fB\%xprt\->xp_sock\fR はトランスポートのソケット記述子になり、 \fB\%xprt\->xp_port\fR はトランスポートのポート番号になります。 このルーチンは、エラーが発生すると .SM NULL を戻します。 .SM TCP ベースの .SM RPC バッファによる .SM I/O を使用するので、ユーザはバッファサイズを指定できます。 値を 0 にすると、適切なデフォルトが選択されます。 .br .if t .ne 11 .LP .ft B .nf .sp .5 \s-1SVCXPRT\s0 * svcfd_create(fd, sendsize, recvsize) int fd; u_int sendsize; u_int recvsize; .fi .ft R .IP 開いている記述子の最上位にサービスを作成します。 一般的にこの記述子は、 .SM TCP\s0 などのストリームプロトコルの接続済みソケットです。 .I sendsize と .I recvsize は、送信バッファと受信バッファのサイズを指定します。 このサイズが 0 である場合は、適切なデフォルトが選択されます。 .br .if t .ne 10 .LP .ft B .nf .sp .5 \s-1SVCXPRT\s0 * svcudp_bufcreate(sock, sendsize, recosize) int sock; .fi .ft R .IP ポインタを戻す .SM UDP/IP\s0 ベースの .SM RPC サービストランスポートを作成します。 トランスポートにはソケット .IR sock が関連します。ソケットが .B \s-1RPC_ANYSOCK\s0 である場合は、新しいソケットが作成されます。 ソケットがローカル .SM UDP ポートに結合していない場合、 このルーチンはソケットを任意のポートに結合します。 処理が終わると、 \fB\%xprt\->xp_sock\fR はトランスポートのソケット記述子になり、 \fB\%xprt\->xp_port\fR はトランスポートのポート番号になります。 このルーチンは、エラーが発生すると .SM NULL を戻します。 .IP これにより、ユーザは、 .SM UDP\s0 ベースの送信 .SM RPC メッセージと受信メッセージの最大パケットサイズを指定できます。 .br .if t .ne 7 .LP .ft B .nf .sp .5 xdr_accepted_reply(xdrs, ar) \s-1XDR\s0 *xdrs; struct accepted_reply *ar; .fi .ft R .IP .SM RPC 応答メッセージのエンコードに使用します。 このルーチンでは、 .SM RPC パッケージを使用せずに、 \s-1RPC\s0 スタイルのメッセージを作成する場合に便利です。 .br .if t .ne 7 .LP .ft B .nf .sp .5 xdr_authunix_parms(xdrs, aupp) \s-1XDR\s0 *xdrs; struct authunix_parms *aupp; .fi .ft R .IP .SM UNIX 証明書の記述に使用します。 このルーチンは、 .SM RPC 認証パッケージを使用せずに、証明書を作成する場合に便利です。 .br .if t .ne 7 .LP .ft B .nf .sp .5 void xdr_callhdr(xdrs, chdr) \s-1XDR\s0 *xdrs; struct rpc_msg *chdr; .fi .ft R .IP .SM RPC コールヘッダメッセージの記述に使用します。 このルーチンでは、 .SM RPC パッケージを使用せずに、 .SM RPC\s0 スタイルのメッセージを作成する場合に便利です。 .br .if t .ne 7 .LP .ft B .nf .sp .5 xdr_callmsg(xdrs, cmsg) \s-1XDR\s0 *xdrs; struct rpc_msg *cmsg; .fi .ft R .IP .SM RPC コールメッセージの記述に使用します。 このルーチンは、 .SM RPC パッケージを使用せずに、 .SM RPC\s0 スタイルのメッセージを作成する場合に便利です。 .br .if t .ne 7 .LP .ft B .nf .sp .5 xdr_opaque_auth(xdrs, ap) \s-1XDR\s0 *xdrs; struct opaque_auth *ap; .fi .ft R .IP .SM RPC 認証情報メッセージの記述に使用します。 このルーチンでは、 .SM RPC パッケージを使用せずに、 .SM RPC\s0 スタイルのメッセージを作成する場合に便利です。 .br .if t .ne 7 .LP .ft B .nf .sp .5 xdr_pmap(xdrs, regs) \s-1XDR\s0 *xdrs; struct pmap *regs; .fi .ft R .IP さまざまな .B portmap プロシージャのパラメータの記述に外部的に使用します。 このルーチンは、 .B pmap インタフェースを使用せずに、このパラメータを作成する場合に便利です。 .br .if t .ne 7 .LP .ft B .nf .sp .5 xdr_pmaplist(xdrs, rp) \s-1XDR\s0 *xdrs; struct pmaplist **rp; .fi .ft R .IP ポートマッピングのリストの記述に外部的に使用します。 このルーチンは、 .B pmap インタフェースを使用せずに、このパラメータを作成する場合に便利です。 .br .if t .ne 7 .LP .ft B .nf .sp .5 xdr_rejected_reply(xdrs, rr) \s-1XDR\s0 *xdrs; struct rejected_reply *rr; .fi .ft R .IP .SM RPC 応答メッセージの記述に使用します。 このルーチンは .SM RPC パッケージを使用せずに、 .SM RPC\s0 スタイルのメッセージを作成する場合に便利です。 .br .if t .ne 8 .LP .ft B .nf .sp .5 xdr_replymsg(xdrs, rmsg) \s-1XDR\s0 *xdrs; struct rpc_msg *rmsg; .fi .ft R .IP .SM RPC 応答メッセージの記述に使用します。 このルーチンは .SM RPC パッケージを使用せずに、 .SM RPC スタイルのメッセージを作成する場合に便利です。 .br .if t .ne 8 .LP .ft B .nf .sp .5 void xprt_register(xprt) \s-1SVCXPRT\s0 *xprt; .fi .ft R .IP .SM RPC サービストランスポートハンドルが作成されたら、 .SM RPC サービスパッケージで登録する必要があります。 このルーチンは、グローバル変数 .BR svc_fds(\|) を修正します。サービスの設計者には、 通常の場合このルーチンは必要ありません。 .br .if t .ne 8 .LP .ft B .nf .sp .5 void xprt_unregister(xprt) \s-1SVCXPRT\s0 *xprt; .fi .ft R .IP .SM RPC サービストランスポートハンドルを破壊する前には、 .SM RPC サービスパッケージで登録を解除する必要があります。 このルーチンは、グローバル変数 .BR svc_fds(\|) を修正します。サービスの設計者には、 通常の場合このルーチンは必要ありません。 .SH SEE ALSO .BR rpc_secure (3), .BR xdr (3) .br 以下のマニュアル: .RS .ft I Remote Procedure Calls: Protocol Specification .br Remote Procedure Call Programming Guide .br rpcgen Programming Guide .br .ft R .RE .IR "\s-1RPC\s0: Remote Procedure Call Protocol Specification" , .SM RFC1050, Sun Microsystems, Inc., .SM USC-ISI\s0.