Manpages

名 前

rpc − 遠 隔 手 続 き 呼 び 出 し (RPC)の た め の ラ イ ブ ラ リ ル ー テ ィ ン

書 式 と 説 明

こ れ ら の ル ー テ ィ ン は C プ ロ グ ラ ム で ネ ッ ト ワ ー ク を 通 し て 他 の マ シ ン に ア ク セ ス す る プ ロ シ ー ジ ャ ー を 作 成 す る こ と を 可 能 に す る 。 最 初 に ク ラ イ ア ン ト は デ ー タ パ ケ ッ ト を サ ー バ に 送 る た め に プ ロ シ ー ジ ャ ー を 呼 び 出 す 。 サ ー バ は パ ケ ッ ト を 受 け 取 る と 、 配 分 ル ー チ ン を 呼 び 出 し て 要 求 さ れ た サ ー ビ ス に 実 行 し 、 返 答 を 送 り 返 す 。 最 後 に プ ロ シ ー ジ ャ ー コ ー ル は ク ラ イ ア ン ト へ と 戻 る 。 こ れ ら の ル ー テ ィ ン を 使 用 す る に は 、 ヘ ッ ダ ー フ ァ イ ル <rpc/rpc.h> を イ ン ク ル ー ド す る こ と 。 下 記 の プ ロ ト タ イ プ で は 次 の 型 を 使 用 し て い る 。

typedef int bool_t;

typedef bool_t (*xdrproc_t) (XDR *, void *, ...);

typedef bool_t (*resultproc_t) (caddr_t resp,
struct sockaddr_in *
raddr);AUTH, CLIENT, SVCXPRT, XDR の 宣 言 に つ い て は ヘ ッ ダ ー フ ァ イ ル を 参 照 。

void auth_destroy(AUTH *auth); こ の マ ク ロ は auth に 関 連 付 け ら れ た 認 証 情 報 を 破 壊 す る 。 破 壊 は 通 常 は 私 的 な デ ー タ 構 造 の 破 棄 を 含 ん で い る 。 auth_destroy() を 呼 び 出 し た 後 に auth を 使 用 す る こ と は 未 定 義 で あ る 。

AUTH *authnone_create(void); 各 リ モ ー ト プ ロ シ ー ジ ャ ー コ ー ル で 使 用 で き な い 仮 の 認 証 情 報 と し て 渡 さ れ る RPC 認 証 ハ ン ド ル を 作 成 し て 返 す 。 こ れ は RPC で 使 用 さ れ る デ フ ォ ル ト の 認 証 で あ る 。

AUTH *authunix_create(char *host, int uid, int gid,
int
len, int *aup_gids); 認 証 情 報 を 含 ん だ RPC 認 証 ハ ン ド ル を 作 成 し て 返 す 。 host パ ラ メ ー タ ー は 情 報 が 作 成 さ れ た マ シ ン の 名 前 で あ る 。 uid は そ の ユ ー ザ ー の ユ ー ザ ー IDgid は そ の ユ ー ザ ー の 現 在 の グ ル ー プ ID で あ る 。 lenaup_gids は そ の ユ ー ザ ー が 所 属 す る グ ル ー プ の 配 列 を 参 照 し て い る 。 他 の ユ ー ザ ー に な り す ま す こ と は 簡 単 で あ る 。

AUTH *authunix_create_default(void); 適 切 な パ ラ メ ー タ ー で authunix_create() を 呼 び 出 す 。

int callrpc(char *host, unsigned long prognum,
unsigned long
versnum, unsigned long procnum,
xdrproc_t
inproc, char *in,
xdrproc_t
outproc, char *out); マ シ ン host 上 で prognum, versnum, procnum に 関 連 付 け ら れ た リ モ ー ト プ ロ シ ー ジ ャ ー を 呼 び 出 す 。 パ ラ メ ー タ ー in は プ ロ シ ー ジ ャ ー の 引 き 数 の ア ド レ ス で あ り out は 結 果 を 格 納 す る ア ド レ ス で あ る 。 inproc は プ ロ シ ー ジ ャ ー の パ ラ メ ー タ ー を エ ン コ ー ド す る の に 使 用 さ れ 、 outproc は 結 果 を デ コ ー ド す る の に 使 用 さ れ る 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 に は ゼ ロ を 返 す 。 失 敗 し た 場 合 に は enum clnt_stat を 整 数 に キ ャ ス ト し た 値 を 返 す 。 clnt_perrno() ル ー テ ィ ン が 失 敗 の 状 態 を メ ッ セ ー ジ に 変 換 す る の に 使 用 で き る 。 警 告 : こ の ル ー テ ィ ン で リ モ ー ト プ ロ シ ー ジ ャ ー を 呼 び 出 す と 通 信 に は UDP/IP が 使 用 さ れ る 。 こ の 際 の 制 限 に つ い て は clntudp_create() を 参 照 す る こ と 。 こ の ル ー テ ィ ン を 使 用 し て 認 証 や 時 間 切 れ の 制 御 を す る こ と は で き な い 。

enum clnt_stat clnt_broadcast(unsigned long prognum,
unsigned long
versnum, unsigned long procnum,
xdrproc_t
inproc, char *in,
xdrproc_t
outproc, char *out,
resultproc_t
eachresult);

callrpc() と 同 様 で あ る が 、 メ ッ セ ー ジ が ロ ー カ ル の ブ ロ ー ド キ ャ ス ト ネ ッ ト ワ ー ク 全 体 へ と ブ ロ ー ド キ ャ ス ト さ れ る 点 が 異 っ て い る 。 回 答 を 受 け 取 る 度 に こ の ル ー テ ィ ン は 以 下 の 形 式 の eachresult() を 呼 び 出 す 。

