ssize_t xdr_to_generic_payload(struct iovec inmsg, void *args, xdrproc_t proc, struct iovec *pendingpayload) { XDR xdr; ssize_t ret = -1; if ((!inmsg.iov_base) || (!args) || (!proc)) return -1; xdrmem_create(&xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len, XDR_DECODE); if (!PROC(&xdr, args)) { ret = -1; goto ret; } ret = xdr_decoded_length(xdr); if (pendingpayload) { pendingpayload->iov_base = xdr_decoded_remaining_addr(xdr); pendingpayload->iov_len = xdr_decoded_remaining_len(xdr); } ret: return ret; }
/* Decodes the XDR format in msgbuf into rpc_msg. * The remaining payload is returned into payload. */ int xdr_to_rpc_reply(char *msgbuf, size_t len, struct rpc_msg *reply, struct iovec *payload, char *verfbytes) { XDR xdr; int ret = -EINVAL; GF_VALIDATE_OR_GOTO("rpc", msgbuf, out); GF_VALIDATE_OR_GOTO("rpc", reply, out); memset(reply, 0, sizeof(struct rpc_msg)); reply->acpted_rply.ar_verf = _null_auth; reply->acpted_rply.ar_results.where = NULL; reply->acpted_rply.ar_results.proc = (xdrproc_t)(xdr_void); xdrmem_create(&xdr, msgbuf, len, XDR_DECODE); if (!xdr_replymsg(&xdr, reply)) { gf_log("rpc", GF_LOG_WARNING, "failed to decode reply msg"); goto out; } if (payload) { payload->iov_base = xdr_decoded_remaining_addr(xdr); payload->iov_len = xdr_decoded_remaining_len(xdr); } ret = 0; out: return ret; }
/* Decodes the XDR format in msgbuf into rpc_msg. * The remaining payload is returned into payload. */ int xdr_to_rpc_call (char *msgbuf, size_t len, struct rpc_msg *call, struct iovec *payload, char *credbytes, char *verfbytes) { XDR xdr; char opaquebytes[MAX_AUTH_BYTES]; struct opaque_auth *oa = NULL; int ret = -1; GF_VALIDATE_OR_GOTO ("rpc", msgbuf, out); GF_VALIDATE_OR_GOTO ("rpc", call, out); memset (call, 0, sizeof (*call)); oa = &call->rm_call.cb_cred; if (!credbytes) oa->oa_base = opaquebytes; else oa->oa_base = credbytes; oa = &call->rm_call.cb_verf; if (!verfbytes) oa->oa_base = opaquebytes; else oa->oa_base = verfbytes; xdrmem_create (&xdr, msgbuf, len, XDR_DECODE); if (!xdr_callmsg (&xdr, call)) { gf_log ("rpc", GF_LOG_WARNING, "failed to decode call msg"); goto out; } if (payload) { payload->iov_base = xdr_decoded_remaining_addr (xdr); payload->iov_len = xdr_decoded_remaining_len (xdr); } ret = 0; out: return ret; }