EN JA
XDR(3)
XDR(3) FreeBSD Library Functions Manual XDR(3)

名称

xdr, xdr_array, xdr_bool, xdr_bytes, xdr_char, xdr_destroy, xdr_double, xdr_enum, xdr_float, xdr_free, xdr_getpos, xdr_hyper, xdr_inline, xdr_int, xdr_long, xdr_longlong_t, xdrmem_create, xdr_opaque, xdr_pointer, xdrrec_create, xdrrec_endofrecord, xdrrec_eof, xdrrec_skiprecord, xdr_reference, xdr_setpos, xdr_short, xdr_sizeof, xdrstdio_create, xdr_string, xdr_u_char, xdr_u_hyper, xdr_u_int, xdr_u_long, xdr_u_longlong_t, xdr_u_short, xdr_union, xdr_vector, xdr_void, xdr_wrapstring外部データ表現のためのライブラリルーチン

ライブラリ

Standard C Library (libc, -lc)

書式

#include < rpc/types.h>
#include < rpc/xdr.h>

関数宣言に関しては、 解説 を参照してください。

解説

これらのルーチンは、C プログラマがマシン独立の方法で任意のデータ構造について記述することを可能にします。リモートプロシージャコールのためのデータは、これらのルーチンを使用して送信されます。

int
xdr_array( XDR *xdrs, char **arrp, u_int *sizep, u_int maxsize, u_int elsize, xdrproc_t elproc);

可変長の配列とそれらに対応する外部表現の間を変換するフィルタプリミティブです。 sizep が配列の要素数のアドレスですが、 arrp 引数は、配列へのポインタのアドレスです。この要素数は、 maxsize を超過することができません。 elsize 引数は、各配列の要素の sizeof です。 elproc は、配列要素の C 形式とそれらの外部表現の間を変換する XDR フィルタです。成功すれば、このルーチンは 1 を返し、そうでなければ 0 を返します。

int
xdr_bool( XDR *xdrs, bool_t *bp)

ブーリアン (C 整数) とそれらの外部表現の間を変換するフィルタプリミティブです。データをコード化する場合、このフィルタは、1 つあるいは 0 のいずれかの値を生成します。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_bytes( XDR *xdrs, char **sp, u_int *sizep, u_int maxsize)

数えられたバイトストリングとそれらの外部表現の間を変換するフィルタプリミティブです。 sp 引数は、文字列ポインタのアドレスです。文字列の長さは、アドレス sizep に置かれます。文字列は、 maxsize より長くすることはできません。成功すれば、このルーチンは 1 を返し、そうでなければ 0 を返します。

int
xdr_char( XDR *xdrs, char *cp)

C 文字とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは 1 を返し、そうでなければ 0 を返します。注: コード化された文字はパックされず、それぞれ 4 バイトを占有します。文字の配列については、 xdr_bytes(), xdr_opaque() または xdr_string() を考慮することに価値があります。

void
xdr_destroy( XDR *xdrs)

XDR ストリーム、 xdrs に関連する破壊ルーチンを呼び出すマクロです。破壊は通常、ストリームに関連したプライベートデータ構造体を解放することを意味します。 xdr_destroy() を呼び出した後に xdrs を使用することは未定義です。

int
xdr_double( XDR *xdrs, double *dp)

C の倍精度数 ( double) とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_enum( XDR *xdrs, enum_t *ep)

C の enum (実際は整数) とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは 1 を返し、そうでなければ 0 を返します。

int
xdr_float( XDR *xdrs, float *fp)

C の浮動小数点数 float とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

void
xdr_free( xdrproc_t proc, void *objp)

一般的な解放ルーチンです。最初の引数は、解放されているオブジェクトのための XDR ルーチンです。 2 つめの引数は、オブジェクト自体へのポインタです。注: このルーチンに渡されたポインタは解放されませんが、それが指すものは (再帰的に) 解放されます。

u_int
xdr_getpos( XDR *xdrs)

XDR ストリーム、 xdrs に関連する位置取得ルーチンを呼び出すマクロです。ルーチンは XDR バイトストリームの位置を示す符号なしの整数を返します。 XDR ストリームの望ましい特徴は、 XDR ストリームのインスタンスは、これを保証する必要がありませんが、単純な算術計算がこの数で働くということです。

int
xdr_hyper( XDR *xdrs, quad_t *llp)
ANSI の C の long long 整数とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

long *
xdr_inline( XDR *xdrs, int len)

XDR ストリーム、 xdrs に関連するインラインルーチンを呼び出すマクロです。ルーチンは、ストリームのバッファの連続する断片へのポインタを返します len は、希望のバッファのバイト長です。注: ポインタは long * にキャストされます。

