The first two examples show how Remote Procedure Call (RPC) handles arbitrary data types.
struct simple {
int a;
short b;
} simple;
callrpc(hostname, PROGNUM, VERSNUM, PROCNUM, xdr_simple, &simple ...);
The xdr_simple function is written as:
#include <rpc/rpc.h>
xdr_simple(xdrsp, simplep)
XDR *xdrsp;
struct simple *simplep;
{
if (!xdr_int(xdrsp, &simplep->a))
return (0);
if (!xdr_short(xdrsp, &simplep->b))
return (0);
return (1);
}
struct varintarr {
int *data;
int arrlnth;
} arr;
callrpc(hostname, PROGNUM, VERSNUM, PROCNUM, xdr_varintarr, &arr...);
The xdr_varintarr subroutine is defined as:
xdr_varintarr(xdrsp, arrp)
XDR *xdrsp;
struct varintarr *arrp;
{
return (xdr_array(xdrsp, &arrp->data, &arrp->arrlnth,
MAXLEN, sizeof(int), xdr_int));
}
This routine's parameters are the eXternal Data Representation (XDR) handle (xdrsp ), a pointer to the array (aarp->data ), a pointer to the size of the array (aarp->arrlnth ), the maximum allowable array size (MAXLEN ), the size of each array element (sizeof ), and an XDR routine for handling each array element (xdr_int ).
If the size of the array is known in advance, the programmer can call the xdr_vector subroutine to serialize fixed-length arrays, as in the following example:
int intarr[SIZE];
xdr_intarr(xdrsp, intarr)
XDR *xdrsp;
int intarr[];
{
int i;
return (xdr_vector(xdrsp, intarr, SIZE, sizeof(int), xdr_int)); }
The following example calls the previously written xdr_simple routine as well as the built-in xdr_string and xdr_reference functions. The xdr_reference routine chases pointers.
struct finalexample {
char *string;
struct simple *simplep;
} finalexample;
xdr_finalexample(xdrsp, finalp)
XDR *xdrsp;
struct finalexample *finalp;
{
if (!xdr_string(xdrsp, &finalp->string, MAXSTRLEN)) return (0); if (!xdr_reference(xdrsp, &finalp->simplep, sizeof(struct simple), xdr_simple); return (0); return (1); }