eachresult(char *out, struct sockaddr_in *addr); こ こ で outclnt_broadcast() に 渡 さ れ る out と 同 じ で あ る が 、 リ モ ー ト プ ロ シ ー ジ ャ ー か ら の 出 力 が デ コ ー ド さ れ て い る 点 の み が 異 っ て い る 。 addr は 結 果 を 送 っ て 来 た マ シ ン の ア ド レ ス を 指 し て い る 。 eachresult() が ゼ ロ を 返 し た 場 合 、 clnt_broadcast() は さ ら な る 回 答 を 待 つ 。 そ う で な け れ ば 適 切 な 状 態 で 終 了 す る 。 警 告 : ブ ロ ー ド キ ャ ス ト ソ ケ ッ ト は デ ー タ リ ン ク 層 の 最 大 転 送 単 位 に 制 限 さ れ て い る 。 イ ー サ ネ ッ ト の 場 合 、 最 大 値 は 1500 バ イ ト で あ る 。

enum clnt_stat clnt_call(CLIENT *clnt, unsigned long procnum,
xdrproc_t
inproc, char *in,
xdrproc_t
outproc, char *out,
struct timeval
tout); こ の マ ク ロ は ク ラ イ ア ン ト ハ ン ド ル clnt に 関 連 付 け ら れ た procnum リ モ ー ト プ ロ シ ー ジ ャ ー を 呼 び 出 す 。 ク ラ イ ア ン ト ハ ン ド ル は clnt_create() の よ う な RPC ク ラ イ ア ン ト 作 成 ル ー テ ィ ン に よ っ て 得 ら れ る 。 パ タ メ ー タ in は プ ロ シ ー ジ ャ ー の 引 き 数 の ア ド レ ス で あ る 。 out は プ ロ シ ー ジ ャ ー の 返 り 値 を 格 納 す る ア ド レ ス で あ る 。 inproc は プ ロ シ ー ジ ャ ー の パ ラ メ ー タ ー を エ ン コ ー ド す る の に 使 用 さ れ る 。 outproc は プ ロ シ ー ジ ャ ー の 返 り 値 を デ コ ー ド す る の に 使 用 さ れ る 。 tout は 結 果 が 返 さ れ る の を 待 つ 時 間 で あ る 。

clnt_destroy(CLIENT *clnt); こ の マ ク ロ は ク ラ イ ア ン ト の RPC ハ ン ド ル を 破 壊 す る 。 破 壊 に は 通 常 は clnt 自 身 も 含 め て 私 的 な デ ー タ 構 造 体 の 破 棄 が 含 ま れ て い る 。 clnt_destroy() の 呼 び 出 し の 後 に clnt を 使 用 す る こ と は 未 定 義 で あ る 。 RPC ラ イ ブ ラ リ が 関 連 す る ソ ケ ッ ト を オ ー プ ン し た 場 合 に は 、 そ れ も 閉 じ ら れ る 。 そ れ 以 外 の 場 合 に は ソ ケ ッ ト は オ ー プ ン さ れ た ま ま で あ る 。

CLIENT *clnt_create(char *host, unsigned long prog,
unsigned long
vers, char *proto); 一 般 的 な ク ラ イ ア ン ト の 作 成 ル ー テ ィ ン で あ る 。 host は サ ー バ の あ る リ モ ー ト ホ ス ト の 名 前 を 指 定 す る 。 proto ど の よ う な 通 信 プ ロ ト コ ル を 使 用 す る か を 指 定 す る 。 現 在 こ こ に 使 用 で き る 値 は “udp” と “tcp” で あ る 。 デ フ ォ ル ト の 時 間 切 れ が 設 定 さ れ る が 、 clnt_control() を 使 用 し て 変 更 可 能 で あ る 。 警 告 : UDP を 使 用 し た 場 合 に は 欠 点 が あ る 。 UDP に 基 づ い た RPC メ ッ セ ー ジ は 最 大 で も 8 KByte の エ ン コ ー ド デ ー タ し か 保 持 す る こ と が で き な い た め 、 大 き な 引 き 数 や 巨 大 な 結 果 を 取 る プ ロ シ ー ジ ャ ー に は 使 用 す る こ と が で き な い 。

bool_t clnt_control(CLIENT *cl, int req, char *info); こ の マ ク ロ は 各 種 ク ラ イ ア ン ト に つ い て 情 報 を 変 更 し た り 、 取 得 し た り す る の に 使 用 す る 。 req は 操 作 の 種 類 を 指 定 す る 。 info は 情 報 へ の ポ イ ン タ ー で あ る 。 UDP と TCP ど ち ら の 場 合 も 使 用 可 能 な req の 値 と 、 そ の 引 き 数 の 型 、 お よ び そ の 内 容 は 以 下 の 通 り で あ る :

CLSET_TIMEOUT struct timeval // 時 間 切 れ を 設 定 す る
CLGET_TIMEOUT
struct timeval // 時 間 切 れ を 取 得 す る 注 意 : clnt_control() を 使 用 し て 時 間 切 れ を 設 定 し た 場 合 に は そ れ 以 後 は clnt_call() に 渡 さ れ る 時 間 切 れ パ ラ メ ー タ ー は 全 て 無 視 さ れ る 。

CLGET_SERVER_ADDR struct sockaddr_in // サ ー バ ア ド レ ス を 取 得 す る 以 下 の 操 作 は UDP の 場 合 に の み 有 効 で あ る :

CLSET_RETRY_TIMEOUT struct timeval // 再 送 間 隔 を 設 定 す る
CLGET_RETRY_TIMEOUT
struct timeval // 再 送 間 隔 を 取 得 す る 再 送 間 隔 は 次 に 要 求 を 再 送 す る 前 に "UDP RPC" が サ ー バ の 回 答 を 待 つ 時 間 で あ る 。

clnt_freeres(CLIENT * clnt, xdrproc_t outproc, char *out); こ の マ ク ロ は RPC 呼 び 出 し の 結 果 の デ コ ー ド の 際 に RPC/XDR シ ス テ ム に よ っ て 割 当 て ら れ た デ ー タ を 解 放 す る 。 パ ラ メ ー タ ー out は 結 果 の ア ド レ ス で あ る 。 outproc は 結 果 を 記 述 し て い る XDR ル ー テ ィ ン で あ る 。 こ の ル ー テ ィ ン は 結 果 の 解 放 に 成 功 し た 場 合 に は 1 を 返 す 。 失 敗 し た 場 合 に は ゼ ロ を 返 す 。