警告: xdr_inline() は、バッファの連続する断片を割り付けることができない場合、 NULL (0) を返します。したがって、ストリームインスタンスの間に振る舞いは変わることができます。それは、効率のために存在します。

int
xdr_int( XDR *xdrs, int *ip)

C の整数とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_long( XDR *xdrs, long *lp)

C の long 整数とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_longlong_t( XDR *xdrs, quad_t *llp)
ANSI の C の long long 整数とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

void
xdrmem_create( XDR *xdrs, char *addr, u_int size, enum xdr_op op)

このルーチンは、 xdrs によって指される XDR ストリームオブジェクトを初期化します。ストリームのデータは、その長さが size バイト長しかない位置 addr のメモリに書き込むか、またはそこから読み込みます。 op 引数は、 XDR ストリームの方向 ( XDR_ENCODEXDR_DECODE あるいは XDR_FREE のいずれか) を決定します。

int
xdr_opaque( XDR *xdrs, char *cp, u_int cnt)

固定サイズの不透明 (opaque) データとその外部表現の間を変換するフィルタプリミティブです。 cp 引数は、不透明なオブジェクトのアドレスです。また、 cnt は、そのバイトサイズです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_pointer( XDR *xdrs, char **objpp, u_int objsize, xdrproc_t xdrobj)

NULL ポインタをシリアライズすることを除いて xdr_reference() に似ています。しかし、 xdr_reference() はしません。したがって、 xdr_pointer() は、バイナリツリー (2 進木) あるいはリンクしたリストのような再帰的なデータ構造を表わすことができます。

void
xdrrec_create( XDR *xdrs, u_int sendsize, u_int recvsize, void *handle, int (*readit)(), int (*writeit)());

このルーチンは、 xdrs によって指される XDR ストリームオブジェクトを初期化します。ストリームのデータは、サイズ sendsize のバッファに書き込まれます。 0 の値は、システムが適切なデフォルトを使用するべきであることを示します。ストリームのデータは、サイズ recvsize のバッファから読み込まれます。それはまた、0 値を渡すことにより適切なデフォルトに設定できます。ストリームの出力バッファが満杯の場合、 writeit() が呼び出されます。同様に、ストリームの入力されたバッファが空の場合、 readit() が呼び出されます。これらの 2 つのルーチンの振る舞いは、 handle が最初の引数として前のルーチンに渡されることを除いて、システムコールの read(2)write(2) に似ています。注: XDR ストリームの op フィールドは、呼び出し側によって設定されなければなりません。

警告: この XDR ストリームは中間のレコードストリームを実装します。したがって、レコード境界情報を提供するためにストリームに追加のバイトがあります。

int
xdrrec_endofrecord( XDR *xdrs, int sendnow)

このルーチンは xdrrec_create() によって作成されたストリームについてのみ呼び出すことができます。出力バッファのデータは、完了したレコードとしてマークされます。また、 sendnow が 0 でない場合、出力バッファはオプションで書き込まれます。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdrrec_eof( XDR *xdrs)

このルーチンは、 xdrrec_create() によって作成されたストリームについてのみ呼び出すことができます。ストリーム中の現在のレコードの残りを消費した後に、ストリームにこれ以上の入力がなければ、このルーチンは 1 を返し、そうでなければ 0 を返します。

int
xdrrec_skiprecord( XDR *xdrs)

このルーチンは、 xdrrec_create() によって作成されたストリームについてのみ呼び出すことができます。それは、 XDR 実装に、ストリームの入力バッファ中の現在のレコードの残りが廃棄されるべきであると伝えます。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_reference( XDR *xdrs, char **pp, u_int size, xdrproc_t proc)

構造体の中を追いかけるポインタを提供するプリミティブです。 pp 引数は、ポインタのアドレスです。 size は、 *pp が指す構造体の sizeof です。そして、 proc は、その C 形式とその外部表現の間の構造体のフィルタである XDR 手続きです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

警告: このルーチンは、 NULL ポインタを理解しません。 xdr_pointer() を代わりに使用してください。

int
xdr_setpos( XDR *xdrs, u_int pos)

XDR ストリーム、 xdrs に関連する位置設定ルーチンを呼び出すマクロです。 pos 引数は、 xdr_getpos() から得られた位置の値です。 XDR 流れの位置を変えることができるかもしれない場合、このルーチンは 1 つを返します、そして 0、そうでなければ。 XDR ストリームの位置を変えることができる場合、このルーチンは、1 を返し、そうでなければ 0 を返します。

