When using XDR routines, there is sometimes a need to pre-allocate memory (or to determine memory requirements). In these instances where the developer needs to control the allocation and de-allocation of memory for XDR conversion routines to use there is a routine, xdr_sizeof(), that is used to return the number of bytes needed to encode and decode data using one of the XDR filter functions (func()). xdr_sizeof()'s output does not include RPC headers or record markers and they must be added in to get a complete accounting of the memory required. xdr_sizeof() returns a zero on error.
xdr_sizeof(xdrproc_t func, void *data)
xdr_sizeof() is specifically useful the allocation of memory in applications that use XDR outside of the RPC environment; to select between transport protocols; and at the lower levels of RPC to perform client and server creation functions.
Example A-5 and Example A-6 illustrate two uses of xdr_sizeof().
#include <rpc/rpc.h>
/*
* This function takes as input a CLIENT handle, an XDR function
and
* a pointer to data to be XDR'd. It returns TRUE if the amount of
* data to be XDR'd may be sent using the transport associated
with
* the CLIENT handle, and false otherwise.
*/
bool_t
cansend(cl, xdrfunc, xdrdata)
CLIENT *cl;
xdrproc_t xdrfunc;
void *xdrdata;
{
int fd;
struct t_info tinfo;
if (clnt_control(cl, CLGET_FD, &fd) == -1) {
/* handle clnt_control() error */
return (FALSE);
}
if (t_getinfo(fd, &tinfo) == -1) {
/* handle t_getinfo() error */
return (FALSE);
} else {
if (tinfo.servtype == T_CLTS) {
/*
* This is a connectionless transport. Use xdr_sizeof()
* to compute the size of this request to see whether it
* is too large for this transport.
*/
switch(tinfo.tsdu) {
case 0: /* no concept of TSDUs */
case -2: /* can't send normal data */
return (FALSE);
break;
case -1: /* no limit on TSDU size */
return (TRUE);
break;
default:
if (tinfo.tsdu < xdr_sizeof(xdrfunc, xdrdata))
return (FALSE);
else
return (TRUE);
}
} else
return (TRUE);
}
}
|
Example A-6 is the second xdr_sizeof() example.