void clnt_geterr(CLIENT *clnt, struct rpc_err *errp); こ の マ ク ロ は ク ラ イ ア ン ト ハ ン ド ル の エ ラ ー 構 造 体 を errp ア ド レ ス で 指 定 さ れ た 構 造 体 へ コ ピ ー す る 。

void clnt_pcreateerror(char *s); 標 準 エ ラ ー 出 力 に 、 な ぜ ク ラ イ ア ン ト RPC ハ ン ド ル の 作 成 が で き な か っ た か に つ い て の メ ッ セ ー ジ を 表 示 す る 。 メ ッ セ ー ジ の 前 に 文 字 列 s と コ ロ ン (:)が 表 示 さ れ る 。 clnt_create(), clntraw_create(), clnttcp_create(), clntudp_create() の 呼 び 出 し が 失 敗 し た 時 に 使 用 す る こ と 。

void clnt_perrno(enum clnt_stat stat); 標 準 エ ラ ー 出 力 に stat に よ っ て 指 示 さ れ る エ ラ ー 状 態 に 対 応 す る メ ッ セ ー ジ を 表 示 す る 。 callrpc() の 後 に 使 用 す る こ と 。

clnt_perror(CLIENT *clnt, char *s); 標 準 エ ラ ー 出 力 に 、 な ぜ RPC 呼 び 出 し が 失 敗 し た か に つ い て の メ ッ セ ー ジ を 表 示 す る 。 clnt は コ ー ル に 使 用 し た ハ ン ド ル で あ る 。 メ ッ セ ー ジ の 前 に 文 字 列 s と コ ロ ン (:)が 表 示 さ れ る 。 clnt_call() が 失 敗 し た 後 に 使 用 す る こ と 。

char *clnt_spcreateerror(char *s);

clnt_pcreateerror() と 同 様 で あ る が 、 標 準 エ ラ ー 出 力 へ 表 示 す る か わ り に 文 字 列 を 返 す 点 が 異 っ て い る 。 バ グ : 静 的 な 領 域 へ の ポ イ ン タ ー を 返 す た め 、 呼 び 出 し ご と に 上 書 き さ れ る 。

char *clnt_sperrno(enum clnt_stat stat);

clnt_perrno() と 同 じ 引 き 数 を 取 る が 、 な ぜ RPC 呼 び 出 し が 失 敗 し た か に つ い て の メ ッ セ ー ジ を 標 準 エ ラ ー 出 力 に 表 示 す る か わ り に 、 メ ッ セ ー ジ を 格 納 し て い る 文 字 列 へ の ポ イ ン タ ー を 返 す 。 文 字 列 は NEWLINE(改 行 ) で 終 っ て い る 。

clnt_sperrno() は プ ロ グ ラ ム が 標 準 エ ラ ー 出 力 を 持 っ て い な い 場 合 (プ ロ グ ラ ム が サ ー バ と し て 走 っ て い る 場 合 に は よ く あ り え る )や 、 プ ロ グ ラ マ ー が メ ッ セ ー ジ を printf(3) で 出 力 す る こ と を 望 ま な い 場 合 や 、 メ ッ セ ー ジ の 形 式 が clnt_perrno() が サ ポ ー ト す る も の と は 異 っ て い る 場 合 な ど に clnt_perrno() の か わ り に 使 用 さ れ る 。 注 意 : clnt_sperror() や clnt_spcreaterror() と は 違 っ て clnt_sperrno() は 静 的 デ ー タ へ の ポ イ ン タ ー を 返 す 。 し か し 呼 び 出 し ご と に 上 書 き さ れ る こ と は な い 。

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

clnt_perror() と 同 様 で あ る が 、 標 準 エ ラ ー 出 力 に 表 示 す る 代 り に (clnt_sperrno() の よ う に ) 文 字 列 へ の ポ イ ン タ ー を 返 す 点 が 異 っ て い る 。 バ グ : 静 的 な 領 域 へ の ポ イ ン タ ー を 返 す た め 、 呼 び 出 し ご と に 上 書 き さ れ る 。

CLIENT *clntraw_create(unsigned long prognum, unsigned long versnum); こ の ル ー テ ィ ン は リ モ ー ト プ ロ グ ラ ム prognum、 バ ー ジ ョ ン versnum の た め の 擬 似 RPC ク ラ イ ア ン ト を 作 成 す る 。 メ ッ セ ー ジ を サ ー ビ ス に 渡 す た め に 使 用 す る 通 信 は 実 際 に は そ の プ ロ セ ス の ア ド レ ス 空 間 に あ る バ ッ フ ァ ー で あ る 。 そ れ で 、 対 応 す る RPC サ ー バ が 同 じ ア ド レ ス 空 間 の 中 に い な け れ ば な ら な い 。 svcraw_create() を 参 照 す る こ と 。 こ れ に よ り RPC の シ ミ ュ レ ー シ ョ ン や 、 カ ー ネ ル イ ン タ ー フ ェ ー ス に 影 響 さ れ ず に 応 答 時 間 な ど の RPC オ ー バ ヘ ッ ド の 獲 得 が で き る 。 失 敗 し た 場 合 に は こ の ル ー テ ィ ン は NULL を 返 す 。

CLIENT *clnttcp_create(struct sockaddr_in *addr,
unsigned long
prognum, unsigned long versnum,
int *
sockp, unsigned int sendsz, unsigned int recvsz); こ の ル ー テ ィ ン は リ モ ー ト プ ロ グ ラ ム prognum、 バ ー ジ ョ ン versnum の た め の RPC ク ラ イ ア ン ト を 作 成 す る 。 ク ラ イ ア ン ト は 通 信 に TCP/IP を 使 用 す る 。 リ モ ー ト プ ロ グ ラ ム は イ ン タ ー ネ ッ ト ア ド レ ス の *addr に あ る 。 addr−>sin_port が ゼ ロ な ら ば 、 実 際 に リ モ ー ト プ ロ グ ラ ム が listen し て い る ポ ー ト が 設 定 さ れ る 。 (こ の 情 報 の た め に リ モ ー ト の portmap サ ー ビ ス が 利 用 さ れ る 。 ) パ ラ メ ー タ ー sockp は ソ ケ ッ ト で あ る 。 も し こ れ が RPC_ANYSOCK に 設 定 さ れ て い る 場 合 は 、 こ の ル ー テ ィ ン が 新 し い ソ ケ ッ ト を オ ー プ ン し て sockp に 設 定 す る 。 TCP に 基 づ い た RPC は バ ッ フ ァ ー さ れ た I/O を 使 用 す る た め 、 ユ ー ザ ー は パ ラ メ ー タ ー sendszrecvsz を 使 用 し て 送 信 バ ッ フ ァ ー と 受 信 バ ッ フ ァ ー の サ イ ズ を 指 定 す る こ と が で き る 。 ゼ ロ を 指 定 し た 場 合 に は 適 切 な デ フ ォ ル ト が 選 択 さ れ る 。 こ の ル ー テ ィ ン は 失 敗 し た 場 合 は NULL を 返 す 。

