ONC+ 開発ガイド

XDR オブジェクト

次のサンプルプログラムの構造体は、XDR ストリームへのインタフェースを定義します。


例 A–13 XDR ストリームインタフェースの例

enum xdr_op {XDR_ENCODE=0, XDR_DECODE=1, XDR_FREE=2};
 typedef struct {
	enum xdr_op x_op;
	struct xdr_ops {
 		bool_t (*x_getlong)();    /* ストリームから long 型データを入力 */
 		bool_t (*x_putlong)();    /* ストリームに long 型データを出力 */
 		bool_t (*x_getbytes)();   /* ストリームから複数バイトを入力 */
 		bool_t (*x_putbytes)();   /* ストリームに複数バイトを出力 */
 		u_int (*x_getpostn)();    /* ストリームのオフセットを返す */
 		bool_t (*x_setpostn)();   /* オフセットの再設定 */
 		caddr_t (*x_inline)();
                          /* バッファリングされたデータへのポインタ */
 		VOID (*x_destroy)();         /* プライベートエリアの解放 */
		bool_t (*x_control)();    /* クライアント情報の検索、変更 */
		bool_t (*x_getint32)();   /* ストリームから int を取得 */
 		bool_t (*x_putint32)();   /* ストリームに int を出力 */
 	} *x_ops;
 	caddr_t x_public;                /* ユーザーデータ */
 	caddr_t x_private;               /* プライベートデータへのポインタ */
 	caddr_t x_base;            /* 位置情報のためのプライベートデータ */
 	int		 x_handy;      /* その他のプライベートワード */
 } XDR;

x_op フィールドは、現在ストリームに対して実行している処理内容を示します。このフィールドは XDR プリミティブにとっては重要なフィールドですが、ストリームの実現に対しては影響ありません。すなわち、ストリームは、この値に依存した方法で作成しないでください。x_privatex_basex_handy の各フィールドは、特定のストリームを実現するためのプライベートデータです。x_public は XDR クライアントのためのフィールドでなので、XDR ストリームを実現するために使用したり、XDR プリミティブで使用したりできません。x_getpostn()x_setpostn()x_destroy() はストリームへのアクセス操作に使用するマクロです。

x_inline() ルーチンには、XDR * と符号なし整数 (バイトカウント) の 2 つの引数を渡します。このルーチンからは、ストリームの内部バッファセグメントへのポインタが返されます。呼び出し側ではそのバッファセグメントを自由に使用できます。ストリームは、そのバッファセグメント内のバイトは消費されたと解釈します。このルーチンは、要求されたサイズのバッファセグメントを返せない場合は NULL を返します。


注意 – 注意 –

x_inline() ルーチンは、バッファを反復して使用するためのもので、このバッファの使用は移植可能ではありません。この機能は使用しないでください。


ストリームに対するバイトシーケンスの単純な入出力には、x_getbytes()x_putbytes() を使用します。入出力に成功すれば TRUE、失敗すれば FALSE が返されます。この 2 つのルーチンの引数は同じです (xxx は同じ文字列で置換します)。

bool_t
xxxbytes(xdrs, buf, bytecount)
   XDR *xdrs;
   char *buf;
   u_int bytecount; 

x_getint32()x_putint32() の演算により、データストリームから int 数値を受け取ったり、データストリームへ数値を出力したりできます。これらのルーチンはマシン表現形式と外部 (標準) 表現形式の間で整数を変換します。変換には、UNIX のプリミティブ htonl()ntohl() を利用できます。上位レベルの XDR 対応ソフトウェアでは、符号付きと符号なしの整数のビット数は同じで、負にならない整数のビットパターンは符号なしの整数のビットパターンと同じであるとみなします。入出力に成功すれば TRUE 、失敗すれば FALSE が返されます。

関数 x_getint()x_putint() では、これらの演算を使用します。この 2 つのルーチンの引数は同じです。

bool_t
xxxint(xdrs, ip)
   XDR *xdrs;
   int32_t *ip;

これらの演算の long バージョン (x_getlong()x_putlong()) でも、 x_getint32()x_putint32() を呼び出します。この場合、プログラムがどのようなマシンで実行されていても、処理される量は必ず 4 バイトになります。

XDR ストリームを新規開発するときは、作成ルーチンを使用して、新たな操作ルーチンを持つ XDR 構造体を作成し、クライアントに提供しなければなりません。