#include <stdio.h>
#include <stdlib.h>
#include <rpc/types.h>
#include <rpc/xdr.h>
#include <rpcsvc/mount.h>
bool_t
xdr_mountlist(xdrs, objp)
register XDR *xdrs;
mountlist *objp;
{
bool_t more_data;
switch (xdrs->x_op) {
case XDR_FREE: {
mountbody *mb, *tmp;
tmp = *objp;
while (tmp != NULL) {
mb = tmp;
tmp = mb->ml_next;
if (!xdr_name(xdrs, &mb->ml_hostname))
return (FALSE);
if (!xdr_dirpath(xdrs, &mb->ml_directory))
return (FALSE);
free(mb);
}
break;
}
case XDR_DECODE: {
mountbody *mb;
mountbody *mb_prev = NULL;
for (;;) {
if (!xdr_bool(xdrs, &more_data))
return (FALSE);
if (!more_data)
break;
mb = (mountbody *)malloc(sizeof (struct mountbody));
if (mb == NULL) {
fprintf(stderr,
"xdr_mountlist: out of memory\n");
return (FALSE);
}
mb->ml_hostname = NULL;
mb->ml_directory = NULL;
mb->ml_next = NULL;
if (mb_prev == NULL) {
mb_prev = mb;
*objp = mb;
}
if (!xdr_name(xdrs, &mb->ml_hostname))
return (FALSE);
if (!xdr_dirpath(xdrs, &mb->ml_directory))
return (FALSE);
if (mb_prev != mb) {
mb_prev->ml_next = mb;
mb_prev = mb;
}
}
break;
}
case XDR_ENCODE: {
mountbody *mb;
mb = *objp;
for (;;) {
more_data = mb != NULL;
if (!xdr_bool(xdrs, &more_data))
return (FALSE);
if (!more_data)
break;
if (!xdr_name(xdrs, &mb->ml_hostname))
return (FALSE);
if (!xdr_dirpath(xdrs, &mb->ml_directory))
return (FALSE);
mb = mb->ml_next;
}
break;
}
default:
break;
}
return (TRUE);
}
bool_t
xdr_mountbody(xdrs, objp)
register XDR *xdrs;
mountbody *objp;
{
if (!xdr_name(xdrs, &objp->ml_hostname))
return (FALSE);
if (!xdr_dirpath(xdrs, &objp->ml_directory))
return (FALSE);
if (!xdr_mountlist(xdrs, &objp->ml_next))
return (FALSE);
return (TRUE);
}