CLIENT *clntudp_create(struct sockaddr_in *addr,
unsigned long
prognum, unsigned long versnum,
struct timeval
wait, int *sockp); こ の ル ー テ ィ ン は リ モ ー ト プ ロ グ ラ ム prognum、 バ ー ジ ョ ン versnum の た め の RPC ク ラ イ ア ン ト を 作 成 す る 。 ク ラ イ ア ン ト は 通 信 に UDP/IP を 使 用 す る 。 リ モ ー ト プ ロ グ ラ ム は イ ン タ ー ネ ッ ト ア ド レ ス の *addr に あ る 。 addr−>sin_port が ゼ ロ な ら ば 、 実 際 に リ モ ー ト プ ロ グ ラ ム が listen し て い る ポ ー ト が 設 定 さ れ る 。 (こ の 情 報 の た め に リ モ ー ト の portmap サ ー ビ ス が 利 用 さ れ る 。 ) パ ラ メ ー タ ー sockp は ソ ケ ッ ト で あ る 。 も し こ れ が RPC_ANYSOCK に 設 定 さ れ て い る 場 合 は 、 こ の ル ー テ ィ ン が 新 し い ソ ケ ッ ト を オ ー プ ン し て sockp に 設 定 す る 。 UDP 通 信 は 回 答 が あ る か 、 時 間 切 れ が 起 こ る ま で wait 間 隔 で 呼 び 出 し メ ッ セ ー ジ を 再 送 す る 。 時 間 切 れ が 起 こ る ま で の 合 計 時 間 は clnt_call() で 指 定 す る 。 警 告 : UDP に 基 づ い た RPC メ ッ セ ー ジ は 最 大 で も 8 Kbyte ま で の エ ン コ ー ド さ れ た デ ー タ し か 保 持 で き な い た め 、 こ の 通 信 は 大 き な 引 き 数 や 巨 大 な 結 果 を 取 る プ ロ シ ー ジ ャ ー に は 使 用 で き な い 。

CLIENT *clntudp_bufcreate(struct sockaddr_in *addr,
unsigned long
prognum, unsigned long versnum,
struct timeval
wait, int *sockp,
unsigned int
sendsize, unsigned int recosize); こ の ル ー テ ィ ン は リ モ ー ト プ ロ グ ラ ム prognum、 バ ー ジ ョ ン versnum の た め の RPC ク ラ イ ア ン ト を 作 成 す る 。 ク ラ イ ア ン ト は 通 信 に UDP/IP を 使 用 す る 。 リ モ ー ト プ ロ グ ラ ム は イ ン タ ー ネ ッ ト ア ド レ ス の *addr に あ る 。 addr−>sin_port が ゼ ロ な ら ば 、 実 際 に リ モ ー ト プ ロ グ ラ ム が listen し て い る ポ ー ト が 設 定 さ れ る 。 (こ の 情 報 の た め に リ モ ー ト の portmap サ ー ビ ス が 利 用 さ れ る 。 ) パ ラ メ ー タ ー sockp は ソ ケ ッ ト で あ る 。 も し こ れ が RPC_ANYSOCK に 設 定 さ れ て い る 場 合 は 、 こ の ル ー テ ィ ン が 新 し い ソ ケ ッ ト を オ ー プ ン し て sockp に 設 定 す る 。 UDP 通 信 は 回 答 が あ る か 、 時 間 切 れ が 起 こ る ま で wait 間 隔 で 呼 び 出 し メ ッ セ ー ジ を 再 送 す る 。 時 間 切 れ が 起 こ る ま で の 合 計 時 間 は clnt_call() で 指 定 す る 。 こ れ を 使 用 す る と UDP に 基 づ い た RPC メ ッ セ ー ジ に お い て 送 信 パ ケ ッ ト や 受 信 パ ケ ッ ト の 最 大 サ イ ズ を 指 定 す る こ と が 可 能 に な る 。

void get_myaddress(struct sockaddr_in *addr); こ の マ シ ン の IP ア ド レ ス を *addr に 格 納 す る 。 /etc/hosts を 扱 う ラ イ ブ ラ リ ル ー テ ィ ン は 使 用 し な い 。 ポ ー ト 番 号 は 常 に htons(PMAPPORT) に 設 定 さ れ る 。

struct pmaplist *pmap_getmaps(struct sockaddr_in *addr);

portmap サ ー ビ ス の た め の ユ ー ザ ー イ ン タ ー フ ェ ー ス で あ り 、 IP ア ド レ ス *addr に あ る ホ ス ト の 現 在 の RPC プ ロ グ ラ ム か ら ポ ー ト 番 号 へ の マ ッ ピ ン グ の 一 覧 を 返 す 。 こ の ル ー テ ィ ン が NULL を 返 す 場 合 も あ る 。 ’rpcinfo −p’ コ マ ン ド は こ の ル ー テ ィ ン を 使 用 し て い る 。

unsigned short pmap_getport(struct sockaddr_in *addr,
unsigned long
prognum, unsigned long versnum,
unsigned int
protocol);