警告: いくつかの XDR ストリームの種類の位置を変えることは困難です。したがって、このルーチンはあるストリームの種類で失敗するかもしれないし、別のものでは成功するかもしれません。

int
xdr_short( XDR *xdrs, short *sp)

C の short 整数とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは 1 を返し、そうでなければ 0 を返します。

unsigned long
xdr_sizeof( xdrproc_t func, void *data)

このルーチンは、フィルタ func を使用して data をエンコードするために必要とされるメモリ容量を返します。

#ifdef _STDIO_H_
/* XDR using stdio library */
void
xdrstdio_create( XDR *xdrs, FILE *file, enum xdr_op op)
#endif

このルーチンは、 xdrs によって指される XDR ストリームオブジェクトを初期化します。 XDR ストリームデータは標準の I/O ストリーム file に書き込むか、またはそこから読み込みます。 op 引数は、 XDR ストリームの方向 ( XDR_ENCODEXDR_DECODE あるいは XDR_FREE のいずれか) を決定します。

警告: そのような XDR ストリームに関連した破壊ルーチンは、 file ストリームで fflush(3) を呼び出しますが、決して fclose(3) は、呼び出しません。

int
xdr_string( XDR *xdrs, char **sp, u_int maxsize)

C の文字列とそれらの外部表現の間を変換するフィルタプリミティブです。文字列は maxsize よりも長くできません。注: sp は文字列のポインタのアドレスです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_u_char( XDR *xdrs, unsigned char *ucp)

C の符号なし ( unsigned) 文字とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_u_hyper( XDR *xdrs, u_quad_t *ullp)
C の符号なし ( unsigned) ANSI C long long 整数とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_u_int( XDR *xdrs, unsigned *up)

C の符号なし ( unsigned) 整数とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_u_long( XDR *xdrs, unsigned long *ulp)

C の符号なし long ( unsigned long) 整数とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_u_longlong_t( XDR *xdrs, u_quad_t *ullp)
C の符号なし ( unsigned) ANSI C long long 整数とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_u_short( XDR *xdrs, unsigned short *usp)

C の符号なし short ( unsigned short) 整数とそれらの外部表現の間を変換するフィルタプリミティブです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_union( XDR *xdrs, enum_t *dscmp, char *unp, const struct xdr_discrim *choices, xdrproc_t defaultarm);

識別された C の共用体 (ユニオン) ( union) とその対応する外部表現の間を変換するフィルタプリミティブです。最初に dscmp にある共用体の識別を変換します。この識別は常に enum_t です。次に、 unp にある共用体が変換されます。 choices 引数は、 xdr_discrim 構造体の配列へのポインタです。各構造体は順序づけられた[ value, proc]のペアを含んでいます。共用体の識別は関連する value と等しい場合、 proc() は共用体を変換するために呼び出されます。 xdr_discrim 構造体の配列の終了は、値 NULL のルーチンによって示されます。識別が choices 配列で見つからない場合、 defaultarm() 手続きは (それが NULL でない場合) 呼び出されます。成功すれば 1 が返され、そうでなければ 0 が返されます。

int
xdr_vector( XDR *xdrs, char *arrp, u_int size, u_int elsize, xdrproc_t elproc);

固定長配列とそれらに対応する外部表現の間を変換するフィルタプリミティブです。 size は、配列の要素数ですが、 arrp 引数は、配列へのポインタのアドレスです。 elsize 引数は、各々の配列の要素の sizeof ですが、 elproc は、配列要素の C 形式とそれらの外部表現の間を変換する XDR フィルタです。成功すれば、このルーチンは、1 を返し、そうでなければ 0 を返します。

int
xdr_void( void)

このルーチンは、常に 1 を返します。何も行なわれない関数引数を要求する RPC ルーチンに渡すことができます。

int
xdr_wrapstring( XDR *xdrs, char **sp)

xdr_string( xdrs, sp, MAXUN.UNSIGNED);を呼び出すプリミティブです。ここで MAXUN.UNSIGNED は、符号なし整数 (unsigned integer) の最大の値です。 RPC パッケージが引数として最高 2 つの XDR ルーチンを渡すので、 xdr_wrapstring() 関数は便利です。そして、最も頻繁に使用されているプリミティブの 1 つである xdr_string() は、3 つを要求します。成功すれば 1 が返され、そうでなければ 0 が返されます。

関連項目

rpc(3) eXternal Data Representation Standard: Protocol Specification. eXternal Data Representation: Sun Technical Notes. XDR: External Data Representation Standard, Sun Microsystems, Inc., USC-ISI, RFC1014.

歴史

xdr_sizeof 関数は、 FreeBSD 9.0 ではじめて登場しました。
February 16, 1988 FreeBSD