#include <rpc/rpc.h>
#include <rpcsvc/yp.h>
#include <stdlib.h>
#include <string.h>
extern int (*ypresp_allfn)(u_long, char *, int, char *, int, void *);
extern void *ypresp_data;
typedef struct {
char *dptr;
int dsize;
} datum;
bool_t
xdr_datum(XDR *xdrs, datum *objp)
{
if (!xdr_bytes(xdrs, (char **)&objp->dptr, (u_int *)&objp->dsize, YPMAXRECORD)) {
return (FALSE);
}
return (TRUE);
}
bool_t
xdr_ypresp_all_seq(XDR *xdrs, u_long *objp)
{
struct ypresp_all out;
u_long status;
char *key, *val;
int r;
bzero(&out, sizeof out);
while (1) {
if (!xdr_ypresp_all(xdrs, &out)) {
xdr_free((xdrproc_t)xdr_ypresp_all, &out);
*objp = YP_YPERR;
return (FALSE);
}
if (out.more == 0) {
xdr_free((xdrproc_t)xdr_ypresp_all, &out);
*objp = YP_NOMORE;
return (TRUE);
}
status = out.ypresp_all_u.val.stat;
switch (status) {
case YP_TRUE:
key = (char *)malloc(out.ypresp_all_u.val.key.keydat_len + 1);
if (key == NULL) {
xdr_free((xdrproc_t)xdr_ypresp_all, &out);
*objp = YP_YPERR;
return (FALSE);
}
bcopy(out.ypresp_all_u.val.key.keydat_val, key,
out.ypresp_all_u.val.key.keydat_len);
key[out.ypresp_all_u.val.key.keydat_len] = '\0';
val = (char *)malloc(out.ypresp_all_u.val.val.valdat_len + 1);
if (val == NULL) {
free(key);
xdr_free((xdrproc_t)xdr_ypresp_all, &out);
*objp = YP_YPERR;
return (FALSE);
}
bcopy(out.ypresp_all_u.val.val.valdat_val, val,
out.ypresp_all_u.val.val.valdat_len);
val[out.ypresp_all_u.val.val.valdat_len] = '\0';
xdr_free((xdrproc_t)xdr_ypresp_all, &out);
r = (*ypresp_allfn)(status,
key, out.ypresp_all_u.val.key.keydat_len,
val, out.ypresp_all_u.val.val.valdat_len,
ypresp_data);
*objp = status;
free(key);
free(val);
if (r)
return (TRUE);
break;
case YP_NOMORE:
xdr_free((xdrproc_t)xdr_ypresp_all, &out);
*objp = YP_NOMORE;
return (TRUE);
default:
xdr_free((xdrproc_t)xdr_ypresp_all, &out);
*objp = status;
return (TRUE);
}
}
}