portmap サ ー ビ ス の た め の ユ ー ザ ー イ ン タ ー フ ェ ー ス で 、 プ ロ グ ラ ム 番 号 prognum、 バ ー ジ ョ ン versnum、 関 連 付 け ら れ た 通 信 プ ロ ト コ ル protocol を サ ポ ー ト す る サ ー ビ ス が 待 っ て い る ポ ー ト 番 号 を 返 す 。 protocol の 値 は ほ と ん ど の 場 合 IPPROTO_UDP か IPPROTO_TCP で あ る 。 返 り 値 ゼ ロ は マ ッ ピ ン グ が 存 在 し な い か 、 RPC シ ス テ ム が リ モ ー ト の portmap サ ー ビ ス の 参 照 に 失 敗 し た こ と を 意 味 す る 。 後 者 の 場 合 は 大 域 変 数 rpc_createerr が RPC 状 態 を 保 持 し て い る 。

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

portmap サ ー ビ ス の た め の ユ ー ザ ー イ ン タ ー フ ェ ー ス で 、 IP ア ド レ ス *addr の ホ ス ト の portmap を 参 照 し て 、 RPC 呼 び 出 し を 生 成 し 、 そ の ホ ス ト 上 の プ ロ シ ー ジ ャ ー を 呼 び 出 す 。 パ ラ メ ー タ ー *portp は プ ロ シ ー ジ ャ ー が 成 功 し た 場 合 に は プ ロ グ ラ ム の ポ ー ト 番 号 に 修 正 さ れ る 。 他 の パ ラ メ ー タ ー の 定 義 に つ い て は callrpc() や clnt_call() で 説 明 し て あ る 。 こ の プ ロ シ ー ジ ャ ー は “ping” の み に 使 用 す べ き で あ る 。 clnt_broadcast() も 参 照 す る こ と 。

bool_t pmap_set(unsigned long prognum, unsigned long versnum,
unsigned int
protocol, unsigned short port);

portmap サ ー ビ ス の た め の ユ ー ザ ー イ ン タ ー フ ェ ー ス で 、 [prognum,versnum,protocol] の 組 み 合 わ せ と port と の 間 の マ ッ ピ ン グ を 、 そ の マ シ ン 上 の portmap サ ー ビ ス に 登 録 す る 。 protocol は ほ と ん ど の 場 合 IPPROTO_UDPIPPROTO_TCP の ど ち ら か で あ る 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 に は 1 を 返 す 。 失 敗 し た 場 合 に は ゼ ロ を 返 す 。 svc_register() に よ っ て 自 動 的 に 実 行 さ れ る 。

bool_t pmap_unset(unsigned long prognum, unsigned long versnum);

portmap サ ー ビ ス の た め の ユ ー ザ ー イ ン タ ー フ ェ ー ス で 、 [prognum,versnum,*] の 組 み 合 わ せ と ports の 間 の マ ッ ピ ン グ を そ の マ シ ン 上 の portmap サ ー ビ ス か ら 削 除 す る 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 に は 0 を 返 す 。

int registerrpc(unsigned long prognum, unsigned long versnum,
unsigned long
procnum, char *(*procname)(char *),
xdrproc_t
inproc, xdrproc_t outproc);

RPC サ ー ビ ス パ ッ ケ ー ジ を 使 用 し て procname プ ロ シ ー ジ ャ ー を 登 録 す る 。 プ ロ グ ラ ム prognum、 バ ー ジ ョ ン versnum、 プ ロ シ ー ジ ャ ー procnum へ の 要 求 が 届 い た 場 合 、 procname が パ ラ メ ー タ ー へ の ポ イ ン タ ー を 持 っ て 呼 び 出 さ れ る 。 progname は 静 的 な 結 果 へ の ポ イ ン タ ー を 返 す 必 要 が あ る 。 inproc は パ ラ メ ー タ ー を デ コ ー ド す る た め に 使 用 さ れ る 。 outproc は 結 果 を エ ン コ ー ド す る た め に 使 用 さ れ る 。 こ の ル ー テ ィ ン は 登 録 に 成 功 し た 場 合 に は ゼ ロ を 返 す 。 失 敗 し た 場 合 に は −1 を 返 す 。 警 告 : こ の 形 式 で 登 録 さ れ た リ モ ー ト プ ロ シ ー ジ ャ ー は UDP/IP 通 信 を 使 用 す る 。 制 限 に 関 し て は svcudp_create() を 参 照 す る こ と 。

struct rpc_createerr rpc_createerr; 成 功 し な か っ た RPC ク ラ イ ア ン ト 生 成 ル ー テ ィ ン に よ っ て 設 定 さ れ る 大 域 変 数 。 clnt_pcreateerror() ル ー テ ィ ン が 理 由 を 表 示 す る た め に 使 用 す る 。

void svc_destroy(SVCXPRT *xprt); こ の マ ク ロ は 通 信 ハ ン ド ル xprt の RPC サ ー ビ ス を 破 壊 す る 。 破 壊 に は 通 常 、 xprt を 含 め て 、 私 的 な デ ー タ 構 造 体 の 破 棄 が 含 ま れ て い る 。 こ の ル ー テ ィ ン を 呼 び 出 し た 後 に xprt を 使 用 す る こ と は 未 定 義 で あ る 。

fd_set svc_fdset;

RPC サ ー ビ ス 側 の フ ァ イ ル デ ィ ス ク リ プ タ ー の ビ ッ ト マ ス ク を 反 映 し た 大 域 変 数 。 select(2) シ ス テ ム コ ー ル の パ ラ メ ー タ ー の た め に 利 用 で き る 。 こ れ は 、 サ ー ビ ス の 実 装 者 が svc_run() を 呼 び 出 さ ず に 、 独 自 の 非 同 期 イ ベ ン ト 処 理 を 用 い る 場 合 に の み 意 味 が あ る 。 こ の 変 数 は 読 み 込 み 専 用 で (そ の ま ま select(2) へ 渡 し て は な ら な い !)、 svc_getreqset() 呼 び 出 し や 生 成 ル ー テ ィ ン の 後 に 変 更 さ れ て い る か も し れ な い 。

int svc_fds;

svc_fdset に 似 て い る が 、 32 デ ィ ス ク リ プ タ ー に 制 限 さ れ て い る 。 こ の イ ン タ ー フ ェ ー ス は svc_fdset に よ っ て 置 き 換 え ら れ た 。

