.\" This page was taken from the 4.4BSD-Lite CDROM (BSD license) .\" .\" %%%LICENSE_START(BSD_ONELINE_CDROM) .\" This page was taken from the 4.4BSD-Lite CDROM (BSD license) .\" %%%LICENSE_END .\" .\" @(#)rpc.3n 2.4 88/08/08 4.0 RPCSRC; from 1.19 88/06/24 SMI .\" .\" 2007-12-30, mtk, Convert function prototypes to modern C syntax .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .\" .\" Japanese Version Copyright (c) 1999 HANATAKA Shinya .\" all rights reserved. .\" Translated Tue Jan 4 20:48:23 JST 2000 .\" by HANATAKA Shinya .\" Updated & Modified Sun Oct 21 01:07:09 JST 2001 .\" by Yuichi SATO .\" .TH RPC 3 2013\-09\-26 "" "Linux Programmer's Manual" .SH 名前 rpc \- 遠隔手続き呼び出し(RPC)のためのライブラリルーティン .SH 書式と説明 .\" .LP .\" We don't have an rpc_secure.3 page at the moment -- MTK, 19 Sep 05 .\" Routines that are used for Secure RPC (DES authentication) are described in .\" .BR rpc_secure (3). .\" Secure RPC can be used only if DES encryption is available. これらのルーティンは C プログラムでネットワークを通して 他のマシンにアクセスするプロシージャーを作成することを可能にする。 最初にクライアントはデータパケットをサーバに送るために プロシージャーを呼び出す。 サーバはパケットを受け取ると、配分ルーチンを呼び出して 要求されたサービスに実行し、返答を送り返す。 最後にプロシージャーコールはクライアントへと戻る。 .LP これらのルーティンを使用するには、ヘッダーファイル \fI\fP をインクルードすること。 下記のプロトタイプでは次の型を使用している。 .in +4n .nf \fBtypedef int \fP\fIbool_t\fP\fB;\fP \fBtypedef bool_t (*\fP\fIxdrproc_t\fP\fB) (XDR *, void *, ...);\fP \fBtypedef bool_t (*\fP\fIresultproc_t\fP\fB) (caddr_t \fP\fIresp\fP\fB,\fP \fB struct sockaddr_in *\fP\fIraddr\fP\fB);\fP .fi .in .LP 型 \fIAUTH\fP, \fICLIENT\fP, \fISVCXPRT\fP, \fIXDR\fP の宣言についてはヘッダーファイルを参照。 .LP .nf \fBvoid auth_destroy(AUTH *\fP\fIauth\fP\fB);\fP .fi .IP このマクロは \fIauth\fP に関連付けられた認証情報を破壊する。破壊は通常は私的なデータ構造の 破棄を含んでいる。 \fBauth_destroy\fP() を呼び出した後に \fIauth\fP を使用することは未定義である。 .LP .nf \fBAUTH *authnone_create(void);\fP .fi .IP 各リモートプロシージャーコールで使用できない仮の認証情報として渡される RPC 認証ハンドルを作成して返す。 これは RPC で使用されるデフォルトの認証である。 .LP .nf \fBAUTH *authunix_create(char *\fP\fIhost\fP\fB, int \fP\fIuid\fP\fB, int \fP\fIgid\fP\fB,\fP \fB int \fP\fIlen\fP\fB, int *\fP\fIaup_gids\fP\fB);\fP .fi .IP 認証情報を含んだ RPC 認証ハンドルを作成して返す。 \fIhost\fP パラメーターは情報が作成されたマシンの名前である。 \fIuid\fP はそのユーザーのユーザー .SM ID 、 \fIgid\fP はそのユーザーの現在のグループ .SM ID である。 \fIlen\fP と \fIaup_gids\fP はそのユーザーが所属するグループの配列を参照している。 他のユーザーになりすますことは簡単である。 .LP .nf \fBAUTH *authunix_create_default(void);\fP .fi .IP 適切なパラメーターで \fBauthunix_create\fP() を呼び出す。 .LP .nf \fBint callrpc(char *\fP\fIhost\fP\fB, unsigned long \fP\fIprognum\fP\fB,\fP \fB unsigned long \fP\fIversnum\fP\fB, unsigned long \fP\fIprocnum\fP\fB,\fP \fB xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB,\fP \fB xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB);\fP .fi .IP マシン \fIhost\fP 上で \fIprognum\fP, \fIversnum\fP, \fIprocnum\fP に関連付けられたリモートプロシージャーを呼び出す。 パラメーター \fIin\fP はプロシージャーの引き数のアドレスであり \fIout\fP は結果を格納するアドレスである。 \fIinproc\fP はプロシージャーのパラメーターをエンコードするのに使用され、 \fIoutproc\fP は結果をデコードするのに使用される。 このルーティンは成功した場合にはゼロを返す。失敗した場合には \fBenum clnt_stat\fP を整数にキャストした値を返す。 \fBclnt_perrno\fP() ルーティンが失敗の状態をメッセージに変換するのに使用できる。 .IP 警告: このルーティンでリモートプロシージャーを呼び出すと通信には UDP/IP が使用される。この際の制限については \fBclntudp_create\fP() を参照すること。このルーティンを使用して認証や時間切れの制御を することはできない。 .LP .nf \fBenum clnt_stat clnt_broadcast(unsigned long \fP\fIprognum\fP\fB,\fP \fB unsigned long \fP\fIversnum\fP\fB, unsigned long \fP\fIprocnum\fP\fB,\fP \fB xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB,\fP \fB xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB,\fP \fB resultproc_t \fP\fIeachresult\fP\fB);\fP .fi .IP \fBcallrpc\fP() と同様であるが、メッセージがローカルのブロードキャストネットワーク 全体へとブロードキャストされる点が異っている。回答を受け取る度に このルーティンは以下の形式の \fBeachresult\fP() を呼び出す。 .IP .in +4n .nf \fBeachresult(char *\fP\fIout\fP\fB, struct sockaddr_in *\fP\fIaddr\fP\fB);\fP .fi .in .IP ここで \fIout\fP は \fBclnt_broadcast\fP() に渡される \fIout\fP と同じであるが、リモートプロシージャーからの出力がデコードされている 点のみが異っている。 \fIaddr\fP は結果を送って来たマシンのアドレスを指している。 \fBeachresult\fP() がゼロを返した場合、 \fBclnt_broadcast\fP() はさらなる回答を待つ。そうでなければ適切な状態で終了する。 .IP 警告: ブロードキャストソケットはデータリンク層の最大転送単位に 制限されている。イーサネットの場合、最大値は 1500 バイトである。 .LP .nf \fBenum clnt_stat clnt_call(CLIENT *\fP\fIclnt\fP\fB, unsigned long \fP\fIprocnum\fP\fB,\fP \fB xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB,\fP \fB xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB,\fP \fB struct timeval \fP\fItout\fP\fB);\fP .fi .IP このマクロはクライアントハンドル \fIclnt\fP に関連付けられた \fIprocnum\fP リモートプロシージャーを呼び出す。 クライアントハンドルは \fBclnt_create\fP() のような .SM RPC クライアント作成ルーティンによって得られる。 パタメータ \fIin\fP はプロシージャーの引き数のアドレスである。 \fIout\fP はプロシージャーの返り値を格納するアドレスである。 \fIinproc\fP はプロシージャーのパラメーターをエンコードするのに使用される。 \fIoutproc\fP はプロシージャーの返り値をデコードするのに使用される。 \fItout\fP は結果が返されるのを待つ時間である。 .LP .nf \fBclnt_destroy(CLIENT *\fP\fIclnt\fP\fB);\fP .fi .IP このマクロはクライアントの RPC ハンドルを破壊する。破壊には通常は \fIclnt\fP 自身も含めて私的なデータ構造体の破棄が含まれている。 \fBclnt_destroy\fP() の呼び出しの後に \fIclnt\fP を使用することは未定義である。 RPC ライブラリが関連するソケットをオープンした場合には、 それも閉じられる。それ以外の場合にはソケットはオープンされたままである。 .LP .nf \fBCLIENT *clnt_create(char *\fP\fIhost\fP\fB, unsigned long \fP\fIprog\fP\fB,\fP \fB unsigned long \fP\fIvers\fP\fB, char *\fP\fIproto\fP\fB);\fP .fi .IP 一般的なクライアントの作成ルーティンである。 \fIhost\fP はサーバのあるリモートホストの名前を指定する。 \fIproto\fP どのような通信プロトコルを使用するかを指定する。現在ここに 使用できる値は \(lqudp\(rq と \(lqtcp\(rq である。 デフォルトの時間切れが設定されるが、 \fBclnt_control\fP() を使用して変更可能である。 .IP 警告: UDP を使用した場合には欠点がある。 UDP に基づいた RPC メッセージは 最大でも 8 KByte のエンコードデータしか保持する ことができないため、大きな引き数や巨大な結果を取るプロシージャーに は使用することができない。 .LP .nf \fBbool_t clnt_control(CLIENT *\fP\fIcl\fP\fB, int \fP\fIreq\fP\fB, char *\fP\fIinfo\fP\fB);\fP .fi .IP このマクロは各種クライアントについて情報を変更したり、取得したり するのに使用する。 \fIreq\fP は操作の種類を指定する。 \fIinfo\fP は情報へのポインターである。 UDP と TCP どちらの場合も使用可能な \fIreq\fP の値と、その引き数の型、およびその内容は以下の通りである: .IP .in +4n .nf \fBCLSET_TIMEOUT\fP \fIstruct timeval\fP // 時間切れを設定する \fBCLGET_TIMEOUT\fP \fIstruct timeval\fP // 時間切れを取得する .fi .in .IP 注意: \fBclnt_control\fP() を使用して時間切れを設定した場合にはそれ以後は \fBclnt_call\fP() に渡される時間切れパラメーターは全て無視される。 .IP .in +4n .nf \fBCLGET_SERVER_ADDR\fP \fIstruct sockaddr_in \fP // サーバアドレスを取得する .fi .in .IP 以下の操作は UDP の場合にのみ有効である: .IP .in +4n .nf \fBCLSET_RETRY_TIMEOUT\fP \fIstruct timeval\fP // 再送間隔を設定する \fBCLGET_RETRY_TIMEOUT\fP \fIstruct timeval\fP // 再送間隔を取得する .fi .in .IP 再送間隔は次に要求を再送する前に "UDP RPC" がサーバの回答を待つ時間である。 .LP .nf \fBclnt_freeres(CLIENT * \fP\fIclnt\fP\fB, xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB);\fP .fi .IP このマクロは RPC 呼び出しの結果のデコードの際に RPC/XDR システムによって割当てられたデータを解放する。 パラメーター \fIout\fP は結果のアドレスである。 \fIoutproc\fP は結果を記述している XDR ルーティンである。 このルーティンは結果の解放に成功した場合には 1 を返す。 失敗した場合にはゼロを返す。 .LP .nf \fBvoid clnt_geterr(CLIENT *\fP\fIclnt\fP\fB, struct rpc_err *\fP\fIerrp\fP\fB);\fP .fi .IP このマクロはクライアントハンドルのエラー構造体を \fIerrp\fP アドレスで指定された構造体へコピーする。 .LP .nf \fBvoid clnt_pcreateerror(char *\fP\fIs\fP\fB);\fP .fi .IP 標準エラー出力に、なぜクライアント RPC ハンドルの作成が できなかったかについてのメッセージを表示する。 メッセージの前に文字列 \fIs\fP とコロン(:)が表示される。 \fBclnt_create\fP(), \fBclntraw_create\fP(), \fBclnttcp_create\fP(), \fBclntudp_create\fP() の呼び出しが失敗した時に使用すること。 .LP .nf \fBvoid clnt_perrno(enum clnt_stat \fP\fIstat\fP\fB);\fP .fi .IP 標準エラー出力に \fIstat\fP によって指示されるエラー状態に対応するメッセージを表示する。 \fBcallrpc\fP() の後に使用すること。 .LP .nf \fBclnt_perror(CLIENT *\fP\fIclnt\fP\fB, char *\fP\fIs\fP\fB);\fP .fi .IP 標準エラー出力に、なぜ RPC 呼び出しが失敗したかについてのメッセージを表示する。 \fIclnt\fP はコールに使用したハンドルである。 メッセージの前に文字列 \fIs\fP とコロン(:)が表示される。 \fBclnt_call\fP() が失敗した後に使用すること。 .LP .nf \fBchar *clnt_spcreateerror(char *\fP\fIs\fP\fB);\fP .fi .IP \fBclnt_pcreateerror\fP() と同様であるが、標準エラー出力へ表示するかわりに文字列を返す点が異っている。 .IP バグ: 静的な領域へのポインターを返すため、呼び出しごとに上書きされる。 .LP .nf \fBchar *clnt_sperrno(enum clnt_stat \fP\fIstat\fP\fB);\fP .fi .IP \fBclnt_perrno\fP() と同じ引き数を取るが、なぜ RPC 呼び出しが失敗したかについてのメッセージを標準エラー出力に表示する かわりに、メッセージを格納している文字列へのポインターを返す。 文字列は NEWLINE(改行) で終っている。 .IP \fBclnt_sperrno\fP() はプログラムが標準エラー出力を持っていない場合(プログラムがサーバとし て走っている場合にはよくありえる)や、プログラマーがメッセージを \fBprintf\fP(3) で出力することを望まない場合や、メッセージの形式が \fBclnt_perrno\fP() がサポートするものとは異っている場合などに \fBclnt_perrno\fP() のかわりに使用される。 注意: \fBclnt_sperror\fP() や \fBclnt_spcreaterror\fP() とは違って \fBclnt_sperrno\fP() は静的データへのポインターを返す。しかし呼び出しごとに上書きされることはない。 .LP .nf \fBchar *clnt_sperror(CLIENT *\fP\fIrpch\fP\fB, char *\fP\fIs\fP\fB);\fP .fi .IP \fBclnt_perror\fP() と同様であるが、標準エラー出力に表示する代りに (\fBclnt_sperrno\fP() のように) 文字列へのポインターを返す点が異っている。 .IP バグ: 静的な領域へのポインターを返すため、呼び出しごとに上書きされる。 .LP .nf \fBCLIENT *clntraw_create(unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB);\fP .fi .IP このルーティンはリモートプログラム \fIprognum\fP、 バージョン \fIversnum\fP のための擬似 RPC クライアントを作成する。メッセージをサービスに渡すために使用する 通信は実際にはそのプロセスのアドレス空間にあるバッファーである。 それで、対応する RPC サーバが同じアドレス空間の中にいなければならない。 \fBsvcraw_create\fP() を参照すること。 これにより RPC のシミュレーションや、カーネルインターフェースに影響されずに 応答時間などの RPC オーバヘッドの獲得ができる。 失敗した場合にはこのルーティンは NULL を返す。 .LP .nf \fBCLIENT *clnttcp_create(struct sockaddr_in *\fP\fIaddr\fP\fB,\fP \fB unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB int *\fP\fIsockp\fP\fB, unsigned int \fP\fIsendsz\fP\fB, unsigned int \fP\fIrecvsz\fP\fB);\fP .fi .IP .\"The following inline font conversion is necessary for the hyphen indicator このルーティンはリモートプログラム \fIprognum\fP、 バージョン \fIversnum\fP のための RPC クライアントを作成する。クライアントは通信に TCP/IP を使用する。リモートプログラムはインターネットアドレスの \fI*addr\fP にある。 \fIaddr\->sin_port\fP がゼロならば、実際にリモートプログラムが listen しているポートが設定される。(この情報のためにリモートの \fBportmap\fP サービスが利用される。) パラメーター \fIsockp\fP はソケットである。もしこれが \fBRPC_ANYSOCK\fP に設定されている場合は、このルーティンが新しいソケットをオープンして \fIsockp\fP に設定する。 TCP に基づいた RPC はバッファーされた I/O を使用するため、ユーザーはパラメーター \fIsendsz\fP と \fIrecvsz\fP を使用して送信バッファーと受信バッファーのサイズを指定することができる。 ゼロを指定した場合には適切なデフォルトが選択される。 このルーティンは失敗した場合は NULL を返す。 .LP .nf \fBCLIENT *clntudp_create(struct sockaddr_in *\fP\fIaddr\fP\fB,\fP \fB unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB struct timeval \fP\fIwait\fP\fB, int *\fP\fIsockp\fP\fB);\fP .fi .IP このルーティンはリモートプログラム \fIprognum\fP、 バージョン \fIversnum\fP のための RPC クライアントを作成する。クライアントは通信に UDP/IP を使用する。リモートプログラムはインターネットアドレスの \fI*addr\fP にある。 \fIaddr\->sin_port\fP がゼロならば、実際にリモートプログラムが listen しているポートが設定される。(この情報のためにリモートの \fBportmap\fP サービスが利用される。) パラメーター \fIsockp\fP はソケットである。もしこれが \fBRPC_ANYSOCK\fP に設定されている場合は、このルーティンが新しいソケットをオープンして \fIsockp\fP に設定する。 UDP 通信は回答があるか、時間切れが起こるまで \fBwait\fP 間隔で呼び出しメッセージを再送する。時間切れが起こるまでの合計時間は \fBclnt_call\fP() で指定する。 .IP 警告: UDP に基づいた RPC メッセージは最大でも 8 Kbyte までのエンコードされたデータしか 保持できないため、この通信は大きな引き数や巨大な結果を取る プロシージャーには使用できない。 .LP .nf \fBCLIENT *clntudp_bufcreate(struct sockaddr_in *\fP\fIaddr\fP\fB,\fP \fB unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB struct timeval \fP\fIwait\fP\fB, int *\fP\fIsockp\fP\fB,\fP \fB unsigned int \fP\fIsendsize\fP\fB, unsigned int \fP\fIrecosize\fP\fB);\fP .fi .IP このルーティンはリモートプログラム \fIprognum\fP、 バージョン \fIversnum\fP のための RPC クライアントを作成する。クライアントは通信に UDP/IP を使用する。リモートプログラムはインターネットアドレスの \fI*addr\fP にある。 \fIaddr\->sin_port\fP がゼロならば、実際にリモートプログラムが listen しているポートが設定される。(この情報のためにリモートの \fBportmap\fP サービスが利用される。) パラメーター \fIsockp\fP はソケットである。もしこれが \fBRPC_ANYSOCK\fP に設定されている場合は、このルーティンが新しいソケットをオープンして \fIsockp\fP に設定する。 UDP 通信は回答があるか、時間切れが起こるまで \fBwait\fP 間隔で呼び出しメッセージを再送する。時間切れが起こるまでの合計時間は \fBclnt_call\fP() で指定する。 .IP これを使用すると UDP に基づいた RPC メッセージにおいて送信パケットや 受信パケットの最大サイズを指定することが可能になる。 .LP .nf \fBvoid get_myaddress(struct sockaddr_in *\fP\fIaddr\fP\fB);\fP .fi .IP このマシンの IP アドレスを \fI*addr\fP に格納する。 \fI/etc/hosts\fP を扱うライブラリルーティンは使用しない。ポート番号は常に \fBhtons(PMAPPORT)\fP に設定される。 .LP .nf \fBstruct pmaplist *pmap_getmaps(struct sockaddr_in *\fP\fIaddr\fP\fB);\fP .fi .IP \fBportmap\fP サービスのためのユーザーインターフェースであり、 IP アドレス \fI*addr\fP にあるホストの現在の RPC プログラムからポート番号へのマッピングの一覧を返す。 このルーティンが NULL を返す場合もある。 `\fBrpcinfo \-p\fP' コマンドはこのルーティンを使用している。 .LP .nf \fBunsigned short pmap_getport(struct sockaddr_in *\fP\fIaddr\fP\fB,\fP \fB unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB unsigned int \fP\fIprotocol\fP\fB);\fP .fi .IP \fBportmap\fP サービスのためのユーザーインターフェースで、 プログラム番号 \fIprognum\fP、 バージョン \fIversnum\fP、 関連付けられた通信プロトコル \fIprotocol\fP をサポートするサービスが待っているポート番号を返す。 \fIprotocol\fP の値はほとんどの場合 IPPROTO_UDP か IPPROTO_TCP である。 返り値ゼロはマッピングが存在しないか、 RPC システムがリモートの \fBportmap\fP サービスの参照に失敗したことを意味する。後者の場合は大域変数 \fIrpc_createerr\fP が RPC 状態を保持している。 .LP .nf \fBenum clnt_stat pmap_rmtcall(struct sockaddr_in *\fP\fIaddr\fP\fB,\fP \fB unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB unsigned long \fP\fIprocnum\fP\fB,\fP \fB xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB,\fP \fB xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB,\fP \fB struct timeval \fP\fItout\fP\fB, unsigned long *\fP\fIportp\fP\fB);\fP .fi .IP \fBportmap\fP サービスのためのユーザーインターフェースで、 IP アドレス \fI*addr\fP のホストの \fBportmap\fP を参照して、 RPC 呼び出しを生成し、そのホスト上のプロシージャーを呼び出す。 パラメーター \fI*portp\fP はプロシージャーが成功した場合にはプログラムのポート番号に修正される。 他のパラメーターの定義については \fBcallrpc\fP() や \fBclnt_call\fP() で説明してある。 このプロシージャーは \(lqping\(rq のみに使用すべきである。 \fBclnt_broadcast\fP() も参照すること。 .LP .nf \fBbool_t pmap_set(unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB unsigned int \fP\fIprotocol\fP\fB, unsigned short \fP\fIport\fP\fB);\fP .fi .IP \fBportmap\fP サービスのためのユーザーインターフェースで、 [\fIprognum\fP,\fIversnum\fP,\fIprotocol\fP] の組み合わせと \fIport\fP との間のマッピングを、そのマシン上の \fBportmap\fP サービスに登録する。 \fIprotocol\fP はほとんどの場合 \fBIPPROTO_UDP\fP か \fBIPPROTO_TCP\fP のどちらかである。 このルーティンは成功した場合には 1 を返す。失敗した場合にはゼロを返す。 \fBsvc_register\fP() によって自動的に実行される。 .LP .nf \fBbool_t pmap_unset(unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB);\fP .fi .IP \fBportmap\fP サービスのためのユーザーインターフェースで、 [\fIprognum\fP,\fIversnum\fP,\fI*\fP] の組み合わせと \fBports\fP の間のマッピングをそのマシン上の \fBportmap\fP サービスから削除する。このルーティンは成功した場合は 1 を返す。 失敗した場合には 0 を返す。 .LP .nf \fBint registerrpc(unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB,\fP \fB unsigned long \fP\fIprocnum\fP\fB, char *(*\fP\fIprocname\fP\fB)(char *),\fP \fB xdrproc_t \fP\fIinproc\fP\fB, xdrproc_t \fP\fIoutproc\fP\fB);\fP .fi .IP RPC サービスパッケージを使用して \fIprocname\fP プロシージャーを登録する。プログラム \fIprognum\fP、 バージョン \fIversnum\fP、 プロシージャー \fIprocnum\fP への要求が届いた場合、 \fIprocname\fP がパラメーターへのポインターを持って呼び出される。 \fIprogname\fP は静的な結果へのポインターを返す必要がある。 \fIinproc\fP はパラメーターをデコードするために使用される。 \fIoutproc\fP は結果をエンコードするために使用される。 このルーティンは登録に成功した場合にはゼロを返す。 失敗した場合には \-1 を返す。 .IP 警告: この形式で登録されたリモートプロシージャーは UDP/IP 通信を使用する。制限に関しては \fBsvcudp_create\fP() を参照すること。 .LP .nf \fBstruct rpc_createerr \fP\fIrpc_createerr\fP\fB;\fP .fi .IP 成功しなかった RPC クライアント生成ルーティンによって設定される大域変数。 \fBclnt_pcreateerror\fP() ルーティンが理由を表示するために使用する。 .LP .nf \fBvoid svc_destroy(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP このマクロは通信ハンドル \fIxprt\fP の RPC サービスを破壊する。破壊には通常、 \fIxprt\fP を含めて、私的なデータ構造体の破棄が含まれている。 このルーティンを呼び出した後に \fIxprt\fP を使用することは未定義である。 .LP .nf \fBfd_set \fP\fIsvc_fdset\fP\fB;\fP .fi .IP RPC サービス側のファイルディスクリプターのビットマスクを反映した大域変数。 \fBselect\fP(2) システムコールのパラメーターのために利用できる。これは、サービスの実装者が \fBsvc_run\fP() を呼び出さずに、独自の非同期イベント処理を用いる場合にのみ意味がある。 この変数は読み込み専用で (そのまま \fBselect\fP(2) へ渡してはならない!)、 \fBsvc_getreqset\fP() 呼び出しや生成ルーティンの後に変更されているかもしれない。 .LP .nf \fBint \fP\fIsvc_fds\fP\fB;\fP .fi .IP \fBsvc_fdset\fP に似ているが、32 ディスクリプターに制限されている。 このインターフェースは \fBsvc_fdset\fP によって置き換えられた。 .LP .nf \fBsvc_freeargs(SVCXPRT *\fP\fIxprt\fP\fB, xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB);\fP .fi .IP このマクロはサービスプロシージャーが \fBsvc_getargs\fP() を使用して引き数をデコードした時に RPC/XDR システムによって割り当てられたデータを解放する。 このルーティンは解放に成功した場合には 1 を返す。 失敗した場合にはゼロを返す。 .LP .nf \fBsvc_getargs(SVCXPRT *\fP\fIxprt\fP\fB, xdrproc_t \fP\fIinproc\fP\fB, char *\fP\fIin\fP\fB);\fP .fi .IP このマクロは RPC サービス通信ハンドル \fIxprt\fP に関連付けられた RPC 要求の引き数をデコードする。パラメーター \fIin\fP は引き数の格納されたアドレスである。 \fIinproc\fP は引き数をデコードするための XDR ルーティンである。 このルーティンはデコードに成功した場合は 1 を返す。 失敗した場合はゼロを返す。 .LP .nf \fBstruct sockaddr_in *svc_getcaller(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP RPC サービス通信ハンドル \fIxprt\fP に関連付けられたプロシージャーの呼び出し元のネットワークアドレスを 取得するための標準的な手段。 .LP .nf \fBvoid svc_getreqset(fd_set *\fP\fIrdfds\fP\fB);\fP .fi .IP このルーティンはサービスの実装者が \fBsvc_run\fP() を呼び出さず、独自の非同期イベント処理を実装する場合にのみ意味がある。 これは \fBselect\fP(2) システムコールが RPC ソケットに RPC 要求が到着したと返した場合にのみ呼び出される。 \fIrdfds\fP は結果の読み込みファイルディスクリプターのビットマスクである。 このルーティンは \fIrdfds\fP の値に関連付けられた全てのソケットのサービスが行なわれた時に 返ってくる。 .LP .nf \fBvoid svc_getreq(int \fP\fIrdfds\fP\fB);\fP .fi .IP \fBsvc_getreqset\fP() に似ているがディスクリプターの数が 32 に制限されている。 このインターフェースは \fBsvc_getreqset\fP() によって置き換えられた。 .LP .nf \fBbool_t svc_register(SVCXPRT *\fP\fIxprt\fP\fB, unsigned long \fP\fIprognum\fP\fB,\fP \fB unsigned long \fP\fIversnum\fP\fB,\fP \fB void (*\fP\fIdispatch\fP\fB)(svc_req *, SVCXPRT *),\fP \fB unsigned long \fP\fIprotocol\fP\fB);\fP .fi .IP \fIprognum\fP と \fIversnum\fP をサービス配分プロシージャー \fIdispatch\fP で関連付ける。 \fIprotocol\fP がゼロの場合、サービスは \fBportmap\fP サービスには登録されない。 \fIprotocol\fP がゼロ以外の場合、 [\fIprognum\fP,\fIversnum\fP,\fIprotocol\fP] の組み合わせと \fIxprt\->xp_port\fP とのマッピングがローカルの \fBportmap\fP サービスに登録される。(一般的に \fIprotocol\fP はゼロ、 \fBIPPROTO_UDP\fP、 \fBIPPROTO_TCP\fP のどれかである。) プロシージャー \fIdispatch\fP は以下の形式である: .in +4n .nf dispatch(struct svc_req *request, SVCXPRT *xprt); .fi .in .IP \fBsvc_register\fP() ルーティンは成功した場合は 1 を返す。失敗した場合はゼロを返す。 .LP .nf \fBvoid svc_run(void);\fP .fi .IP このルーティンは戻ってこない。これは .SM RPC 要求の到着を待ち、どれかが届いた場合に \fBsvc_getreq\fP() を使用して適切なサービスプロシージャーを呼び出す。 このプロシージャーは通常は \fBselect\fP(2) システムコールから返るのを待っている。 .LP .nf \fBbool_t svc_sendreply(SVCXPRT *\fP\fIxprt\fP\fB, xdrproc_t \fP\fIoutproc\fP\fB, char *\fP\fIout\fP\fB);\fP .fi .IP RPC サービス配分ルーティンによってリモートプロシージャーコールの結果を 返すために呼び出される。 パラメーター \fIxprt\fP はその要求に関連付けられた通信ハンドルである。 \fIoutproc\fP は結果をエンコードするために使用する XDR ルーティンである。 \fIout\fP は結果のアドレスである。このルーティンは成功した場合は 1 を返す。 失敗した場合はゼロを返す。 .LP .nf \fBvoid svc_unregister(unsigned long \fP\fIprognum\fP\fB, unsigned long \fP\fIversnum\fP\fB);\fP .fi .IP 配分ルーティンから [\fIprognum\fP,\fIversnum\fP] および [\fIprognum\fP,\fIversnum\fP,\fI*\fP] の組み合わせからポート番号へのマッピングを全て削除する。 .LP .nf \fBvoid svcerr_auth(SVCXPRT *\fP\fIxprt\fP\fB, enum auth_stat \fP\fIwhy\fP\fB);\fP .fi .IP 認証エラーによりリモートプロシージャーコールの実行を拒否された 場合にサービス配分ルーティンによって呼び出される。 .LP .nf \fBvoid svcerr_decode(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP パラメーターのデコードに失敗した場合に サービス配分ルーティンによって呼び出される。 \fBsvc_getargs\fP() も参照すること。 .LP .nf \fBvoid svcerr_noproc(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP 要求のあったプロシージャー番号が実装されていない場合に サービス配分ルーティンより呼び出される。 .LP .nf \fBvoid svcerr_noprog(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP RPC パッケージに要求されたプログラムが登録されていない場合に呼び出される。 サービスの実装には通常、このルーティンは必要ない。 .LP .nf \fBvoid svcerr_progvers(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP RPC パッケージに要求されたバージョンのプログラムが登録されていない場合に 呼び出される。サービスの実装には通常、このルーティンは必要ない。 .LP .nf \fBvoid svcerr_systemerr(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP 特定のプロトコルによってカバーされていなシステムエラーが 検出された場合にサービス配分ルーティンによって呼び出される。 例えば、サービスがそれ以上、記憶装置を割り当てることができない場合には このルーティンが呼び出されるかもしれない。 .LP .nf \fBvoid svcerr_weakauth(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP 認証パラメーターが足りないためにリモートプロシージャーコールの実行を 拒否された場合にサービス配分ルーティンによって呼び出される。 このルーティンは \fBsvcerr_auth(xprt, AUTH_TOOWEAK)\fP を呼び出す。 .LP .nf \fBSVCXPRT *svcfd_create(int \fP\fIfd\fP\fB, unsigned int \fP\fIsendsize\fP\fB,\fP \fB unsigned int \fP\fIrecvsize\fP\fB);\fP .fi .IP 任意のオープンされたディスクリプター上にサービスを作成する。 典型的に、ディスクリプターは TCP のようなストリームプロトコルで接続されたソケットである。 \fIsendsize\fP と \fIrecvsize\fP には送信バッファーと受信バッファーの大きさを指定する。もしゼロが指定された 場合は適切なデフォルトが選択される。 .LP .nf \fBSVCXPRT *svcraw_create(void);\fP .fi .IP このルーティンは擬似 RPC サービス通信を生成して、そのポインターを返す。 通信は実際にはそのプロセスのアドレス空間にあるバッファーなので 対応する RPC クライアントは同じアドレス空間にいる必要がある。 \fBclntraw_create\fP() を参照すること。 このルーティンで RPC のシミュレーションや、カーネルインターフェースに影響されずに応答時間などの RPC オーバヘッドを取得ができる。このルーティンは失敗した場合は NULL を返す。 .LP .nf \fBSVCXPRT *svctcp_create(int \fP\fIsock\fP\fB, unsigned int \fP\fIsend_buf_size\fP\fB,\fP \fB unsigned int \fP\fIrecv_buf_size\fP\fB);\fP .fi .IP このルーティンは TCP/IP に基づく RPC サービス通信を作成し、それへのポインターを返す。 通信はソケット \fIsock\fP に結びつけられる。 \fIsock\fP は \fBRPC_ANYSOCK\fP でも良い。この場合は新しいソケットが作成される。 もしソケットがローカルな TCP ポートに bind されていない場合は、 このルーティンが適当なポートに bind する。 補完された場合、\fIxprt\->xp_sock\fP には通信のソケット ディスクリプターが、\fIxprt\->xp_port\fP には通信のポート番号が 設定される。 このルーティンは失敗した場合は NULL を返す。 TCP に基づいた RPC はバッファーされた I/O を使用するため、 ユーザーはバッファーの大きさを指定できる。 ゼロを指定した場合は適切なデフォルトが選択される。 .LP .nf \fBSVCXPRT *svcudp_bufcreate(int \fP\fIsock\fP\fB, unsigned int \fP\fIsendsize\fP\fB,\fP \fB unsigned int \fP\fIrecosize\fP\fB);\fP .fi .IP このルーティンは UDP/IP に基づいた RPC サービス通信を作成し、 そのポインターを返す。通信はソケット \fIsock\fP に関連付けられる。 \fIsock\fP は \fBRPC_ANYSOCK\fP でも良い。この場合は新しいソケットが作成される。 ソケットがローカルの UDP ポートに bind されていない場合には このルーティンは適当なポートに bind する。 補完された場合、\fIxprt\->xp_sock\fP に通信のソケットの ディスクリプターが、\fIxprt\->xp_port\fP に通信のポート番号が 設定される。このルーティンは失敗した場合には NULL を返す。 .IP これを使用すると UDP に基づいた RPC メッセージにおいて送信パケットや 受信パケットの最大サイズを指定することが可能になる。 .LP .nf \fBSVCXPRT *svcudp_create(int \fP\fIsock\fP\fB);\fP .fi .IP 送信パケットと受信パケットのサイズを同じデフォルトの値 \fISZ\fP に指定した \fIsvcudp_bufcreate(sock,SZ,SZ)\fP と等価である。 .LP .nf \fBbool_t xdr_accepted_reply(XDR *\fP\fIxdrs\fP\fB, struct accepted_reply *\fP\fIar\fP\fB);\fP .fi .IP RPC 応答メッセージをエンコードするのに使用する。このルーティンは RPC パッケージを用いずに RPC\-形式のメッセージを作成しようとする場合に便利である。 .LP .nf \fBbool_t xdr_authunix_parms(XDR *\fP\fIxdrs\fP\fB, struct authunix_parms *\fP\fIaupp\fP\fB);\fP .fi .IP UNIX 形式の証明書を記述するために使用する。このルーティンは RPC 認証パッケージを使用せずにこれらの証明書を作成しようとする場合に便利である。 .LP .nf \fBvoid xdr_callhdr(XDR *\fP\fIxdrs\fP\fB, struct rpc_msg *\fP\fIchdr\fP\fB);\fP .fi .IP RPC 呼び出しのヘッダーメッセージを記述するために使用する。 このルーティンは RPC パッケージを使用せずに RPC\-形式のメッセージを作成しようとする場合に便利である。 .LP .nf \fBbool_t xdr_callmsg(XDR *\fP\fIxdrs\fP\fB, struct rpc_msg *\fP\fIcmsg\fP\fB);\fP .fi .IP RPC 呼び出しメッセージを記述するのに使用する。 このルーティンは RPC パッケージを使用せずに RPC\-形式のメッセージを作成しようとする場合に便利である。 .LP .nf \fBbool_t xdr_opaque_auth(XDR *\fP\fIxdrs\fP\fB, struct opaque_auth *\fP\fIap\fP\fB);\fP .fi .IP PRC 認証情報メッセージを記述するために使用する。 このルーティンは RPC パッケージを使用せずに RPC\-形式のメッセージを作成しようとする場合に便利である。 .LP .nf \fBbool_t xdr_pmap(XDR *\fP\fIxdrs\fP\fB, struct pmap *\fP\fIregs\fP\fB);\fP .fi .IP 各種の \fBportmap\fP プロシージャーへのパラメーターを外部的に記述するために使用する。 このルーティンは \fBpmap\fP インターフェースを使用せずに、これらのパラメーターを 作成したい場合に便利である。 .LP .nf \fBbool_t xdr_pmaplist(XDR *\fP\fIxdrs\fP\fB, struct pmaplist **\fP\fIrp\fP\fB);\fP .fi .IP ポートのマッピングのリストを外部的に記述するために使用する。 このルーティンは \fBpmap\fP インターフェースを使用せずに、これらのパラメーターを 作成したい場合に便利である。 .LP .nf \fBbool_t xdr_rejected_reply(XDR *\fP\fIxdrs\fP\fB, struct rejected_reply *\fP\fIrr\fP\fB);\fP .fi .IP RPC 応答メッセージを記述するために使用する。このルーティンは RPC パッケージを使用せずに、 RPC\-形式のメッセージを作成したい場合に便利である。 .LP .nf \fBbool_t xdr_replymsg(XDR *\fP\fIxdrs\fP\fB, struct rpc_msg *\fP\fIrmsg\fP\fB);\fP .fi .IP RPC 応答メッセージを記述するために使用する。 このルーティンは RPC パッケージを使用せずに、 RPC 形式のメッセージを作成したい場合に便利である。 .LP .nf \fBvoid xprt_register(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP RPC サービス通信ハンドルを生成した後に、それら自身を RPC サービスパッケージに登録する必要がある。 このルーティンは大域変数 \fIsvc_fds\fP を修正する。サービスの実装者は通常、このルーティンは必要ない。 .LP .nf \fBvoid xprt_unregister(SVCXPRT *\fP\fIxprt\fP\fB);\fP .fi .IP RPC サービス通信ハンドルを破壊する前に、それを RPC 通信パッケージから登録解除する必要がある。 このルーティンは大域変数 \fIsvc_fds\fP を修正する。サービスの実装者は通常、このルーティンは必要ない。 .SH 関連項目 .\" We don't have an rpc_secure.3 page in the set at the moment -- MTK, 19 Sep 05 .\" .BR rpc_secure (3), \fBxdr\fP(3) 以下のマニュアル: .RS Remote Procedure Calls: Protocol Specification .br Remote Procedure Call Programming Guide .br rpcgen Programming Guide .br .RE \fIRPC: Remote Procedure Call Protocol Specification\fP, RFC\ 1050, Sun Microsystems, Inc., USC\-ISI. .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man\-pages/ に書かれている。