doc/ja_JP.eucJP/man/man3/rpc.3
2004-02-19 15:03:12 +00:00

1462 lines
28 KiB
Groff

.\" @(#)rpc.3n 2.4 88/08/08 4.0 RPCSRC; from 1.19 88/06/24 SMI
.\" %FreeBSD: src/lib/libc/rpc/rpc.3,v 1.11.2.5 2001/12/14 18:33:56 ru Exp %
.\" $FreeBSD$
.\"
.Dd February 16, 1988
.Dt RPC 3
.Os
.Sh 名称
.Nm rpc
.Nd リモートプロシージャコール用ライブラリルーチン
.Sh ライブラリ
.Lb libc
.Sh 書式
.In rpc/rpc.h
.Pp
関数の説明については
.Sx 解説
を参照してください。
.Sh 解説
このルーチンでは、C プログラムを使用して、
ネットワークを通して別のマシンでプロシージャ呼び出しを実行できます。
まずクライアントがプロシージャを呼び出し、
データパケットをサーバに送信します。
パケットを受け取ったサーバは、ディスパッチルーチンを呼び出し、
要求されたサービスを実行してから応答を送り返します。
最後に、プロシージャ呼び出しがクライアントに戻ります。
.Pp
Secure
.Tn RPC ( DES
認証) に使用するルーチンについては、
.Xr rpc_secure 3
で説明します。
Secure
.Tn RPC
.Tn DES
暗号化が使用できる場合にのみ使用できます。
.Bl -tag -width indent -compact
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn auth_destroy "AUTH *auth"
.Xc
.Pp
.Fa auth
に関連する認証情報を破壊するマクロです。
一般的に、破壊にはプライベートデータ構造の解放も含まれます。
.Fn auth_destroy
を呼び出した後で
.Fa auth
を使用した結果は不定になります。
.Pp
.It Xo
.Ft "AUTH *"
.Xc
.It Xo
.Fn authnone_create
.Xc
.Pp
各リモートプロシージャコールで使用できない認証情報を渡す
.Tn RPC
認証ハンドルを作成して戻します。
.Tn RPC
は、この認証をデフォルトで使用します。
.Pp
.It Xo
.Ft "AUTH *"
.Xc
.It Xo
.Fn authunix_create "char *host" "int uid" "int gid" "int len" "int *aup_gids"
.Xc
.Pp
認証情報を含む
.Tn RPC
.Ux
認証ハンドルを作成して戻します。
パラメータ
.Fa host
は、情報を作成するマシンの名前です。
.Fa uid
は、ユーザのユーザ ID です。
.Fa gid
は、ユーザの現行グループ ID です。
.Fa len
.Fa aup_gids
は、ユーザが属するグループの配列を表します。
あるユーザになりすますことが容易です。
.Pp
.It Xo
.Ft "AUTH *"
.Xc
.It Xo
.Fn authunix_create_default
.Xc
.Pp
適切なパラメータで
.Fn authunix_create
を呼び出します。
.Pp
.It Xo
.Fo callrpc
.Fa "char *host"
.Fa "u_long prognum"
.Fa "u_long versnum"
.Fa "u_long procnum"
.Fa "xdrproc_t inproc"
.Fa "char *in"
.Fa "xdrproc_t outproc"
.Fa "char *out"
.Fc
.Xc
.Pp
マシン
.Fa host
.Fa prognum ,
.Fa versnum ,
.Fa procnum
に関連するリモートプロシージャを呼び出します。
パラメータ
.Fa in
は、プロシージャの引数アドレスで、
.Fa out
は結果を配置するアドレスです。
.Fa inproc
は、プロシージャのパラメータをデコードするために使用し、
.Fa outproc
は、プロシージャの結果をデコードするために使用します。
このルーチンは、問題がなければ 0 を戻し、
問題がある場合は、
.Vt "enum clnt_stat"
を整数にキャストした値を戻します。
エラーステータスをメッセージに変換するには、ルーチン
.Fn clnt_perrno
が便利です。
.Pp
警告: このルーチンでリモートプロシージャを呼び出す場合は、
.Tn UDP/IP
がトランスポート層として使用されます。
制限事項については、
.Fn clntudp_create
を参照してください。
このルーチンを使用した場合、タイムアウトや認証は制御できません。
.Pp
.It Xo
.Ft "enum clnt_stat"
.Xc
.It Xo
.Fo clnt_broadcast
.Fa "u_long prognum"
.Fa "u_long versnum"
.Fa "u_long procnum"
.Fa "xdrproc_t inproc"
.Fa "char *in"
.Fa "xdrproc_t outproc"
.Fa "char *out"
.Fa "bool_t (*eachresult)(caddr_t, struct sockaddr_in *)
.Fc
.Xc
.Pp
ローカルで接続されているすべてのブロードキャストネットに
呼び出しメッセージがブロードキャストされることを除けば、
.Fn callrpc
と同じです。
このルーチンは、応答を受け取るたびに、以下の形式の
.Fn eachresult
を呼び出します。
.Bd -ragged -offset indent
.Ft bool_t
.Fn eachresult "caddr_t out" "struct sockaddr_in *addr"
.Ed
.Pp
.Fa out
は、リモートプロシージャの出力がデコードされることを除けば、
.Fn clnt_broadcast
に渡される
.Fa out
と同じです。
.Fa addr
は、結果を送信するマシンのアドレスを指します。
.Fn eachresult
が 0 を戻す場合、
.Fn clnt_broadcast
は次の応答を待ちます。
0 を戻さない場合は、適切なステータスで戻ります。
.Pp
警告: ブロードキャストソケットのサイズは、
データリンクの最大転送単位に制限されています。
イーサネットの場合、この値は 1500 バイトです。
.Pp
.It Xo
.Ft "enum clnt_stat"
.Xc
.It Xo
.Fo clnt_call
.Fa "CLIENT *clnt"
.Fa "u_long procnum"
.Fa "xdrproc_t inproc"
.Fa "char *in"
.Fa "xdrproc_t outproc"
.Fa "char *out"
.Fa "struct timeval tout"
.Fc
.Xc
.Pp
.Fn clnt_create
などの
.Tn RPC
クライアント作成ルーチンで入手した、クライアントハンドル
.Fa clnt
に関連するリモートプロシージャ
.Fa procnum
を呼び出すマクロです。
パラメータ
.Fa in
はプロシージャの引数のアドレスで、
.Fa out
は結果を配置するアドレスです。
.Fa inproc
はプロシージャのパラメータのデコードに使用し、
.Fa outproc
はプロシージャの結果のデコードに使用します。
.Fa tout
は、結果が戻るまでの時間です。
.Pp
.It Xo
.Ft void
.Fn clnt_destroy "CLIENT *clnt"
.Xc
.Pp
クライアントの
.Tn RPC
ハンドルを破壊するマクロです。
通常の場合、破壊には、
.Fa clnt
も含めたプライベートデータ構造の解放も含まれます。
.Fn clnt_destroy
を呼び出した後で
.Fa clnt
を使用した結果は不定になります。
.Tn RPC
ライブラリが関連ソケットを開いた場合はそれも閉じます。
関連ソケットを開いていない場合、ソケットは開いたまま残ります。
.Pp
.It Xo
.Ft CLIENT *
.Xc
.It Xo
.Fn clnt_create "char *host" "u_long prog" "u_long vers" "char *proto"
.Xc
.Pp
一般的なクライアント作成ルーチンです。
.Fa host
は、サーバが配置されているリモートホストの名前を指定します。
.Fa proto
は、使用する転送プロトコルの種類を指定します。
このフィールドで現在サポートされている値は、
.Qq Li udp
.Qq Li tcp
です。
タイムアウトはデフォルトが設定されていますが、
.Fn clnt_control
を使用して修正できます。
.Pp
警告:
.Tn UDP
の使用には短所があります。
.Tn UDP
ベースの
.Tn RPC
メッセージは、
8 キロバイトのエンコード済みデータまでしか維持できないので、
大きな引数を取るプロシージャや、
大きな結果を戻すプロシージャでは使用できません。
.Pp
.It Xo
.Ft bool_t
.Xc
.It Xo
.Fn clnt_control "CLIENT *cl" "u_int req" "char *info"
.Xc
.Pp
クライアントオブジェクトのさまざまな情報の変更や取り出しを行うマクロです。
.Fa req
はオペレーションのタイプを指定し、
.Fa info
は情報のポインタです。
.Tn UDP
.Tn TCP
の両方でサポートされている
.Fa req
の値、引数タイプ、実行内容は以下の通りです。
.Bl -column "CLSET_RETRY_TIMEOUT" "struct sockaddr_in"
.It Dv CLSET_TIMEOUT Ta Xo
.Vt "struct timeval" Ta "総タイムアウトの設定"
.Xc
.It Dv CLGET_TIMEOUT Ta Xo
.Vt "struct timeval" Ta "総タイムアウトの入手"
.Xc
.El
.Pp
注意: タイムアウトを
.Fn clnt_control
で設定すると、
.Fn clnt_call
に渡されるタイムアウトパラメータは、
後のすべての呼び出しで無視されます。
.Bl -column "CLSET_RETRY_TIMEOUT" "struct sockaddr_in"
.It Dv CLGET_SERVER_ADDR Ta Xo
.Vt "struct sockaddr_in" Ta "get server's address"
.Xc
.El
.Pp
以下のオペレーションは
.Tn UDP
のみで有効です。
.Bl -column "CLSET_RETRY_TIMEOUT" "struct sockaddr_in"
.It Dv CLSET_RETRY_TIMEOUT Ta Xo
.Vt "struct timeval" Ta "再試行タイムアウトの設定"
.Xc
.It Dv CLGET_RETRY_TIMEOUT Ta Xo
.Vt "struct timeval" Ta "再試行タイムアウトの入手"
.Xc
.It Dv CLSET_CONNECT Ta Vt "int" Ta Xr connect 2
を使用
.El
.Pp
再試行タイムアウトは、サーバが応答してから要求を再送することを
.Tn "UDP RPC"
が待機する時間です。
.Pp
.It Xo
.Ft bool_t
.Fn clnt_freeres "CLIENT *clnt" "xdrproc_t outproc" "char *out"
.Xc
.Pp
.Tn RPC/XDR
システムが
.Tn RPC
呼び出しの結果をデコードする場合に割り振ったデータを解放するマクロです。
パラメータ
.Fa out
は結果のアドレスで、
.Fa outproc
は結果を記述する
.Tn XDR
ルーチンです。
このルーチンは、結果が問題なく解放された場合は 1 を戻し、
問題が発生した場合は 0 を戻します。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn clnt_geterr "CLIENT *clnt" "struct rpc_err *errp"
.Xc
.Pp
クライアントハンドルのエラー構造を、アドレス
.Fa errp
の構造体にコピーするマクロです。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn clnt_pcreateerror "char *s"
.Xc
.Pp
クライアント
.Tn RPC
ハンドルを作成できない理由を表すメッセージを標準エラーに出力します。
メッセージの最初には、文字列
.Fa s
とコロンが付きます。
これは、
.Fn clnt_create ,
.Fn clntraw_create ,
.Fn clnttcp_create ,
.Fn clntudp_create
のいずれかがエラーとなった場合に使用します。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn clnt_perrno "enum clnt_stat stat"
.Xc
.Pp
.Fa stat
が示す条件に対応するメッセージを標準エラーに出力します。
.Fn callrpc
の後で使用してください。
.Pp
.It Xo
.Ft void
.Fn clnt_perror "CLIENT *clnt" "char *s"
.Xc
.Pp
.Tn RPC
呼び出しがエラーになった理由を示すメッセージを標準エラーに出力します。
.Fa clnt
は、呼び出しの実行に使用したハンドルです。
メッセージ最初には、文字列
.Fa s
とコロンが付きます。
.Fn clnt_call
の後で使用してください。
.Pp
.It Xo
.Ft "char *"
.Xc
.It Xo
.Fn clnt_spcreateerror "char *s"
.Xc
.Pp
標準エラーに出力する代わりに文字列を戻すことを除けば、
.Fn clnt_pcreateerror
と同じです。
.Pp
バグ: 各呼び出しで上書きされた静的データのポインタを戻します。
.Pp
.It Xo
.Ft "char *"
.Xc
.It Xo
.Fn clnt_sperrno "enum clnt_stat stat"
.Xc
.Pp
.Fn clnt_perrno
と同じ引数を取りますが、
.Tn RPC
呼び出しがエラーになった理由を示すメッセージを標準エラーに送信する代わりに、
メッセージを含む文字列のポインタを戻します。
文字列は改行
.Pq Ql "\en"
で終わります。
.Pp
プログラムに標準エラーがない場合
(サーバとして実行しているプログラムには標準エラーがないことが多い)、
またはメッセージを
.Fn printf
で出力する必要がない場合、
あるいは
.Fn clnt_perrno
がサポートするもの以外のメッセージフォーマットを使用する場合は、
.Fn clnt_perrno
の代わりに
.Fn clnt_sperrno
を使用します。
.Pp
注意:
.Fn clnt_sperror
.Fn clnt_spcreaterror
とは異なり、
.Fn clnt_sperrno
は静的データのポインタを戻しますが、
結果は各呼び出しで上書きされません。
.Pp
.It Xo
.Ft "char *"
.Xc
.It Xo
.Fn clnt_sperror "CLIENT *rpch" "char *s"
.Xc
.Pp
.Fn clnt_sperrno
と同じように、標準エラーに出力せずに文字列を戻すことを除けば、
.Fn clnt_perror
と同じです。
.Pp
バグ: 各呼び出しで上書きされた静的データのポインタを戻します。
.Pp
.It Xo
.Ft "CLIENT *"
.Xc
.It Xo
.Fn clntraw_create "u_long prognum" "u_long versnum"
.Xc
.Pp
リモートプログラム
.Fa prognum
バージョン
.Fa versnum
のトイ
.Tn RPC
クライアントを作成します。
サービスにメッセージを渡す実際のトランスポートは、
プロセスのアドレススペース内にあるバッファなので、
対応する
.Tn RPC
サーバは同じアドレススペースに存在する必要があります。
.Fn svcraw_create
を参照してください。
これにより、
.Tn RPC
のシミュレーション、およびラウンドトリップタイムなど、
.Tn RPC
オーバヘッドの取得をカーネルの干渉なしに実行できます。
このルーチンは、エラーが発生すると
.Dv NULL
を戻します。
.Pp
.It Xo
.Ft "CLIENT *"
.Xc
.It Xo
.Fo clnttcp_create
.Fa "struct sockaddr_in *addr"
.Fa "u_long prognum"
.Fa "u_long versnum"
.Fa "int *sockp"
.Fa "u_int sendsz"
.Fa "u_int recvsz"
.Fc
.Xc
.Pp
リモートプログラム
.Fa prognum
バージョン
.Fa versnum
.Tn RPC
クライアントを作成します。
クライアントは、トランスポートとして
.Tn TCP/IP
を使用します。
リモートプログラムは、インターネットアドレス
.Fa addr
にあります。
.Fa addr\->sin_port
が 0 である場合は、
リモートプログラムが注意を向ける実際のポートに設定されます (
.Xr portmap 8
サービスはこの情報で調べられます)。
パラメータ
.Fa sockp
はソケットです。このパラメータが
.Dv RPC_ANYSOCK
である場合、このルーチンは新しいソケットを開いて
.Fa sockp
を設定します。
.Tn TCP
ベースの
.Tn RPC
はバッファによる
.Tn I/O
を使用するので、ユーザはパラメータ
.Fa sendsz
.Fa recvsz
で送信バッファと受信バッファのサイズを指定できます。
値を 0 にすると、適切なデフォルトが選択されます。
このルーチンは、エラーになると
.Dv NULL
を戻します。
.Pp
.It Xo
.Ft "CLIENT *"
.Xc
.It Xo
.Fo clntudp_create
.Fa "struct sockaddr_in *addr"
.Fa "u_long prognum"
.Fa "u_long versnum"
.Fa "struct timeval wait"
.Fa "int *sockp"
.Fc
.Xc
.Pp
リモートプログラム
.Fa prognum
バージョン
.Fa versnum
.Tn RPC
クライアントを作成します。
クライアントは、トランスポートとして
.Tn UDP/IP
を使用します。
リモートプログラムは、インターネットアドレス
.Fa addr
にあります。
.Fa addr\->sin_port
が 0 である場合は、
リモートプログラムが注意を向ける実際のポートに設定されます
(リモート
.Xr portmap 8
サービスは、この情報で調べられます)。
パラメータ
.Fa sockp
はソケットです。
このパラメータが
.Dv RPC_ANYSOCK
である場合、このルーチンは新しいソケットを開いて
.Fa sockp
を設定します。
.Tn UDP
トランスポートは、応答を受け取るまで、
または呼び出しがタイムアウトになるまで、
.Fa wait
時間間隔で呼び出しメッセージを再送信します。
呼び出しがタイムアウトとなる時間は、
で指定します。
.Pp
警告:
.Tn UDP
ベースの
.Tn RPC
メッセージは、
8 キロバイトのエンコード済みデータまでしか維持できないので、
大きな引数を取るプロシージャや
大きな結果を戻すプロシージャでは使用できません。
.Pp
.It Xo
.Ft "CLIENT *"
.Xc
.It Xo
.Fo clntudp_bufcreate
.Fa "struct sockaddr_in *addr"
.Fa "u_long prognum"
.Fa "u_long versnum"
.Fa "struct timeval wait"
.Fa "int *sockp"
.Fa "unsigned int sendsize"
.Fa "unsigned int recosize"
.Fc
.Xc
.Pp
リモートプログラム
.Fa prognum
バージョン
.Fa versnum
.Tn RPC
クライアントを作成します。
クライアントは、トランスポートとして
.Tn UDP/IP
を使用します。
リモートプログラムは、インターネットアドレス
.Fa addr
にあります。
.Fa addr\->sin_port
が 0 である場合は、
リモートプログラムが注意を向ける実際のポートに設定されます
(リモート
.Xr portmap 8
サービスは、この情報で調べられます)。
パラメータ
.Fa sockp
はソケットです。このパラメータが
.Dv RPC_ANYSOCK
である場合、このルーチンは新しいソケットを開いて
.Fa sockp
を設定します。
.Tn UDP
トランスポートは、応答を受け取るまで、
または呼び出しがタイムアウトになるまで
.Fa wait
時間間隔で呼び出しメッセージを再送信します。
呼び出しがタイムアウトになる時間は、
.Fn clnt_call
で指定します。
.Pp
ユーザは、
.Tn UDP
ベースの
.Tn RPC
メッセージの送受信を行う、最大パケットサイズを指定できます。
.Pp
.It Xo
.Ft int
.Xc
.It Xo
.Fn get_myaddress "struct sockaddr_in *addr"
.Xc
.Pp
.Pa /etc/hosts
を処理するライブラリルーチンを参考にせず、マシンの
.Tn IP
アドレスを
.Fa addr
に入れます。ポート番号は、常に
.Fn htons PMAPPORT
に設定されます。
問題がない場合は 0 を戻し、問題がある場合は 0 以外を戻します。
.Pp
.It Xo
.Ft "struct pmaplist *"
.Xc
.It Xo
.Fn pmap_getmaps "struct sockaddr_in *addr"
.Xc
.Pp
.Xr portmap 8
サービスのユーザインタフェースで、
.Tn IP
アドレス
.Fa addr
にあるホストの
.Tn RPC
プログラムとポートの現行のマッピングのリストを戻します。
このルーチンは
.Dv NULL
を戻すことがあります。
コマンド
.Dq Nm rpcinfo Fl p
はこのルーチンを使用します。
.Pp
.It Xo
.Ft u_short
.Xc
.It Xo
.Fo pmap_getport
.Fa "struct sockaddr_in *addr"
.Fa "u_long prognum"
.Fa "u_long versnum"
.Fa "u_long protocol"
.Fc
.Xc
.Pp
.Xr portmap 8
サービスのユーザインタフェースで、
プログラム番号
.Fa prognum
バージョン
.Fa versnum
をサポートするサービスを待ち、
.Fa protocol
に関連する転送プロトコルを表すポート番号を戻します。
.Fa protocol
の値は、ほとんどの場合
.Dv IPPROTO_UDP
.Dv IPPROTO_TCP
です。マッピングが存在しない場合、または
.Tn RPC
システムがリモート
.Xr portmap 8
サービスと接触できない場合、戻り値は 0 になります。
後者の場合、
.Va rpc_createerr
には
.Tn RPC
ステータスが入ります。
.Pp
.It Xo
.Ft "enum clnt_stat"
.Xc
.It Xo
.Fo pmap_rmtcall
.Fa "struct sockaddr_in *addr"
.Fa "u_long prognum"
.Fa "u_long versnum"
.Fa "u_long procnum"
.Fa "xdrproc_t inproc"
.Fa "char *in"
.Fa "xdrproc_t outproc"
.Fa "char *out"
.Fa "struct timeval tout"
.Fa "u_long *portp"
.Fc
.Xc
.Pp
.Xr portmap 8
サービスのユーザインタフェースで、
.Tn IP
アドレス
.Fa addr
のホストのプロシージャを
.Tn RPC
呼び出しにするように、そのホストの
.Xr portmap 8
に命令します。
プロシージャで問題が発生しない場合、パラメータ
.Fa portp
はプログラムのポート番号に修正されます。
その他のパラメータについては、
.Fn callrpc
.Fn clnt_call
を参照してください。
このプロシージャは、
.Dq ping
以外で使用することはありません。
.Fn clnt_broadcast
も参照してください。
.Pp
.It Xo
.Ft bool_t
.Fn pmap_set "u_long prognum" "u_long versnum" "u_long protocol" "u_short port"
.Xc
.Pp
.Xr portmap 8
サービスのユーザインタフェースで、
.Pq Fa prognum , versnum , protocol
の 3 つ、およびマシンの
.Xr portmap 8
サービスでの
.Fa port
の間にマッピングを確立します。
.Fa protocol
の値は、ほとんどの場合
.Dv IPPROTO_UDP
.Dv IPPROTO_TCP .
です。
このルーチンは問題がないと 1 を戻し、問題がある場合は 0 を戻します。
これは、
.Fn svc_register
で自動的に実行されます。
.Pp
.It Xo
.Ft bool_t
.Fn pmap_unset "u_long prognum" "u_long versnum"
.Xc
.Pp
.Xr portmap 8
サービスのユーザインタフェースで、
.Pq Fa prognum , versnum , *
の 3 つ、および
.Xr portmap 8
サービスでの
.Fa port
の間に存在するマッピングをすべて破壊します。
このルーチンは、問題がなければ 1 を戻し、問題がある場合は 0 を戻します。
.Pp
.It Xo
.Ft bool_t
.Fo registerrpc
.Fa "u_long prognum"
.Fa "u_long versnum"
.Fa "u_long procnum"
.Fa "char *(*procname)(void)"
.Fa "xdrproc_t inproc"
.Fa "xdrproc_t outproc"
.Fc
.Xc
.Pp
.Tn RPC
サービスパッケージでプロシージャ
.Fa procname
を登録します。
プログラム
.Fa prognum
バージョン
.Fa versnum
プロシージャ
.Fa procnum
が要求されると、パラメータのポインタで
.Fa procname
が呼び出されます。
.Fa progname
は、静的結果のポインタを戻します。
.Fa inproc
はパラメータのデコードに使用され、
.Fa outproc
は結果のエンコードに使用されます。
このルーチンは、登録で問題が発生しなければ 0 を戻し、
問題が発生したら \-1 を戻します。
.Pp
警告: この形式で登録されたリモートプロシージャは、
.Tn UDP/IP
トランスポートでアクセスされます。
制限事項については
.Fn svcudp_create
を参照してください。
.Pp
.It Xo
.Vt "struct rpc_createerr" rpc_createerr ;
.Xc
.Pp
エラーになった
.Tn RPC
クライアント作成ルーチンで値が設定されるグローバル変数です。
エラーの原因を出力するには、ルーチン
.Fn clnt_pcreateerror
を使用します。
.Pp
.It Xo
.Ft bool_t
.Fn svc_destroy "SVCXPRT * xprt"
.Xc
.Pp
.Tn RPC
サービス転送ハンドル
.Fa xprt
を破壊するマクロです。
一般的に破壊処理には、
.Fa xprt
も含むプライベートデータ構造の解放も含まれます。
このルーチンを呼び出した後で
.Fa xprt
を使用した結果は不定となります。
.Pp
.It Xo
.Vt fd_set svc_fdset ;
.Xc
.Pp
.Tn RPC
サービスサイドの読み込みファイル記述子ビットマスクを表すグローバル変数です。
.Xr select 2
システムコールのテンプレートパラメータとして最適です。
サービスの設計者が
.Fn svc_run
を呼び出さず、非同期のイベント処理を行う場合のみに重要です。
この変数は読み込み専用ですが
(アドレスを
.Xr select 2
に渡しませんが)、
.Fn svc_getreqset
か作成ルーチンを呼び出した後で変更できます。
.Dv FD_SETSIZE ,
を越える記述子の制限がプロセスにある場合、この変数は
.Dv FD_SETSIZE
記述子でしか使用できないことに注意してください。
.Pp
.It Xo
.Vt int svc_fds ;
.Xc
.Pp
.Va svc_fdset
に似ていますが、32 個の記述子に制限されています。
このインタフェースは
.Va svc_fdset
で置き換えられました。
.Pp
.It Xo
.Ft bool_t
.Fn svc_freeargs "SVCXPRT *xprt" "xdrproc_t inproc" "char *in"
.Xc
.Pp
.Tn RPC/XDR
システムが
.Fn svc_getargs
を使用して引数をサービスプロシージャにデコードした場合に
割り振ったデータを解放するマクロです。
このルーチンは、結果が問題なく解放されると 1 を戻し、
問題が発生した場合は 0 を戻します。
.Pp
.It Xo
.Ft bool_t
.Fn svc_getargs "SVCXPRT *xprt" "xdrproc_t inproc" "char *in"
.Xc
.Pp
.Tn RPC
サービス転送ハンドル
.Fa xprt
.Tn RPC
要求の引数をデコードするマクロです。
パラメータ
.Fa in
は、引数を配置する場所のアドレスです。
.Fa inproc
は、引数をデコードする
.Tn XDR
ルーチンです。
このルーチンは、デコードで問題が発生しなければ 1 を戻し、
問題が発生した場合は 0 を戻します。
.Pp
.It Xo
.Ft "struct sockaddr_in *"
.Xc
.It Xo
.Fn svc_getcaller "SVCXPRT *xprt"
.Xc
.Pp
.Tn RPC
サービス転送ハンドル
.Fa xprt
に関連するプロシージャの呼び出し側の
ネットワークアドレスを入手する確実な方法です。
.Pp
.It Xo
.Ft void
.Fn svc_getreqset "fd_set *rdfds"
.Xc
.Pp
このルーチンは、サービスの設計者が
.Fn svc_run
を呼び出さず、独自の非同期イベント処理を実現する場合にのみ重要です。
.Tn RPC
要求が
.Tn RPC
ソケットに到着したと
.Xr select 2
システムコールが判断した場合に呼び出されます。
.Fa rdfds
は、作成された読み込み記述子ビットマスクです。
このルーチンは、
.Fa rdfds
の値に関連したすべてのソケットサービスを受けた場合に戻ります。
.Pp
.It Xo
.Ft void
.Fn svc_getreq "int rdfds"
.Xc
.Pp
.Fn svc_getreqset ,
に似ていますが、32 個の記述子に制限されています。
このインタフェースは
.Fn svc_getreqset
で置き換えられました。
.Pp
.It Xo
.Ft bool_t
.Fo svc_register
.Fa "SVCXPRT *xprt"
.Fa "u_long prognum"
.Fa "u_long versnum"
.Fa "void (*dispatch)(struct svc_req *, SVCXPRT *)"
.Fa "int protocol"
.Fc
.Xc
.Pp
.Fa prognum
.Fa versnum
をサービスディスパッチプロシージャ
.Fn dispatch
に関連付けます。
.Fa protocol
が 0 である場合、サービスは
.Xr portmap 8
サービスで登録されません。
.Fa protocol
が 0 以外である場合、
.Pq Fa prognum , versnum , protocol
の 3 つと
.Fa xprt\->xp_port
のマッピングがローカル
.Xr portmap 8
サービスで確立されます
(一般的に
.Fa protocol
は 0 か
.Dv IPPROTO_UDP
.Dv IPPROTO_TCP
です)。
プロシージャ
.Fn dispatch
の形式は以下の通りです。
.Bd -ragged -offset indent
.Fn bool_t
.Fn dispatch "struct svc_req *request" "SVCXPRT *xprt"
.Ed
.Pp
.Fn svc_register
ルーチンは、問題がなければ 1 を戻し、問題がある場合は 0 を戻します。
.Pp
.It Xo
.Fn svc_run
.Xc
.Pp
このルーチンは戻りません。
.Tn RPC
要求の到着を待ち、到着すると
.Fn svc_getreq
を使用して適切なサービスプロシージャを呼び出します。
通常の場合、このプロシージャは、
.Xr select 2
システムコールが戻るのを待ちます。
.Pp
.It Xo
.Ft bool_t
.Fn svc_sendreply "SVCXPRT *xprt" "xdrproc_t outproc" "char *out"
.Xc
.Pp
.Tn RPC
サービスのディスパッチルーチンで呼び出され、
リモートプロシージャコールの結果を送信します。
パラメータ
.Fa xprt
は要求の関連転送ハンドルです。
.Fa outproc
は、結果のエンコードに使用する
.Tn XDR
ルーチンです。
.Fa out
は結果のアドレスです。
このルーチンは、問題がなければ 1 を戻し、問題がある場合は 0 を戻します。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn svc_unregister "u_long prognum" "u_long versnum"
.Xc
.Pp
.Pq Fa prognum , versnum
の 2 つとディスパッチルーチンのマッピング、および
.Pq Fa prognum , versnum , *
の 3 つとポート番号のマッチングをすべて削除します。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn svcerr_auth "SVCXPRT *xprt" "enum auth_stat why"
.Xc
.Pp
認証エラーのために、リモートプロシージャコールの実行を拒否する
サービスディスパッチルーチンが呼び出します。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn svcerr_decode "SVCXPRT *xprt"
.Xc
.Pp
パラメータを問題なくデコードできない
サービスディスパッチルーチンが呼び出します。
.Fn svc_getargs
も参照してください。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn svcerr_noproc "SVCXPRT *xprt"
.Xc
.Pp
呼び出し側が要求したプロシージャ番号を
実現しないサービスディスパッチルーチンが呼び出します。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn svcerr_noprog "SVCXPRT *xprt"
.Xc
.Pp
目的のプログラムが
.Tn RPC
パッケージで登録されていない場合に呼び出されます。
サービスの設計者には、通常の場合このルーチンは必要ありません。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn svcerr_progvers "SVCXPRT *xprt" "u_long low_vers" "u_long high_vers"
.Xc
.Pp
プログラムの目的のバージョンが
.Tn RPC
パッケージで登録されていない場合に呼び出されます。
サービスの設計者には、通常の場合このルーチンは必要ありません。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn svcerr_systemerr "SVCXPRT *xprt"
.Xc
.Pp
サービスディスパッチルーチンが、
特定プロトコルでカバーされていないシステムエラーを検出した場合に呼び出します。
たとえばサービスが記憶域を割り振れない場合は、
このルーチンが呼び出されます。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn svcerr_weakauth "SVCXPRT *xprt"
.Xc
.Pp
認証パラメータが足りないために、
リモートプロシージャコールの実行を拒否する
サービスディスパッチルーチンが呼び出します。
このルーチンは、
.Fn svcerr_auth xprt AUTH_TOOWEAK
を呼び出します。
.Pp
.It Xo
.Ft "SVCXPRT *"
.Xc
.It Xo
.Fn svcraw_create void
.Xc
.Pp
ポインタを戻すためのトイ
.Tn RPC
クライアントを作成します。
実際のトランスポートは、
プロセスのアドレススペース内にあるバッファなので、対応する
.Tn RPC
クライアントは同じアドレススペースに存在する必要があります。
.Fn clntraw_create
を参照してください。
このルーチンにより、
.Tn RPC
のシミュレーション、およびラウンドトリップタイムなど、
.Tn RPC
オーバヘッドの取得をカーネルの干渉なしに実行できます。
このルーチンは、エラーが発生すると
.Dv NULL
を戻します。
.Pp
.It Xo
.Ft "SVCXPRT *"
.Xc
.It Xo
.Fn svctcp_create "int sock" "u_int send_buf_size" "u_int recv_buf_size"
.Xc
.Pp
ポインタを戻す、
.Tn TCP/IP
ベースの
.Tn RPC
サービストランスポートを作成します。
トランスポートにはソケット
.Fa sock
が関連します。ソケットが
.Dv RPC_ANYSOCK
である場合は、新しいソケットが作成されます。
ソケットがローカル
.Tn TCP
ポートに結合していない場合、
このルーチンはソケットを任意のポートに結合します。処理が終わると、
.Fa xprt\->xp_sock
はトランスポートのソケット記述子になり、
.Fa xprt\->xp_port
はトランスポートのポート番号になります。
このルーチンは、エラーが発生すると
.Dv NULL
を戻します。
.Tn TCP
ベースの
.Tn RPC
はバッファによる
.Tn I/O
を使用するので、ユーザはバッファサイズを指定できます。
値を 0 にすると、適切なデフォルトが選択されます。
.Pp
.It Xo
.Ft "SVCXPRT *"
.Xc
.It Xo
.Fn svcfd_create "int fd" "u_int sendsize" "u_int recvsize"
.Xc
.Pp
開いている記述子の最上位にサービスを作成します。
一般的にこの記述子は、
.Tn TCP
などのストリームプロトコルの接続済みソケットです。
.Fa sendsize
.Fa recvsize
は、送信バッファと受信バッファのサイズを指定します。
このサイズが 0 である場合は、適切なデフォルトが選択されます。
.Pp
.It Xo
.Ft "SVCXPRT *"
.Xc
.It Xo
.Fn svcudp_bufcreate "int sock" "u_int sendsize" "u_int recvsize"
.Xc
.Pp
ポインタを戻す
.Tn UDP/IP
ベースの
.Tn RPC
サービストランスポートを作成します。
トランスポートにはソケット
.Fa sock
が関連します。ソケットが
.Dv RPC_ANYSOCK
である場合は、新しいソケットが作成されます。
ソケットがローカル
.Tn UDP
ポートに結合していない場合、
このルーチンはソケットを任意のポートに結合します。
処理が終わると、
.Fa xprt\->xp_sock
はトランスポートのソケット記述子になり、
.Fa xprt\->xp_port
はトランスポートのポート番号になります。
このルーチンは、エラーが発生すると
.Dv NULL
を戻します。
.Pp
これにより、ユーザは、
.Tn UDP
ベースの送信
.Tn RPC
メッセージと受信メッセージの最大パケットサイズを指定できます。
.Pp
.It Xo
.Ft bool_t
.Fn xdr_accepted_reply "XDR *xdrs" "struct accepted_reply *ar"
.Xc
.Pp
.Tn RPC
応答メッセージのエンコードに使用します。
このルーチンでは、
.Tn RPC
パッケージを使用せずに、
.Tn RPC
スタイルのメッセージを作成する場合に便利です。
.Pp
.It Xo
.Ft bool_t
.Fn xdr_authunix_parms "XDR *xdrs" "struct authunix_parms *aupp"
.Xc
.Pp
.Ux
証明書の記述に使用します。
このルーチンは、
.Tn RPC
認証パッケージを使用せずに、証明書を作成する場合に便利です。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Ft bool_t
.Fn xdr_callhdr "XDR *xdrs" "struct rpc_msg *chdr"
.Xc
.Pp
.Tn RPC
コールヘッダメッセージの記述に使用します。
このルーチンでは、
.Tn RPC
パッケージを使用せずに、
.Tn RPC
スタイルのメッセージを作成する場合に便利です。
.Pp
.It Xo
.Ft bool_t
.Fn xdr_callmsg "XDR *xdrs" "struct rpc_msg *cmsg"
.Xc
.Pp
.Tn RPC
コールメッセージの記述に使用します。
このルーチンは、
.Tn RPC
パッケージを使用せずに、
.Tn RPC
スタイルのメッセージを作成する場合に便利です。
.Pp
.It Xo
.Ft bool_t
.Fn xdr_opaque_auth "XDR *xdrs" "struct opaque_auth *ap"
.Xc
.Pp
.Tn RPC
認証情報メッセージの記述に使用します。
このルーチンでは、
.Tn RPC
パッケージを使用せずに、
.Tn RPC
スタイルのメッセージを作成する場合に便利です。
.Pp
.It Xo
.Vt struct pmap ;
.Xc
.It Xo
.Ft bool_t
.Fn xdr_pmap "XDR *xdrs" "struct pmap *regs"
.Xc
.Pp
さまざまな
.Xr portmap 8
プロシージャのパラメータの記述に外部的に使用します。
このルーチンは、
.Fn pmap_*
インタフェースを使用せずに、このパラメータを作成する場合に便利です。
.Pp
.It Xo
.Ft bool_t
.Fn xdr_pmaplist "XDR *xdrs" "struct pmaplist **rp"
.Xc
.Pp
ポートマッピングのリストの記述に外部的に使用します。
このルーチンは、
.Fn pmap_*
インタフェースを使用せずに、このパラメータを作成する場合に便利です。
.Pp
.It Xo
.Ft bool_t
.Fn xdr_rejected_reply "XDR *xdrs" "struct rejected_reply *rr"
.Xc
.Pp
.Tn RPC
応答メッセージの記述に使用します。
このルーチンは
.Tn RPC
パッケージを使用せずに、
.Tn RPC
スタイルのメッセージを作成する場合に便利です。
.Pp
.It Xo
.Ft bool_t
.Fn xdr_replymsg "XDR *xdrs" "struct rpc_msg *rmsg"
.Xc
.Pp
.Tn RPC
応答メッセージの記述に使用します。
このルーチンは
.Tn RPC
パッケージを使用せずに、
.Tn RPC
スタイルのメッセージを作成する場合に便利です。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn xprt_register "SVCXPRT *xprt"
.Xc
.Pp
.Tn RPC
サービストランスポートハンドルが作成されたら、
.Tn RPC
サービスパッケージで登録する必要があります。
このルーチンは、グローバル変数
.Va svc_fds
を修正します。サービスの設計者には、
通常の場合このルーチンは必要ありません。
.Pp
.It Xo
.Ft void
.Xc
.It Xo
.Fn xprt_unregister "SVCXPRT *xprt"
.Xc
.Pp
.Tn RPC
サービストランスポートハンドルを破壊する前には、
.Tn RPC
サービスパッケージで登録を解除する必要があります。
このルーチンは、グローバル変数
.Va svc_fds
を修正します。サービスの設計者には、
通常の場合このルーチンは必要ありません。
.El
.Sh 関連項目
.Xr rpc_secure 3 ,
.Xr xdr 3
.Rs
.%T "Remote Procedure Calls: Protocol Specification"
.Re
.Rs
.%T "Remote Procedure Call Programming Guide"
.Re
.Rs
.%T "rpcgen Programming Guide"
.Re
.Rs
.%T "RPC: Remote Procedure Call Protocol Specification"
.%O RFC1050
.%Q "Sun Microsystems, Inc., USC-ISI"
.Re