svc_freeargs(SVCXPRT *xprt, xdrproc_t inproc, char *in); こ の マ ク ロ は サ ー ビ ス プ ロ シ ー ジ ャ ー が svc_getargs() を 使 用 し て 引 き 数 を デ コ ー ド し た 時 に RPC/XDR シ ス テ ム に よ っ て 割 り 当 て ら れ た デ ー タ を 解 放 す る 。 こ の ル ー テ ィ ン は 解 放 に 成 功 し た 場 合 に は 1 を 返 す 。 失 敗 し た 場 合 に は ゼ ロ を 返 す 。

svc_getargs(SVCXPRT *xprt, xdrproc_t inproc, char *in); こ の マ ク ロ は RPC サ ー ビ ス 通 信 ハ ン ド ル xprt に 関 連 付 け ら れ た RPC 要 求 の 引 き 数 を デ コ ー ド す る 。 パ ラ メ ー タ ー in は 引 き 数 の 格 納 さ れ た ア ド レ ス で あ る 。 inproc は 引 き 数 を デ コ ー ド す る た め の XDR ル ー テ ィ ン で あ る 。 こ の ル ー テ ィ ン は デ コ ー ド に 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。

struct sockaddr_in *svc_getcaller(SVCXPRT *xprt);

RPC サ ー ビ ス 通 信 ハ ン ド ル xprt に 関 連 付 け ら れ た プ ロ シ ー ジ ャ ー の 呼 び 出 し 元 の ネ ッ ト ワ ー ク ア ド レ ス を 取 得 す る た め の 標 準 的 な 手 段 。

void svc_getreqset(fd_set *rdfds); こ の ル ー テ ィ ン は サ ー ビ ス の 実 装 者 が svc_run() を 呼 び 出 さ ず 、 独 自 の 非 同 期 イ ベ ン ト 処 理 を 実 装 す る 場 合 に の み 意 味 が あ る 。 こ れ は select(2) シ ス テ ム コ ー ル が RPC ソ ケ ッ ト に RPC 要 求 が 到 着 し た と 返 し た 場 合 に の み 呼 び 出 さ れ る 。 rdfds は 結 果 の 読 み 込 み フ ァ イ ル デ ィ ス ク リ プ タ ー の ビ ッ ト マ ス ク で あ る 。 こ の ル ー テ ィ ン は rdfds の 値 に 関 連 付 け ら れ た 全 て の ソ ケ ッ ト の サ ー ビ ス が 行 な わ れ た 時 に 返 っ て く る 。

void svc_getreq(int rdfds);

svc_getreqset() に 似 て い る が デ ィ ス ク リ プ タ ー の 数 が 32 に 制 限 さ れ て い る 。 こ の イ ン タ ー フ ェ ー ス は svc_getreqset() に よ っ て 置 き 換 え ら れ た 。

bool_t svc_register(SVCXPRT *xprt, unsigned long prognum,
unsigned long
versnum,
void (*
dispatch)(svc_req *, SVCXPRT *),
unsigned long
protocol);

prognumversnum を サ ー ビ ス 配 分 プ ロ シ ー ジ ャ ー dispatch で 関 連 付 け る 。 protocol が ゼ ロ の 場 合 、 サ ー ビ ス は portmap サ ー ビ ス に は 登 録 さ れ な い 。 protocol が ゼ ロ 以 外 の 場 合 、 [prognum,versnum,protocol] の 組 み 合 わ せ と xprt−>xp_port と の マ ッ ピ ン グ が ロ ー カ ル の portmap サ ー ビ ス に 登 録 さ れ る 。 (一 般 的 に protocol は ゼ ロ 、 IPPROTO_UDPIPPROTO_TCP の ど れ か で あ る 。 ) プ ロ シ ー ジ ャ ー dispatch は 以 下 の 形 式 で あ る :

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

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

void svc_run(void); こ の ル ー テ ィ ン は 戻 っ て こ な い 。 こ れ は RPC 要 求 の 到 着 を 待 ち 、 ど れ か が 届 い た 場 合 に svc_getreq() を 使 用 し て 適 切 な サ ー ビ ス プ ロ シ ー ジ ャ ー を 呼 び 出 す 。 こ の プ ロ シ ー ジ ャ ー は 通 常 は select(2) シ ス テ ム コ ー ル か ら 返 る の を 待 っ て い る 。

bool_t svc_sendreply(SVCXPRT *xprt, xdrproc_t outproc, char *out);

RPC サ ー ビ ス 配 分 ル ー テ ィ ン に よ っ て リ モ ー ト プ ロ シ ー ジ ャ ー コ ー ル の 結 果 を 返 す た め に 呼 び 出 さ れ る 。 パ ラ メ ー タ ー xprt は そ の 要 求 に 関 連 付 け ら れ た 通 信 ハ ン ド ル で あ る 。 outproc は 結 果 を エ ン コ ー ド す る た め に 使 用 す る XDR ル ー テ ィ ン で あ る 。 out は 結 果 の ア ド レ ス で あ る 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。

void svc_unregister(unsigned long prognum, unsigned long versnum); 配 分 ル ー テ ィ ン か ら [prognum,versnum] お よ び [prognum,versnum,*] の 組 み 合 わ せ か ら ポ ー ト 番 号 へ の マ ッ ピ ン グ を 全 て 削 除 す る 。

void svcerr_auth(SVCXPRT *xprt, enum auth_stat why); 認 証 エ ラ ー に よ り リ モ ー ト プ ロ シ ー ジ ャ ー コ ー ル の 実 行 を 拒 否 さ れ た 場 合 に サ ー ビ ス 配 分 ル ー テ ィ ン に よ っ て 呼 び 出 さ れ る 。

void svcerr_decode(SVCXPRT *xprt); パ ラ メ ー タ ー の デ コ ー ド に 失 敗 し た 場 合 に サ ー ビ ス 配 分 ル ー テ ィ ン に よ っ て 呼 び 出 さ れ る 。 svc_getargs() も 参 照 す る こ と 。

