名 前
xdr − 外 部 デ ー タ 表 現 (XDR)の た め の ラ イ ブ ラ リ ル ー テ ィ ン
書 式 と 説 明
こ れ ら の ル ー テ ィ ン は C プ ロ グ ラ マ ー が マ シ ン 非 依 存 な 形 式 で 任 意 の デ ー タ 構 造 体 を 記 述 す る こ と を 可 能 に す る 。 リ モ ー ト プ ロ シ ー ジ ャ ー コ ー ル の た め の デ ー タ は こ れ ら の ル ー テ ィ ン を 使 用 し て 送 信 さ れ る 。 以 下 に 示 す プ ロ ト タ イ プ 宣 言 は <rpc/xdr.h> で 行 わ れ て お り 、 そ の 中 で は 次 の 型 が 使 用 さ れ る 。
typedef int bool_t;
typedef bool_t (*xdrproc_t) (XDR *, void *,...);
XDR 型 の 宣 言 に つ い て は 、 <rpc/xdr.h> を 参 照 。
bool_t
xdr_array(XDR *xdrs, char
**arrp, unsigned int *sizep,
unsigned int maxsize, unsigned int
elsize,
xdrproc_t elproc); 可 変
長 の 配 列 と そ
れ に 対 応 す る
外 部 表 現 と を
変 換 す る 基 本
フ ィ ル タ ー 。
引 き 数 arrp は 配
列 へ の ポ イ ン
タ ー の ア ド レ
ス で あ り 、 sizep
は 配 列 の 要 素
数 の ア ド レ ス
で あ る 。 こ れ
ら の 要 素 数 は
maxsize を 超 え て は
な ら な い 。 引
き 数 elsize は 各 配
列 の 要 素 の sizeof
で あ り 、 elproc は
配 列 要 素 を C 形
式 か ら そ の 外
部 表 現 に 変 換
す る た め の XDR フ
ィ ル タ ー で あ
る 。 こ の ル ー
テ ィ ン は 成 功
し た 場 合 に は 1
を 返 す 。 失 敗
し た 場 合 に は
ゼ ロ を 返 す 。
bool_t xdr_bool(XDR *xdrs, bool_t *bp); 真 偽 値 (C の int)と そ の 外 部 表 現 と を 変 換 す る 基 本 フ ィ ル タ ー 。 デ ー タ を エ ン コ ー ド す る 時 、 こ の フ ィ ル タ ー は 1 ま た 0 の 値 を 生 成 す る 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 に は 1 を 返 す 。 失 敗 し た 場 合 に は 0 を 返 す 。
bool_t
xdr_bytes(XDR *xdrs, char **sp,
unsigned int *sizep,
unsigned int maxsize); あ る
長 さ の バ イ ト
文 字 列 と そ の
外 部 表 現 と を
変 換 す る 基 本
フ ィ ル タ ー 。
引 き 数 sp は 文
字 列 ポ イ ン タ
ー の ア ド レ ス
で あ る 。 文 字
列 の 長 さ は sizep
の ア ド レ ス に
置 く 。 文 字 列
は maxsize よ り 長 く
て は い け な い
。 こ の ル ー テ
ィ ン は 成 功 し
た 場 合 に は 1 を
返 す 。 失 敗 し
た 場 合 に は 0 を
返 す 。
bool_t xdr_char(XDR *xdrs, char *cp);
C の 文 字 (char)と そ の 外 部 表 現 と の 間 を 変 換 す る 基 本 フ ィ ル タ ー 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 に は 1 を 返 す 。 失 敗 し た 場 合 に は 0 を 返 す 。 注 意 : エ ン コ ー ド さ れ た デ ー タ は 詰 め 込 ま れ て お ら ず 、 そ れ ぞ れ 4 バ イ ト を 占 め る 。 文 字 の 配 列 の 場 合 に は xdr_bytes(), xdr_opaque(), xdr_string() な ど を 考 慮 し た 方 が 良 い 。
void xdr_destroy(XDR *xdrs); こ の マ ク ロ は XDR ス ト リ ー ム xdrs に 関 連 付 け ら れ た 破 壊 ル ー テ ィ ン を 呼 び 出 す 。 破 壊 に は 通 常 、 ス ト リ ー ム に 関 連 付 け ら れ た 私 的 デ ー タ 構 造 体 の 解 放 が 含 ま れ て い る 。 xdr_destroy() の 呼 び 出 し の 後 に xdrs を 使 用 す る こ と は 未 定 義 で あ る 。
bool_t xdr_double(XDR *xdrs, double *dp);
C の 倍 精 度 数 (double) と そ の 外 部 表 現 と の 変 換 を 行 な う 基 本 フ ィ ル タ ー 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は 0 を 返 す 。
bool_t xdr_enum(XDR *xdrs, enum_t *ep);
C の enum (実 際 に は int)と そ の 外 部 表 現 と の 変 換 を 行 な う 基 本 フ ィ ル タ ー 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は 0 を 返 す 。
bool_t xdr_float(XDR *xdrs, float *fp);
C の 浮 動 小 数 点 数 (float) と そ の 外 部 表 現 と の 変 換 を 行 な う 基 本 フ ィ ル タ ー 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は 0 を 返 す 。
void xdr_free(xdrproc_t proc, char *objp); 汎 用 解 放 (free)ル ー テ ィ ン 。 最 初 の 引 き 数 は オ ブ ジ ェ ク ト を 解 放 す る た め の XDR ル ー テ ィ ン で あ る 。 二 番 目 の 引 き 数 は そ の オ ブ ジ ェ ク ト 自 身 へ の ポ イ ン タ ー で あ る 。 注 意 : こ の ル ー テ ィ ン に 渡 さ れ る ポ イ ン タ ー は 解 放 さ れ な い が 、 こ の ポ イ ン タ ー の 指 す デ ー タ は (再 帰 的 に ) 解 放 さ れ る 。
unsigned int xdr_getpos(XDR *xdrs); こ の マ ク ロ は XDR ス ト リ ー ム xdrs に 関 連 付 け ら れ た 位 置 取 得 ル ー テ ィ ン を 呼 び 出 す 。 こ の ル ー テ ィ ン は XDR バ イ ト ス ト リ ー ム の 位 置 を 指 示 す る 符 号 無 し 整 数 を 返 す 。 XDR ス ト リ ー ム の 機 能 と し て こ の 数 値 で 単 純 な 算 術 作 業 が で き る こ と が 期 待 さ れ て る い る 。 し か し な が ら XDR ス ト リ ー ム の 実 体 は こ れ を 保 証 す る 必 要 は な い 。
long *xdr_inline(XDR *xdrs, int len); こ の マ ク ロ は XDR ス ト リ ー ム xdrs に 関 連 付 け ら れ た 内 部 (inline)ル ー テ ィ ン を 呼 び 出 す 。 ル ー テ ィ ン は ス ト リ ー ム の バ ッ フ ァ ー の 連 続 す る 断 片 へ の ポ イ ン タ ー を 返 す 。 len は 要 求 す る バ ッ フ ァ ー の バ イ ト 長 で あ る 。 注 意 : ポ イ ン タ ー は long * に キ ャ ス ト さ れ る 。 警 告 : xdr_inline() は バ ッ フ ァ ー の 連 続 す る 断 片 を 割 り 当 て る こ と が で き な か っ た 場 合 に は NULL (0)を 返 す か も し れ な い 。 ど の 場 合 も そ の 動 作 は ス ト リ ー ム の 実 体 に よ っ て 変 化 す る か も し れ な い 。 こ れ は 効 率 化 の た め に 存 在 し て い る 。
bool_t xdr_int(XDR *xdrs, int *ip);
C の 整 数 (int)と そ の 外 部 表 現 と を 変 換 す る た め の 基 本 フ ィ ル タ ー 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。
bool_t xdr_long(XDR *xdrs, long *lp);
C の long 整 数 と そ の そ の 外 部 表 現 と を 変 換 す る た め の 基 本 フ ィ ル タ ー 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。
void
xdrmem_create(XDR *xdrs, char
*addr, unsigned int size,
enum xdr_op op); こ の
ル ー テ ィ ン は
xdrs に よ っ て 指
さ れ て い る XDR ス
ト リ ー ム オ ブ
ジ ェ ク ト を 初
期 化 す る 。 ス
ト リ ー ム の デ
ー タ は addr 位 置
に あ る メ モ リ
ー の 塊 か ら 読
み 書 き さ れ る
。 そ の 長 さ は
バ イ ト 単 位 で
size 超 え て は い
け な い 。 op は XDR
ス ト リ ー ム の
変 換 方 向 を 決
定 す る (XDR_ENCODE,
XDR_DECODE, XDR_FREE の ど
れ か )。
bool_t xdr_opaque(XDR *xdrs, char *cp, unsigned int cnt); 固 定 長 の 不 明 デ ー タ と そ の 外 部 表 現 と の 変 換 を 行 な う 基 本 フ ィ ル タ ー 。 引 き 数 cp は 不 明 オ ブ ジ ェ ク ト の ア ド レ ス で あ り cnt は そ の バ イ ト 単 位 の 大 き さ で あ る 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。
bool_t
xdr_pointer(XDR *xdrs, char
**objpp,
unsigned int objsize, xdrproc_t
xdrobj);
xdr_reference() と 同 様 で あ る が 、 こ れ が ヌ ル ポ イ ン タ ー を 番 号 化 す る の に 対 し て xdr_reference() は そ う し な い 点 が 異 な っ て い る 。 こ れ に よ り 、 xdr_pointer() は 二 分 木 や 連 結 リ ス ト の よ う な 再 帰 的 な デ ー タ 構 造 体 を 表 現 で き る 。
void
xdrrec_create(XDR *xdrs, unsigned int
sendsize,
unsigned int recvsize, char
*handle,
int (*readit) (char *, char *, int),
int (*writeit) (char *, char *, int));
こ の ル ー テ ィ
ン は xdrs で 指 さ
れ た XDR ス ト リ ー
ム オ ブ ジ ェ ク
ト を 初 期 化 す
る 。 ス ト リ ー
ム の デ ー タ は
大 き さ sendsize の バ
ッ フ ァ ー へ 書
き 込 ま れ る 。
sendsize を ゼ ロ に す
る と 、 シ ス テ
ム に 適 切 な デ
フ ォ ル ト を 使
用 す る よ う に
指 示 す る 。 ス
ト リ ー ム の デ
ー タ は 大 き さ
recvsize の バ ッ フ ァ
ー か ら 読 み 込
ま れ る 。 こ れ
も ゼ ロ を 渡 す
こ と で 適 切 な
デ フ ォ ル ト に
設 定 す る こ と
が で き る 。 ス
ト リ ー ム の 出
力 バ ッ フ ァ ー
が 一 杯 の 場 合
は writeit が 呼 び 出
さ れ る 。 同 様
に ス ト リ ー ム
入 力 バ ッ フ ァ
ー が 空 の 場 合
に は readit が 呼 び
出 さ れ る 。 こ
れ ら の 二 つ の
ル ー テ ィ ン の
動 作 は シ ス テ
ム コ ー ル の read(2)
や write(2) と 似 て い
る が 、 前 者 の
ル ー テ ィ ン は
最 初 の 引 き 数
と し て handle が 渡
さ れ る 点 で 異
な っ て い る 。
注 意 : XDR ス ト リ ー
ム の op は 呼 び
出 し 側 で 設 定
し な け れ ば な
ら な い 。 警 告 :
こ の XDR ス ト リ ー
ム は 中 間 レ コ
ー ド ス ト リ ー
ム を 実 装 し て
い る 。 レ コ ー
ド 境 界 の 情 報
を 提 供 す る た
め に ス ト リ ー
ム に は 余 分 な
バ イ ト が 存 在
す る 。
bool_t xdrrec_endofrecord(XDR *xdrs, int sendnow); こ の ル ー テ ィ ン は xdrrec_create() に よ っ て 作 成 さ れ た ス ト リ ー ム に 対 し て の み 呼 び 出 す こ と が で き る 。 出 力 バ ッ フ ァ ー の デ ー タ は 完 全 な レ コ ー ド と し て 印 さ れ 、 sendnow が ゼ ロ で な い 場 合 に は 出 力 バ ッ フ ァ ー は 書 き 出 さ れ る 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。
bool_t xdrrec_eof(XDR *xdrs); こ の ル ー テ ィ ン は xdrrec_create() に よ っ て 作 成 さ れ た ス ト リ ー ム に 対 し て の み 呼 び 出 す こ と が で き る 。 ス ト リ ー ム の 現 在 の レ コ ー ド の 残 り を 消 費 し た 後 に 、 ス ト リ ー ム に 入 力 が 残 っ て い な い 場 合 に は 1 を 返 す 。 そ れ 以 外 の 場 合 は ゼ ロ を 返 す 。
bool_t xdrrec_skiprecord(XDR *xdrs); こ の ル ー テ ィ ン は xdrrec_create() に よ っ て 作 成 さ れ た ス ト リ ー ム に 対 し て の み 呼 び 出 す こ と が で き る 。 XDR の 実 装 に そ の ス ト リ ー ム の 入 力 バ ッ フ ァ ー の 現 在 の レ コ ー ド の 残 り を 捨 て る よ う に 伝 え る 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。
bool_t
xdr_reference(XDR *xdrs, char
**pp, unsigned int size,
xdrproc_t proc); 構 造
体 へ の ポ イ ン
タ ー 追 跡 を 提
供 す る 基 本 ル
ー テ ィ ン 。 引
き 数 pp は ポ イ
ン タ ー の ア ド
レ ス で あ る 。
size は *pp が 指 し
て い る 構 造 体
の sizeof で あ る 。
proc は そ の 構 造
体 の C 形 式 と 外
部 表 現 と の 変
換 を 行 な う XDR プ
ロ シ ー ジ ャ ー
で あ る 。 こ の
ル ー テ ィ ン は
成 功 し た 場 合 1
を 返 す 。 失 敗
し た 場 合 は ゼ
ロ を 返 す 。 警
告 : こ の ル ー テ
ィ ン は ヌ ル ポ
イ ン タ ー を 理
解 す る こ と が
で き な い 。 か
わ り に xdr_pointer() を
使 用 す る こ と
。
xdr_setpos(XDR *xdrs, unsigned int pos); こ の マ ク ロ は XDR ス ト リ ー ム xdrs に 関 連 付 け ら れ た 位 置 設 定 ル ー テ ィ ン を 呼 び 出 す 。 引 き 数 pos は xdr_getpos() に よ っ て 取 得 さ れ る 位 置 数 値 で あ る 。 こ の ル ー テ ィ ン は XDR ス ト リ ー ム の 位 置 の 変 更 が で き た 場 合 に は 1 を 返 す 。 そ れ 以 外 の 場 合 は 0 を 返 す 。 警 告 : あ る 種 の XDR ス ト リ ー ム の 場 合 は 位 置 の 変 更 を 行 な う こ と が 困 難 で あ る 。 そ れ で こ の ル ー テ ィ ン は あ る 種 の ス ト リ ー ム の 場 合 に は 成 功 し 、 別 の 種 類 の 場 合 に は 失 敗 す る か も し れ な い 。
bool_t xdr_short(XDR *xdrs, short *sp);
C の short 整 数 と そ の 外 部 表 現 と の 変 換 を 行 な う 基 本 フ ィ ル タ ー 。 こ の ル ー テ ィ ン は 成 功 す る と 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。
void xdrstdio_create(XDR *xdrs, FILE *file, enum xdr_op op); こ の ル ー テ ィ ン は xdrs で 指 さ れ た XDR ス ト リ ー ム オ ブ ジ ェ ク ト を 初 期 化 す る 。 XDR ス ト リ ー ム に 読 み 書 き れ た デ ー タ は stdio ス ト リ ー ム file が 使 用 さ れ る 。 op 引 き 数 は XDR ス ト リ ー ム の 変 換 方 向 を 決 定 す る (XDR_ENCODE, XDR_DECODE, XDR_FREE の ど れ か )。 警 告 : こ の よ う な XDR ス ト リ ー ム に 関 連 付 け ら れ た 破 壊 ル ー テ ィ ン は file ス ト リ ー ム に 対 し て fflush(3) を 呼 び 出 す が fclose(3) を 呼 び 出 す こ と は な い 。
bool_t xdr_string(XDR *xdrs, char **sp, unsigned int maxsize);
C の 文 字 列 と そ れ に 対 応 す る 外 部 表 現 と を 変 換 す る た め の 基 本 フ ィ ル タ ー 。 文 字 列 は maxsize よ り 長 く は で き な い 。 注 意 : sp は 文 字 列 へ の ポ イ ン タ ー の ア ド レ ス で あ る 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。
bool_t xdr_u_char(XDR *xdrs, unsigned char *ucp);
C の 符 号 無 し 文 字 (unsigned char) と そ の 外 部 表 現 と を 変 換 す る 基 本 フ ィ ル タ ー 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。
bool_t xdr_u_int(XDR *xdrs, unsigned *up);
C の 符 号 無 し 整 数 (unsigned) と そ の 外 部 表 現 を 変 換 す る た め の 基 本 フ ィ ル タ ー 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。
bool_t xdr_u_long(XDR *xdrs, unsigned long *ulp);
C の unsigned long 整 数 と そ の 外 部 表 現 を 変 換 す る た め の 基 本 フ ィ ル タ ー 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。
bool_t xdr_u_short(XDR *xdrs, unsigned short *usp);
C の unsigned short 整 数 と そ の 外 部 表 現 を 変 換 す る た め の 基 本 フ ィ ル タ ー 。 こ の ル ー テ ィ ン は 成 功 し た 場 合 は 1 を 返 す 。 失 敗 し た 場 合 は ゼ ロ を 返 す 。
bool_t
xdr_union(XDR *xdrs, int *dscmp,
char *unp,
struct xdr_discrim *choices,
xdrproc_t defaultarm); /* may equal NULL
*/ 分 別 可 能 な C
の 共 用 体 (union) と
そ の 外 部 形 式
と を 変 換 す る
基 本 フ ィ ル タ
ー 。 最 初 に dscmp
と し て 与 え ら
れ た 共 用 体 の
分 別 要 素 が 変
換 さ れ る 。 こ
の 分 別 要 素 は
常 に enum_t で あ る
。 次 に unp の 位
置 の 共 用 体 が
変 換 さ れ る 。
引 き 数 choices は
xdr_discrim() 構 造 体 の
配 列 へ の ポ イ
ン タ ー で あ る
。 各 構 造 体 は
[value,proc] の 順 序
付 き ペ ア を 格
納 し て い る 。
も し 共 用 体 の
分 別 要 素 が 関
連 付 け ら れ た
value と 等 し い 場
合 に は 、 共 用
体 を 変 換 す る
た め に proc が 呼
び 出 さ れ る 。
xdr_discrim() 構 造 体 の
配 列 の 最 後 は
、 値 NULL の ル ー テ
ィ ン を 指 定 す
る こ と で 示 さ
れ る 。 分 別 要
素 が choices 配 列 の
中 に 見 つ か ら
な か っ た 場 合
、 defaultarm が (NULL で な
け れ ば ) 呼 び 出
さ れ る 。 成 功
し た 場 合 は 1 を
返 す 。 失 敗 し
た 場 合 は ゼ ロ
を 返 す 。
bool_t
xdr_vector(XDR *xdrs, char
*arrp, unsigned int size,
unsigned int elsize, xdrproc_t
elproc); 固 定 長 の
配 列 と そ れ ら
が 対 応 す る 外
部 表 現 と を 変
換 す る 基 本 フ
ィ ル タ ー 。 引
き 数 arrp は 配 列
へ の ポ イ ン タ
ー の ア ド レ ス
で あ る 。 一 方
で size は 配 列 の
要 素 数 そ の も
の で あ る 。 引
き 数 elsize は 配 列
の 各 要 素 の sizeof
で 、 elproc は 配 列
の 要 素 を C 形 式
か ら そ の 外 部
表 現 へ と 変 換
す る XDR フ ィ ル タ
ー で あ る 。 こ
の ル ー テ ィ ン
は 成 功 し た 場
合 1 を 返 す 。 失
敗 し た 場 合 は
ゼ ロ を 返 す 。
bool_t xdr_void(void); こ の ル ー テ ィ ン は 常 に 1 を 返 す 。 こ れ は 何 も 行 な わ な い が 、 関 数 引 き 数 が 必 要 な RPC ル ー テ ィ ン に 渡 す こ と が で き る 。
bool_t xdr_wrapstring(XDR *xdrs, char **sp);
xdr_string(xdrs, sp, MAXUN.UNSIGNED ); を 呼 び 出 す 基 本 ル ー テ ィ ン 。 こ こ で MAXUN.UNSIGNED は 符 号 無 し 整 数 (unsigned int)の 最 大 値 で あ る 。 xdr_wrapstring() は 、 RPC パ ッ ケ ー ジ は 二 つ の XDR ル ー テ ィ ン の 最 大 値 を 引 き 数 と し て 渡 す た め 便 利 で あ る 。 xdr_string() は 最 も 頻 繁 に 利 用 さ れ る 基 本 ル ー テ ィ ン で あ る が 三 つ を 要 求 す る 。 成 功 し た 場 合 は 1 を 返 す 、 失 敗 し た 場 合 は ゼ ロ を 返 す 。
関 連 項 目
rpc(3) 以 下 の マ ニ ュ ア ル :
eXternal Data Representation
Standard: Protocol Specification
eXternal Data Representation: Sun Technical Notes
XDR: External Data Representation Standard,
RFC 1014, Sun Microsystems, Inc., USC−ISI.
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。