main に対するよく知られた引数 argc と argv を組み合わせて構造体を作成します。 これらの構造体の配列でコマンドヒストリを作成できます。構造体の宣言とその XDR ルーチンは次の例のようになります。
struct cmd {
u_int c_argc;
char **c_argv;
};
#define ALEN 1000 /* argc は 1000 以下 */
#define NARGC 100 /* 各コマンドの args は 100 以下 */
struct history {
u_int h_len;
struct cmd *h_cmds;
};
#define NCMDS 75 /* ヒストリは 75 コマンドまで */
bool_t
xdr_wrapstring(xdrs, sp)
XDR *xdrs;
char **sp;
{
return(xdr_string(xdrs, sp, ALEN));
}
bool_t
xdr_cmd(xdrs, cp)
XDR *xdrs;
struct cmd *cp;
{
return(xdr_array(xdrs, &cp->c_argv, &cp->c_argc, NARGC,
sizeof (char *), xdr_wrapstring));
}
bool_t
xdr_history(xdrs, hp)
XDR *xdrs;
struct history *hp;
{
return(xdr_array(xdrs, &hp->h_cmds, &hp->h_len, NCMDS,
sizeof (struct cmd), xdr_cmd));
}
このプログラムの複雑な点は、xdr_string() を呼び出すためのルーチン xdr_wrapstring() が必要な点です。xdr_array() が配列要素記述ルーチンを呼び出すときは引数が 2 つしか渡されないため、xdr_string() の第 3 パラメータを提供するルーチン xdr_wrapstring() が必要になります。xdr_wrapstring() が xdr_string() へ第 3 パラメータを提供します。