void svcerr_noproc(SVCXPRT *xprt); 要 求 の あ っ た プ ロ シ ー ジ ャ ー 番 号 が 実 装 さ れ て い な い 場 合 に サ ー ビ ス 配 分 ル ー テ ィ ン よ り 呼 び 出 さ れ る 。

void svcerr_noprog(SVCXPRT *xprt);

RPC パ ッ ケ ー ジ に 要 求 さ れ た プ ロ グ ラ ム が 登 録 さ れ て い な い 場 合 に 呼 び 出 さ れ る 。 サ ー ビ ス の 実 装 に は 通 常 、 こ の ル ー テ ィ ン は 必 要 な い 。

void svcerr_progvers(SVCXPRT *xprt);

RPC パ ッ ケ ー ジ に 要 求 さ れ た バ ー ジ ョ ン の プ ロ グ ラ ム が 登 録 さ れ て い な い 場 合 に 呼 び 出 さ れ る 。 サ ー ビ ス の 実 装 に は 通 常 、 こ の ル ー テ ィ ン は 必 要 な い 。

void svcerr_systemerr(SVCXPRT *xprt); 特 定 の プ ロ ト コ ル に よ っ て カ バ ー さ れ て い な シ ス テ ム エ ラ ー が 検 出 さ れ た 場 合 に サ ー ビ ス 配 分 ル ー テ ィ ン に よ っ て 呼 び 出 さ れ る 。 例 え ば 、 サ ー ビ ス が そ れ 以 上 、 記 憶 装 置 を 割 り 当 て る こ と が で き な い 場 合 に は こ の ル ー テ ィ ン が 呼 び 出 さ れ る か も し れ な い 。

void svcerr_weakauth(SVCXPRT *xprt); 認 証 パ ラ メ ー タ ー が 足 り な い た め に リ モ ー ト プ ロ シ ー ジ ャ ー コ ー ル の 実 行 を 拒 否 さ れ た 場 合 に サ ー ビ ス 配 分 ル ー テ ィ ン に よ っ て 呼 び 出 さ れ る 。 こ の ル ー テ ィ ン は svcerr_auth(xprt, AUTH_TOOWEAK) を 呼 び 出 す 。

SVCXPRT *svcfd_create(int fd, unsigned int sendsize,
unsigned int
recvsize); 任 意 の オ ー プ ン さ れ た デ ィ ス ク リ プ タ ー 上 に サ ー ビ ス を 作 成 す る 。 典 型 的 に 、 デ ィ ス ク リ プ タ ー は TCP の よ う な ス ト リ ー ム プ ロ ト コ ル で 接 続 さ れ た ソ ケ ッ ト で あ る 。 sendsizerecvsize に は 送 信 バ ッ フ ァ ー と 受 信 バ ッ フ ァ ー の 大 き さ を 指 定 す る 。 も し ゼ ロ が 指 定 さ れ た 場 合 は 適 切 な デ フ ォ ル ト が 選 択 さ れ る 。

SVCXPRT *svcraw_create(void); こ の ル ー テ ィ ン は 擬 似 RPC サ ー ビ ス 通 信 を 生 成 し て 、 そ の ポ イ ン タ ー を 返 す 。 通 信 は 実 際 に は そ の プ ロ セ ス の ア ド レ ス 空 間 に あ る バ ッ フ ァ ー な の で 対 応 す る RPC ク ラ イ ア ン ト は 同 じ ア ド レ ス 空 間 に い る 必 要 が あ る 。 clntraw_create() を 参 照 す る こ と 。 こ の ル ー テ ィ ン で RPC の シ ミ ュ レ ー シ ョ ン や 、 カ ー ネ ル イ ン タ ー フ ェ ー ス に 影 響 さ れ ず に 応 答 時 間 な ど の RPC オ ー バ ヘ ッ ド を 取 得 が で き る 。 こ の ル ー テ ィ ン は 失 敗 し た 場 合 は NULL を 返 す 。

SVCXPRT *svctcp_create(int sock, unsigned int send_buf_size,
unsigned int
recv_buf_size); こ の ル ー テ ィ ン は TCP/IP に 基 づ く RPC サ ー ビ ス 通 信 を 作 成 し 、 そ れ へ の ポ イ ン タ ー を 返 す 。 通 信 は ソ ケ ッ ト sock に 結 び つ け ら れ る 。 sockRPC_ANYSOCK で も 良 い 。 こ の 場 合 は 新 し い ソ ケ ッ ト が 作 成 さ れ る 。 も し ソ ケ ッ ト が ロ ー カ ル な TCP ポ ー ト に bind さ れ て い な い 場 合 は 、 こ の ル ー テ ィ ン が 適 当 な ポ ー ト に bind す る 。 補 完 さ れ た 場 合 、 xprt−>xp_sock に は 通 信 の ソ ケ ッ ト デ ィ ス ク リ プ タ ー が 、 xprt−>xp_port に は 通 信 の ポ ー ト 番 号 が 設 定 さ れ る 。 こ の ル ー テ ィ ン は 失 敗 し た 場 合 は NULL を 返 す 。 TCP に 基 づ い た RPC は バ ッ フ ァ ー さ れ た I/O を 使 用 す る た め 、 ユ ー ザ ー は バ ッ フ ァ ー の 大 き さ を 指 定 で き る 。 ゼ ロ を 指 定 し た 場 合 は 適 切 な デ フ ォ ル ト が 選 択 さ れ る 。

SVCXPRT *svcudp_bufcreate(int sock, unsigned int sendsize,
unsigned int
recosize); こ の ル ー テ ィ ン は UDP/IP に 基 づ い た RPC サ ー ビ ス 通 信 を 作 成 し 、 そ の ポ イ ン タ ー を 返 す 。 通 信 は ソ ケ ッ ト sock に 関 連 付 け ら れ る 。 sockRPC_ANYSOCK で も 良 い 。 こ の 場 合 は 新 し い ソ ケ ッ ト が 作 成 さ れ る 。 ソ ケ ッ ト が ロ ー カ ル の UDP ポ ー ト に bind さ れ て い な い 場 合 に は こ の ル ー テ ィ ン は 適 当 な ポ ー ト に bind す る 。 補 完 さ れ た 場 合 、 xprt−>xp_sock に 通 信 の ソ ケ ッ ト の デ ィ ス ク リ プ タ ー が 、 xprt−>xp_port に 通 信 の ポ ー ト 番 号 が 設 定 さ れ る 。 こ の ル ー テ ィ ン は 失 敗 し た 場 合 に は NULL を 返 す 。 こ れ を 使 用 す る と UDP に 基 づ い た RPC メ ッ セ ー ジ に お い て 送 信 パ ケ ッ ト や 受 信 パ ケ ッ ト の 最 大 サ イ ズ を 指 定 す る こ と が 可 能 に な る 。

