static bool_t xdr_my_xfr(register XDR *xdrs, xfr *objp) { unsigned char buf[XFRBLOCKSIZE]; while (1) { if ((objp->xfr_u.xfrblock_buf.xfrblock_buf_len = read(fp, &buf, XFRBLOCKSIZE)) != -1) { objp->ok = TRUE; objp->xfr_u.xfrblock_buf.xfrblock_buf_val = (char *)&buf; } else { objp->ok = FALSE; objp->xfr_u.xfrstat = XFR_READ_ERR; yp_error("read error: %s", strerror(errno)); } /* Serialize */ if (!xdr_xfr(xdrs, objp)) return(FALSE); if (objp->ok == FALSE) return(TRUE); if (objp->xfr_u.xfrblock_buf.xfrblock_buf_len < XFRBLOCKSIZE) { objp->ok = FALSE; objp->xfr_u.xfrstat = XFR_DONE; if (!xdr_xfr(xdrs, objp)) return(FALSE); return(TRUE); } } }
static bool_t xdr_my_xfr(register XDR *xdrs, xfr *objp) { while (1) { if (!xdr_xfr(xdrs, objp)) return(FALSE); if (objp->ok == TRUE) { if (write(fp, objp->xfr_u.xfrblock_buf.xfrblock_buf_val, objp->xfr_u.xfrblock_buf.xfrblock_buf_len) == -1) { yp_error("write failed: %s", strerror(errno)); return(FALSE); } } xdr_free((xdrproc_t)xdr_xfr, (char *)objp); if (objp->ok == FALSE) { switch (objp->xfr_u.xfrstat) { case(XFR_DONE): return(TRUE); break; case(XFR_READ_ERR): yp_error("got read error from rpc.ypxfrd"); return(FALSE); break; case(XFR_ACCESS): yp_error("rpc.ypxfrd couldn't access the map"); return(FALSE); break; case(XFR_DENIED): yp_error("access to map denied by rpc.ypxfrd"); return(FALSE); break; case(XFR_DB_TYPE_MISMATCH): yp_error("client/server DB type mismatch"); return(FALSE); break; case(XFR_DB_ENDIAN_MISMATCH): yp_error("client/server byte order mismatch"); return(FALSE); break; default: yp_error("got unknown status from rpc.ypxfrd"); return(FALSE); break; } } } }
static bool_t xdr_ypxfr_xfr (XDR *xdrs, xfr *objp) { while (1) { if (!xdr_xfr (xdrs, objp)) return (FALSE); if (objp->ok == TRUE) { if (write (ypxfrd_file, objp->xfr_u.xfrblock_buf.xfrblock_buf_val, objp->xfr_u.xfrblock_buf.xfrblock_buf_len) == -1) { log_msg ("write failed: %s", strerror (errno)); return FALSE; } } xdr_free ((xdrproc_t) xdr_xfr, (char *) objp); if (objp->ok == FALSE) { switch (objp->xfr_u.xfrstat) { case XFR_DONE: return TRUE; break; case XFR_DENIED: log_msg ("access to map denied by rpc.ypxfrd"); return FALSE; break; case XFR_NOFILE: log_msg ("reqested map does not exist"); return FALSE; break; case XFR_ACCESS: log_msg ("rpc.ypxfrd couldn't access the map"); return FALSE; break; case XFR_BADDB: log_msg ("file is not a database"); return FALSE; break; case XFR_READ_OK: if (debug_flag) log_msg ("block read successfully"); return TRUE; break; case XFR_READ_ERR: log_msg ("got read error from rpc.ypxfrd"); return FALSE; break; case XFR_DB_ENDIAN_MISMATCH: log_msg ("rpc.ypxfrd databases have the wrong endian"); return FALSE; break; case XFR_DB_TYPE_MISMATCH: log_msg ("rpc.ypxfrd doesn't support the needed database type"); return FALSE; break; default: log_msg ("got unknown status from rpc.ypxfrd"); return FALSE; break; } } } }