aboutsummaryrefslogtreecommitdiff
path: root/sys/rpc/rpc_prot.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/rpc/rpc_prot.c')
-rw-r--r--sys/rpc/rpc_prot.c81
1 files changed, 53 insertions, 28 deletions
diff --git a/sys/rpc/rpc_prot.c b/sys/rpc/rpc_prot.c
index 16f602f58508..294c4e356b5a 100644
--- a/sys/rpc/rpc_prot.c
+++ b/sys/rpc/rpc_prot.c
@@ -64,8 +64,8 @@ MALLOC_DEFINE(M_RPC, "rpc", "Remote Procedure Call");
#define assert(exp) KASSERT(exp, ("bad arguments"))
-static void accepted(enum accept_stat, struct rpc_err *);
-static void rejected(enum reject_stat, struct rpc_err *);
+static enum clnt_stat accepted(enum accept_stat, struct rpc_err *);
+static enum clnt_stat rejected(enum reject_stat, struct rpc_err *);
/* * * * * * * * * * * * * * XDR Authentication * * * * * * * * * * * */
@@ -111,7 +111,11 @@ xdr_accepted_reply(XDR *xdrs, struct accepted_reply *ar)
switch (ar->ar_stat) {
case SUCCESS:
- return ((*(ar->ar_results.proc))(xdrs, ar->ar_results.where));
+ if (ar->ar_results.proc != (xdrproc_t) xdr_void)
+ return ((*(ar->ar_results.proc))(xdrs,
+ ar->ar_results.where));
+ else
+ return (TRUE);
case PROG_MISMATCH:
if (! xdr_uint32_t(xdrs, &(ar->ar_vers.low)))
@@ -171,12 +175,34 @@ static const struct xdr_discrim reply_dscrm[3] = {
bool_t
xdr_replymsg(XDR *xdrs, struct rpc_msg *rmsg)
{
+ int32_t *buf;
enum msg_type *prm_direction;
enum reply_stat *prp_stat;
assert(xdrs != NULL);
assert(rmsg != NULL);
+ if (xdrs->x_op == XDR_DECODE) {
+ buf = XDR_INLINE(xdrs, 3 * BYTES_PER_XDR_UNIT);
+ if (buf != NULL) {
+ rmsg->rm_xid = IXDR_GET_UINT32(buf);
+ rmsg->rm_direction = IXDR_GET_ENUM(buf, enum msg_type);
+ if (rmsg->rm_direction != REPLY) {
+ return (FALSE);
+ }
+ rmsg->rm_reply.rp_stat =
+ IXDR_GET_ENUM(buf, enum reply_stat);
+ if (rmsg->rm_reply.rp_stat == MSG_ACCEPTED)
+ return (xdr_accepted_reply(xdrs,
+ &rmsg->acpted_rply));
+ else if (rmsg->rm_reply.rp_stat == MSG_DENIED)
+ return (xdr_rejected_reply(xdrs,
+ &rmsg->rjcted_rply));
+ else
+ return (FALSE);
+ }
+ }
+
prm_direction = &rmsg->rm_direction;
prp_stat = &rmsg->rm_reply.rp_stat;
@@ -220,7 +246,7 @@ xdr_callhdr(XDR *xdrs, struct rpc_msg *cmsg)
/* ************************** Client utility routine ************* */
-static void
+static enum clnt_stat
accepted(enum accept_stat acpt_stat, struct rpc_err *error)
{
@@ -230,36 +256,32 @@ accepted(enum accept_stat acpt_stat, struct rpc_err *error)
case PROG_UNAVAIL:
error->re_status = RPC_PROGUNAVAIL;
- return;
+ return (RPC_PROGUNAVAIL);
case PROG_MISMATCH:
error->re_status = RPC_PROGVERSMISMATCH;
- return;
+ return (RPC_PROGVERSMISMATCH);
case PROC_UNAVAIL:
- error->re_status = RPC_PROCUNAVAIL;
- return;
+ return (RPC_PROCUNAVAIL);
case GARBAGE_ARGS:
- error->re_status = RPC_CANTDECODEARGS;
- return;
+ return (RPC_CANTDECODEARGS);
case SYSTEM_ERR:
- error->re_status = RPC_SYSTEMERROR;
- return;
+ return (RPC_SYSTEMERROR);
case SUCCESS:
- error->re_status = RPC_SUCCESS;
- return;
+ return (RPC_SUCCESS);
}
/* NOTREACHED */
/* something's wrong, but we don't know what ... */
- error->re_status = RPC_FAILED;
error->re_lb.s1 = (int32_t)MSG_ACCEPTED;
error->re_lb.s2 = (int32_t)acpt_stat;
+ return (RPC_FAILED);
}
-static void
+static enum clnt_stat
rejected(enum reject_stat rjct_stat, struct rpc_err *error)
{
@@ -267,26 +289,25 @@ rejected(enum reject_stat rjct_stat, struct rpc_err *error)
switch (rjct_stat) {
case RPC_MISMATCH:
- error->re_status = RPC_VERSMISMATCH;
- return;
+ return (RPC_VERSMISMATCH);
case AUTH_ERROR:
- error->re_status = RPC_AUTHERROR;
- return;
+ return (RPC_AUTHERROR);
}
/* something's wrong, but we don't know what ... */
/* NOTREACHED */
- error->re_status = RPC_FAILED;
error->re_lb.s1 = (int32_t)MSG_DENIED;
error->re_lb.s2 = (int32_t)rjct_stat;
+ return (RPC_FAILED);
}
/*
* given a reply message, fills in the error
*/
-void
+enum clnt_stat
_seterr_reply(struct rpc_msg *msg, struct rpc_err *error)
{
+ enum clnt_stat stat;
assert(msg != NULL);
assert(error != NULL);
@@ -296,22 +317,24 @@ _seterr_reply(struct rpc_msg *msg, struct rpc_err *error)
case MSG_ACCEPTED:
if (msg->acpted_rply.ar_stat == SUCCESS) {
- error->re_status = RPC_SUCCESS;
- return;
+ stat = RPC_SUCCESS;
+ return (stat);
}
- accepted(msg->acpted_rply.ar_stat, error);
+ stat = accepted(msg->acpted_rply.ar_stat, error);
break;
case MSG_DENIED:
- rejected(msg->rjcted_rply.rj_stat, error);
+ stat = rejected(msg->rjcted_rply.rj_stat, error);
break;
default:
- error->re_status = RPC_FAILED;
+ stat = RPC_FAILED;
error->re_lb.s1 = (int32_t)(msg->rm_reply.rp_stat);
break;
}
- switch (error->re_status) {
+ error->re_status = stat;
+
+ switch (stat) {
case RPC_VERSMISMATCH:
error->re_vers.low = msg->rjcted_rply.rj_vers.low;
@@ -345,4 +368,6 @@ _seterr_reply(struct rpc_msg *msg, struct rpc_err *error)
default:
break;
}
+
+ return (stat);
}