SVCXPRT *svcudp_create(int sock); 送 信 パ ケ ッ ト と 受 信 パ ケ ッ ト の サ イ ズ を 同 じ デ フ ォ ル ト の 値 SZ に 指 定 し た svcudp_bufcreate(sock,SZ,SZ) と 等 価 で あ る 。

bool_t xdr_accepted_reply(XDR *xdrs, struct accepted_reply *ar);

RPC 応 答 メ ッ セ ー ジ を エ ン コ ー ド す る の に 使 用 す る 。 こ の ル ー テ ィ ン は RPC パ ッ ケ ー ジ を 用 い ず に RPC−形 式 の メ ッ セ ー ジ を 作 成 し よ う と す る 場 合 に 便 利 で あ る 。

bool_t xdr_authunix_parms(XDR *xdrs, struct authunix_parms *aupp);

UNIX 形 式 の 証 明 書 を 記 述 す る た め に 使 用 す る 。 こ の ル ー テ ィ ン は RPC 認 証 パ ッ ケ ー ジ を 使 用 せ ず に こ れ ら の 証 明 書 を 作 成 し よ う と す る 場 合 に 便 利 で あ る 。

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

RPC 呼 び 出 し の ヘ ッ ダ ー メ ッ セ ー ジ を 記 述 す る た め に 使 用 す る 。 こ の ル ー テ ィ ン は RPC パ ッ ケ ー ジ を 使 用 せ ず に RPC−形 式 の メ ッ セ ー ジ を 作 成 し よ う と す る 場 合 に 便 利 で あ る 。

bool_t xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg);

RPC 呼 び 出 し メ ッ セ ー ジ を 記 述 す る の に 使 用 す る 。 こ の ル ー テ ィ ン は RPC パ ッ ケ ー ジ を 使 用 せ ず に RPC−形 式 の メ ッ セ ー ジ を 作 成 し よ う と す る 場 合 に 便 利 で あ る 。

bool_t xdr_opaque_auth(XDR *xdrs, struct opaque_auth *ap);

PRC 認 証 情 報 メ ッ セ ー ジ を 記 述 す る た め に 使 用 す る 。 こ の ル ー テ ィ ン は RPC パ ッ ケ ー ジ を 使 用 せ ず に RPC−形 式 の メ ッ セ ー ジ を 作 成 し よ う と す る 場 合 に 便 利 で あ る 。

bool_t xdr_pmap(XDR *xdrs, struct pmap *regs); 各 種 の portmap プ ロ シ ー ジ ャ ー へ の パ ラ メ ー タ ー を 外 部 的 に 記 述 す る た め に 使 用 す る 。 こ の ル ー テ ィ ン は pmap イ ン タ ー フ ェ ー ス を 使 用 せ ず に 、 こ れ ら の パ ラ メ ー タ ー を 作 成 し た い 場 合 に 便 利 で あ る 。

bool_t xdr_pmaplist(XDR *xdrs, struct pmaplist **rp); ポ ー ト の マ ッ ピ ン グ の リ ス ト を 外 部 的 に 記 述 す る た め に 使 用 す る 。 こ の ル ー テ ィ ン は pmap イ ン タ ー フ ェ ー ス を 使 用 せ ず に 、 こ れ ら の パ ラ メ ー タ ー を 作 成 し た い 場 合 に 便 利 で あ る 。

bool_t xdr_rejected_reply(XDR *xdrs, struct rejected_reply *rr);

RPC 応 答 メ ッ セ ー ジ を 記 述 す る た め に 使 用 す る 。 こ の ル ー テ ィ ン は RPC パ ッ ケ ー ジ を 使 用 せ ず に 、 RPC−形 式 の メ ッ セ ー ジ を 作 成 し た い 場 合 に 便 利 で あ る 。

bool_t xdr_replymsg(XDR *xdrs, struct rpc_msg *rmsg);

RPC 応 答 メ ッ セ ー ジ を 記 述 す る た め に 使 用 す る 。 こ の ル ー テ ィ ン は RPC パ ッ ケ ー ジ を 使 用 せ ず に 、 RPC 形 式 の メ ッ セ ー ジ を 作 成 し た い 場 合 に 便 利 で あ る 。

void xprt_register(SVCXPRT *xprt);

RPC サ ー ビ ス 通 信 ハ ン ド ル を 生 成 し た 後 に 、 そ れ ら 自 身 を RPC サ ー ビ ス パ ッ ケ ー ジ に 登 録 す る 必 要 が あ る 。 こ の ル ー テ ィ ン は 大 域 変 数 svc_fds を 修 正 す る 。 サ ー ビ ス の 実 装 者 は 通 常 、 こ の ル ー テ ィ ン は 必 要 な い 。

void xprt_unregister(SVCXPRT *xprt);

RPC サ ー ビ ス 通 信 ハ ン ド ル を 破 壊 す る 前 に 、 そ れ を RPC 通 信 パ ッ ケ ー ジ か ら 登 録 解 除 す る 必 要 が あ る 。 こ の ル ー テ ィ ン は 大 域 変 数 svc_fds を 修 正 す る 。 サ ー ビ ス の 実 装 者 は 通 常 、 こ の ル ー テ ィ ン は 必 要 な い 。

関 連 項 目

xdr(3) 以 下 の マ ニ ュ ア ル :

Remote Procedure Calls: Protocol Specification
Remote Procedure Call Programming Guide
rpcgen Programming Guide

RPC: Remote Procedure Call Protocol Specification, RFC 1050, Sun Microsystems, Inc., USC−ISI.

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。