ONC+ 開発ガイド

下位レベルのデータ構造

次のデータ構造は参考のために示します。この実装は、変更される可能性があります。

最初に示す構造体はクライアント側の RPC ハンドルで、 <rpc/clnt.h> で定義されています。下位レベルの RPC を使用する場合は、次に示すように接続ごとに1 つのハンドルを作成して初期化する必要があります。


例 4–16 クライアント側 RPC ハンドル (CLIENT 構造体)

typedef struct {
	AUTH *cl_auth;								/* 認証情報 */
	struct clnt_ops {
		enum clnt_stat	(*cl_call)();  /* リモートプロシージャ呼び出し */
		void			(*cl_abort)();		/* 呼び出しの中止 */
		void			(*cl_geterr)();		/* 特定エラーコードの取得 */
 	bool_t			(*cl_freeres)();	/* 戻り値の解放*/
		void			(*cl_destroy)(); 	/* この構造体の破棄 */
		bool_t			(*cl_control)();	/* RPC の ioctl() */
	} *cl_ops;
	caddrt_t			cl_private;				/* プライベートに使用 */
	char			*cl_netid;					/* ネットワークトークン */
 char			*cl_tp;						/* デバイス名 */
} CLIENT;

クライアント側ハンドルの第 1 フィールドは、 <rpc/auth.h> で定義された認証情報の構造体です。このフィールドはデフォルトで、AUTH_NONE に設定されています。次に示すように、必要に応じてクライアント側プログラムで cl_auth を初期化する必要があります。


例 4–17 クライアント側の認証ハンドル

typedef struct {
	struct			opaque_auth  ah_cred;
 struct			opaque_auth  ah_verf;
	union			des_block    ah_key;
 struct auth_ops {
		void		(*ah_nextverf)();
 	int		(*ah_marshal)();			/* nextverf とシリアライズ */
		int		(*ah_validate)(); 		/* 妥当性検査の確認 */
		int		(*ah_refresh)();			/* 資格のリフレッシュ */
 	void		(*ah_destroy)();			/* この構造体の破棄 */
	} *ah_ops;
 caddr_t ah_private;
} AUTH;

AUTH 構造体の ah_cred には呼び出し側の資格が、ah_verf には資格を確認するためのデータが入っています。詳細については、認証 を参照してください

次に、サーバー側のトランスポートハンドルを示します。


例 4–18 サーバー側のトランスポートハンドル

typedef struct {
	int			xp_fd;
#define xp_sock					xp_fd
	u_short xp_port;		/* 結合されたポート番号、旧形式 */
 struct xp_ops {
	    bool_t				(*xp_recv)();		/* 要求の受信 */
    enum xprt_stat (*xp_stat)();		/* トランスポートステータスの取得 */
	    bool_t				(*xp_getargs)();	/* 引数の取り出し */
	    bool_t				(*xp_reply)(); 		/* 応答の送信 */
	    bool_t		(*xp_freeargs)();
					/* 引数に割り当てたメモリーの解放 */
	    void				(*xp_destroy)();		/* この構造体の破棄 */
 } *xp_ops;
	int		xp_addrlen;    /* リモートアドレスの長さ、旧形式 */
 	char		*xp_tp;        /* トランスポートプロバイダのデバイス名 */
	char		*xp_netid; 	
	/* ネットワークトークン */
	struct netbuf  xp_ltaddr;	/* ローカルトランスポートアドレス */
	struct netbuf  xp_rtaddr;	/* リモートトランスポートアドレス */
 char				xp_raddr[16];	/* リモートアドレス、旧形式 */
	struct opaque_auth xp_verf;	/* raw 応答の確認 */
	caddr_t				xp_p1;		/* プライベート: svc ops で使用 */
	caddr_t				xp_p2;		/* プライベート: svc ops で使用 */
 caddr_t				xp_p3;		/* プライベート: svc lib で使用 */
} SVCXPRT;

次の表では、サーバー側のトランスポートハンドルに対応するフィールドが示されています。

xp_fd

ハンドルに結合したファイル記述子。複数のサーバーハンドルで 1 つのファイル記述子を共有できる 

xp_netid

トランスポートのネットワーク ID (たとえば、udp)。ハンドルはこのトランスポート上に作成される。xp_tp は、このトランスポートに結合したデバイス名

xp_ltaddr

サーバー自身の結合アドレス 

xp_rtaddr

RPC の呼び出し側アドレス (したがって、呼び出しのたびに変る) 

xp_netid xp_tp xp_ltaddr

svc_tli_create() のようなエキスパートレベルのルーチンで初期化される

その他のフィールドは、ボトムレベルのサーバールーチン svc_dg_create()svc_vc_create() で初期化されます。

接続型端点では、 次の各フィールドには、接続要求がサーバーに受け入れられるまで正しい値が入りません。