/* * XDR unsigned integers */ bool_t xdr_u_int (XDR *xdrs, unsigned int *up) { xdr_uint32_t l; switch (xdrs->x_op) { case XDR_ENCODE: l = (xdr_uint32_t) (*up); return xdr_putuint32 (xdrs, &l); case XDR_DECODE: if (!xdr_getuint32 (xdrs, &l)) { return FALSE; } *up = (unsigned int) l; case XDR_FREE: return TRUE; } return FALSE; }
/* * XDR unsigned short integers */ bool_t xdr_u_short (XDR *xdrs, unsigned short *usp) { xdr_uint32_t l; switch (xdrs->x_op) { case XDR_ENCODE: l = (xdr_uint32_t) *usp; return xdr_putuint32 (xdrs, &l); case XDR_DECODE: if (!xdr_getuint32 (xdrs, &l)) { return FALSE; } *usp = (unsigned short) l; return TRUE; case XDR_FREE: return TRUE; } return FALSE; }
/* * encode a reply message, log error messages */ bool xdr_reply_encode(XDR *xdrs, struct rpc_msg *dmsg) { struct opaque_auth *oa; int32_t *buf; switch (dmsg->rm_reply.rp_stat) { case MSG_ACCEPTED: { struct accepted_reply *ar = (struct accepted_reply *) &(dmsg->rm_reply.ru); oa = &ar->ar_verf; if (oa->oa_length > MAX_AUTH_BYTES) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s:%u ERROR ar_verf.oa_length (%u) > %u", __func__, __LINE__, oa->oa_length, MAX_AUTH_BYTES); return (false); } buf = XDR_INLINE(xdrs, 6 * BYTES_PER_XDR_UNIT + RNDUP(oa->oa_length)); if (buf != NULL) { __warnx(TIRPC_DEBUG_FLAG_RPC_MSG, "%s:%u ACCEPTED INLINE", __func__, __LINE__); IXDR_PUT_INT32(buf, dmsg->rm_xid); IXDR_PUT_ENUM(buf, dmsg->rm_direction); IXDR_PUT_ENUM(buf, dmsg->rm_reply.rp_stat); IXDR_PUT_ENUM(buf, oa->oa_flavor); IXDR_PUT_INT32(buf, oa->oa_length); if (oa->oa_length) { memcpy(buf, oa->oa_base, oa->oa_length); buf += RNDUP(oa->oa_length) / sizeof(int32_t); } IXDR_PUT_ENUM(buf, ar->ar_stat); switch (ar->ar_stat) { case SUCCESS: __warnx(TIRPC_DEBUG_FLAG_RPC_MSG, "%s:%u SUCCESS", __func__, __LINE__); return ((*(ar->ar_results.proc))(xdrs, ar->ar_results.where)); case PROG_MISMATCH: __warnx(TIRPC_DEBUG_FLAG_RPC_MSG, "%s:%u MISMATCH", __func__, __LINE__); buf = XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT); if (buf != NULL) { IXDR_PUT_ENUM(buf, ar->ar_vers.low); IXDR_PUT_ENUM(buf, ar->ar_vers.high); } else if (!xdr_putuint32(xdrs, &(ar->ar_vers.low))) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s:%u ERROR ar_vers.low %u", __func__, __LINE__, ar->ar_vers.low); return (false); } else if (!xdr_putuint32(xdrs, &(ar->ar_vers.high))) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s:%u ERROR ar_vers.high %u", __func__, __LINE__, ar->ar_vers.high); return (false); } /* fallthru */ case GARBAGE_ARGS: case SYSTEM_ERR: case PROC_UNAVAIL: case PROG_UNAVAIL: break; }; return (true); } else { __warnx(TIRPC_DEBUG_FLAG_RPC_MSG, "%s:%u ACCEPTED non-INLINE", __func__, __LINE__); return (inline_xdr_union(xdrs, (enum_t *) &(dmsg->rm_reply.rp_stat), (caddr_t)(void *)&(dmsg->rm_reply.ru), reply_dscrm, NULL_xdrproc_t)); } /* never arrives here */ break; } case MSG_DENIED: { struct rejected_reply *rr = (struct rejected_reply *) &(dmsg->rm_reply.ru); switch (rr->rj_stat) { case RPC_MISMATCH: __warnx(TIRPC_DEBUG_FLAG_RPC_MSG, "%s:%u DENIED MISMATCH", __func__, __LINE__); buf = XDR_INLINE(xdrs, 3 * BYTES_PER_XDR_UNIT); if (buf != NULL) { IXDR_PUT_ENUM(buf, rr->rj_stat); IXDR_PUT_U_INT32(buf, rr->rj_vers.low); IXDR_PUT_U_INT32(buf, rr->rj_vers.high); } else if (!xdr_putenum(xdrs, rr->rj_stat)) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s:%u ERROR rj_stat %u", __func__, __LINE__, rr->rj_stat); return (false); } else if (!xdr_putuint32(xdrs, &(rr->rj_vers.low))) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s:%u ERROR rj_vers.low %u", __func__, __LINE__, rr->rj_vers.low); return (false); } else if (!xdr_putuint32(xdrs, &(rr->rj_vers.high))) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s:%u ERROR rj_vers.high %u", __func__, __LINE__, rr->rj_vers.high); return (false); } return (true); /* bugfix */ case AUTH_ERROR: __warnx(TIRPC_DEBUG_FLAG_RPC_MSG, "%s:%u DENIED AUTH", __func__, __LINE__); buf = XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT); if (buf != NULL) { IXDR_PUT_ENUM(buf, rr->rj_stat); IXDR_PUT_ENUM(buf, rr->rj_why); } else if (!xdr_putenum(xdrs, rr->rj_stat)) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s:%u ERROR rj_stat %u", __func__, __LINE__, rr->rj_stat); return (false); } else if (!xdr_putenum(xdrs, rr->rj_why)) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s:%u ERROR rj_why %u", __func__, __LINE__, rr->rj_why); return (false); } return (true); /* bugfix */ default: __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s:%u ERROR rr->rj_stat (%u)", __func__, __LINE__, rr->rj_stat); break; }; break; } default: __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s:%u ERROR dmsg->rm_reply.rp_stat (%u)", __func__, __LINE__, dmsg->rm_reply.rp_stat); break; }; return (false); } /* XDR_ENCODE */