1dfdcada3SDoug Rabson /* $NetBSD: rpc_prot.c,v 1.16 2000/06/02 23:11:13 fvdl Exp $ */ 2dfdcada3SDoug Rabson 3dfdcada3SDoug Rabson /* 4dfdcada3SDoug Rabson * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 5dfdcada3SDoug Rabson * unrestricted use provided that this legend is included on all tape 6dfdcada3SDoug Rabson * media and as a part of the software program in whole or part. Users 7dfdcada3SDoug Rabson * may copy or modify Sun RPC without charge, but are not authorized 8dfdcada3SDoug Rabson * to license or distribute it to anyone else except as part of a product or 9dfdcada3SDoug Rabson * program developed by the user. 10dfdcada3SDoug Rabson * 11dfdcada3SDoug Rabson * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 12dfdcada3SDoug Rabson * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 13dfdcada3SDoug Rabson * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 14dfdcada3SDoug Rabson * 15dfdcada3SDoug Rabson * Sun RPC is provided with no support and without any obligation on the 16dfdcada3SDoug Rabson * part of Sun Microsystems, Inc. to assist in its use, correction, 17dfdcada3SDoug Rabson * modification or enhancement. 18dfdcada3SDoug Rabson * 19dfdcada3SDoug Rabson * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 20dfdcada3SDoug Rabson * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 21dfdcada3SDoug Rabson * OR ANY PART THEREOF. 22dfdcada3SDoug Rabson * 23dfdcada3SDoug Rabson * In no event will Sun Microsystems, Inc. be liable for any lost revenue 24dfdcada3SDoug Rabson * or profits or other special, indirect and consequential damages, even if 25dfdcada3SDoug Rabson * Sun has been advised of the possibility of such damages. 26dfdcada3SDoug Rabson * 27dfdcada3SDoug Rabson * Sun Microsystems, Inc. 28dfdcada3SDoug Rabson * 2550 Garcia Avenue 29dfdcada3SDoug Rabson * Mountain View, California 94043 30dfdcada3SDoug Rabson */ 31dfdcada3SDoug Rabson 32dfdcada3SDoug Rabson #if defined(LIBC_SCCS) && !defined(lint) 33dfdcada3SDoug Rabson static char *sccsid2 = "@(#)rpc_prot.c 1.36 87/08/11 Copyr 1984 Sun Micro"; 34dfdcada3SDoug Rabson static char *sccsid = "@(#)rpc_prot.c 2.3 88/08/07 4.0 RPCSRC"; 35dfdcada3SDoug Rabson #endif 36dfdcada3SDoug Rabson #include <sys/cdefs.h> 37dfdcada3SDoug Rabson __FBSDID("$FreeBSD$"); 38dfdcada3SDoug Rabson 39dfdcada3SDoug Rabson /* 40dfdcada3SDoug Rabson * rpc_prot.c 41dfdcada3SDoug Rabson * 42dfdcada3SDoug Rabson * Copyright (C) 1984, Sun Microsystems, Inc. 43dfdcada3SDoug Rabson * 44dfdcada3SDoug Rabson * This set of routines implements the rpc message definition, 45dfdcada3SDoug Rabson * its serializer and some common rpc utility routines. 46dfdcada3SDoug Rabson * The routines are meant for various implementations of rpc - 47dfdcada3SDoug Rabson * they are NOT for the rpc client or rpc service implementations! 48dfdcada3SDoug Rabson * Because authentication stuff is easy and is part of rpc, the opaque 49dfdcada3SDoug Rabson * routines are also in this program. 50dfdcada3SDoug Rabson */ 51dfdcada3SDoug Rabson 52dfdcada3SDoug Rabson #include <sys/param.h> 53dfdcada3SDoug Rabson #include <sys/systm.h> 54dfdcada3SDoug Rabson #include <sys/kernel.h> 55dfdcada3SDoug Rabson #include <sys/malloc.h> 56dfdcada3SDoug Rabson 57dfdcada3SDoug Rabson #include <rpc/types.h> 58dfdcada3SDoug Rabson #include <rpc/xdr.h> 59dfdcada3SDoug Rabson #include <rpc/auth.h> 60dfdcada3SDoug Rabson #include <rpc/clnt.h> 61dfdcada3SDoug Rabson #include <rpc/rpc_msg.h> 62dfdcada3SDoug Rabson 63dfdcada3SDoug Rabson MALLOC_DEFINE(M_RPC, "rpc", "Remote Procedure Call"); 64dfdcada3SDoug Rabson 65dfdcada3SDoug Rabson #define assert(exp) KASSERT(exp, ("bad arguments")) 66dfdcada3SDoug Rabson 67a9148abdSDoug Rabson static enum clnt_stat accepted(enum accept_stat, struct rpc_err *); 68a9148abdSDoug Rabson static enum clnt_stat rejected(enum reject_stat, struct rpc_err *); 69dfdcada3SDoug Rabson 70dfdcada3SDoug Rabson /* * * * * * * * * * * * * * XDR Authentication * * * * * * * * * * * */ 71dfdcada3SDoug Rabson 72dfdcada3SDoug Rabson struct opaque_auth _null_auth; 73dfdcada3SDoug Rabson 74dfdcada3SDoug Rabson /* 75dfdcada3SDoug Rabson * XDR an opaque authentication struct 76dfdcada3SDoug Rabson * (see auth.h) 77dfdcada3SDoug Rabson */ 78dfdcada3SDoug Rabson bool_t 79dfdcada3SDoug Rabson xdr_opaque_auth(XDR *xdrs, struct opaque_auth *ap) 80dfdcada3SDoug Rabson { 81dfdcada3SDoug Rabson 82dfdcada3SDoug Rabson assert(xdrs != NULL); 83dfdcada3SDoug Rabson assert(ap != NULL); 84dfdcada3SDoug Rabson 85dfdcada3SDoug Rabson if (xdr_enum(xdrs, &(ap->oa_flavor))) 86dfdcada3SDoug Rabson return (xdr_bytes(xdrs, &ap->oa_base, 87dfdcada3SDoug Rabson &ap->oa_length, MAX_AUTH_BYTES)); 88dfdcada3SDoug Rabson return (FALSE); 89dfdcada3SDoug Rabson } 90dfdcada3SDoug Rabson 91dfdcada3SDoug Rabson /* * * * * * * * * * * * * * XDR RPC MESSAGE * * * * * * * * * * * * * * * */ 92dfdcada3SDoug Rabson 93dfdcada3SDoug Rabson /* 94dfdcada3SDoug Rabson * XDR the MSG_ACCEPTED part of a reply message union 95dfdcada3SDoug Rabson */ 96dfdcada3SDoug Rabson bool_t 97dfdcada3SDoug Rabson xdr_accepted_reply(XDR *xdrs, struct accepted_reply *ar) 98dfdcada3SDoug Rabson { 99dfdcada3SDoug Rabson enum accept_stat *par_stat; 100dfdcada3SDoug Rabson 101dfdcada3SDoug Rabson assert(xdrs != NULL); 102dfdcada3SDoug Rabson assert(ar != NULL); 103dfdcada3SDoug Rabson 104dfdcada3SDoug Rabson par_stat = &ar->ar_stat; 105dfdcada3SDoug Rabson 106dfdcada3SDoug Rabson /* personalized union, rather than calling xdr_union */ 107dfdcada3SDoug Rabson if (! xdr_opaque_auth(xdrs, &(ar->ar_verf))) 108dfdcada3SDoug Rabson return (FALSE); 109dfdcada3SDoug Rabson if (! xdr_enum(xdrs, (enum_t *) par_stat)) 110dfdcada3SDoug Rabson return (FALSE); 111dfdcada3SDoug Rabson switch (ar->ar_stat) { 112dfdcada3SDoug Rabson 113dfdcada3SDoug Rabson case SUCCESS: 114a9148abdSDoug Rabson if (ar->ar_results.proc != (xdrproc_t) xdr_void) 115a9148abdSDoug Rabson return ((*(ar->ar_results.proc))(xdrs, 116a9148abdSDoug Rabson ar->ar_results.where)); 117a9148abdSDoug Rabson else 118a9148abdSDoug Rabson return (TRUE); 119dfdcada3SDoug Rabson 120dfdcada3SDoug Rabson case PROG_MISMATCH: 121dfdcada3SDoug Rabson if (! xdr_uint32_t(xdrs, &(ar->ar_vers.low))) 122dfdcada3SDoug Rabson return (FALSE); 123dfdcada3SDoug Rabson return (xdr_uint32_t(xdrs, &(ar->ar_vers.high))); 124dfdcada3SDoug Rabson 125dfdcada3SDoug Rabson case GARBAGE_ARGS: 126dfdcada3SDoug Rabson case SYSTEM_ERR: 127dfdcada3SDoug Rabson case PROC_UNAVAIL: 128dfdcada3SDoug Rabson case PROG_UNAVAIL: 129dfdcada3SDoug Rabson break; 130dfdcada3SDoug Rabson } 131dfdcada3SDoug Rabson return (TRUE); /* TRUE => open ended set of problems */ 132dfdcada3SDoug Rabson } 133dfdcada3SDoug Rabson 134dfdcada3SDoug Rabson /* 135dfdcada3SDoug Rabson * XDR the MSG_DENIED part of a reply message union 136dfdcada3SDoug Rabson */ 137dfdcada3SDoug Rabson bool_t 138dfdcada3SDoug Rabson xdr_rejected_reply(XDR *xdrs, struct rejected_reply *rr) 139dfdcada3SDoug Rabson { 140dfdcada3SDoug Rabson enum reject_stat *prj_stat; 141dfdcada3SDoug Rabson enum auth_stat *prj_why; 142dfdcada3SDoug Rabson 143dfdcada3SDoug Rabson assert(xdrs != NULL); 144dfdcada3SDoug Rabson assert(rr != NULL); 145dfdcada3SDoug Rabson 146dfdcada3SDoug Rabson prj_stat = &rr->rj_stat; 147dfdcada3SDoug Rabson 148dfdcada3SDoug Rabson /* personalized union, rather than calling xdr_union */ 149dfdcada3SDoug Rabson if (! xdr_enum(xdrs, (enum_t *) prj_stat)) 150dfdcada3SDoug Rabson return (FALSE); 151dfdcada3SDoug Rabson switch (rr->rj_stat) { 152dfdcada3SDoug Rabson 153dfdcada3SDoug Rabson case RPC_MISMATCH: 154dfdcada3SDoug Rabson if (! xdr_uint32_t(xdrs, &(rr->rj_vers.low))) 155dfdcada3SDoug Rabson return (FALSE); 156dfdcada3SDoug Rabson return (xdr_uint32_t(xdrs, &(rr->rj_vers.high))); 157dfdcada3SDoug Rabson 158dfdcada3SDoug Rabson case AUTH_ERROR: 159dfdcada3SDoug Rabson prj_why = &rr->rj_why; 160dfdcada3SDoug Rabson return (xdr_enum(xdrs, (enum_t *) prj_why)); 161dfdcada3SDoug Rabson } 162dfdcada3SDoug Rabson /* NOTREACHED */ 163dfdcada3SDoug Rabson assert(0); 164dfdcada3SDoug Rabson return (FALSE); 165dfdcada3SDoug Rabson } 166dfdcada3SDoug Rabson 167dfdcada3SDoug Rabson static const struct xdr_discrim reply_dscrm[3] = { 168dfdcada3SDoug Rabson { (int)MSG_ACCEPTED, (xdrproc_t)xdr_accepted_reply }, 169dfdcada3SDoug Rabson { (int)MSG_DENIED, (xdrproc_t)xdr_rejected_reply }, 170dfdcada3SDoug Rabson { __dontcare__, NULL_xdrproc_t } }; 171dfdcada3SDoug Rabson 172dfdcada3SDoug Rabson /* 173dfdcada3SDoug Rabson * XDR a reply message 174dfdcada3SDoug Rabson */ 175dfdcada3SDoug Rabson bool_t 176dfdcada3SDoug Rabson xdr_replymsg(XDR *xdrs, struct rpc_msg *rmsg) 177dfdcada3SDoug Rabson { 178a9148abdSDoug Rabson int32_t *buf; 179dfdcada3SDoug Rabson enum msg_type *prm_direction; 180dfdcada3SDoug Rabson enum reply_stat *prp_stat; 181dfdcada3SDoug Rabson 182dfdcada3SDoug Rabson assert(xdrs != NULL); 183dfdcada3SDoug Rabson assert(rmsg != NULL); 184dfdcada3SDoug Rabson 185a9148abdSDoug Rabson if (xdrs->x_op == XDR_DECODE) { 186a9148abdSDoug Rabson buf = XDR_INLINE(xdrs, 3 * BYTES_PER_XDR_UNIT); 187a9148abdSDoug Rabson if (buf != NULL) { 188a9148abdSDoug Rabson rmsg->rm_xid = IXDR_GET_UINT32(buf); 189a9148abdSDoug Rabson rmsg->rm_direction = IXDR_GET_ENUM(buf, enum msg_type); 190a9148abdSDoug Rabson if (rmsg->rm_direction != REPLY) { 191a9148abdSDoug Rabson return (FALSE); 192a9148abdSDoug Rabson } 193a9148abdSDoug Rabson rmsg->rm_reply.rp_stat = 194a9148abdSDoug Rabson IXDR_GET_ENUM(buf, enum reply_stat); 195a9148abdSDoug Rabson if (rmsg->rm_reply.rp_stat == MSG_ACCEPTED) 196a9148abdSDoug Rabson return (xdr_accepted_reply(xdrs, 197a9148abdSDoug Rabson &rmsg->acpted_rply)); 198a9148abdSDoug Rabson else if (rmsg->rm_reply.rp_stat == MSG_DENIED) 199a9148abdSDoug Rabson return (xdr_rejected_reply(xdrs, 200a9148abdSDoug Rabson &rmsg->rjcted_rply)); 201a9148abdSDoug Rabson else 202a9148abdSDoug Rabson return (FALSE); 203a9148abdSDoug Rabson } 204a9148abdSDoug Rabson } 205a9148abdSDoug Rabson 206dfdcada3SDoug Rabson prm_direction = &rmsg->rm_direction; 207dfdcada3SDoug Rabson prp_stat = &rmsg->rm_reply.rp_stat; 208dfdcada3SDoug Rabson 209dfdcada3SDoug Rabson if ( 210dfdcada3SDoug Rabson xdr_uint32_t(xdrs, &(rmsg->rm_xid)) && 211dfdcada3SDoug Rabson xdr_enum(xdrs, (enum_t *) prm_direction) && 212dfdcada3SDoug Rabson (rmsg->rm_direction == REPLY) ) 213dfdcada3SDoug Rabson return (xdr_union(xdrs, (enum_t *) prp_stat, 214dfdcada3SDoug Rabson (caddr_t)(void *)&(rmsg->rm_reply.ru), reply_dscrm, 215dfdcada3SDoug Rabson NULL_xdrproc_t)); 216dfdcada3SDoug Rabson return (FALSE); 217dfdcada3SDoug Rabson } 218dfdcada3SDoug Rabson 219dfdcada3SDoug Rabson 220dfdcada3SDoug Rabson /* 221dfdcada3SDoug Rabson * Serializes the "static part" of a call message header. 222dfdcada3SDoug Rabson * The fields include: rm_xid, rm_direction, rpcvers, prog, and vers. 223dfdcada3SDoug Rabson * The rm_xid is not really static, but the user can easily munge on the fly. 224dfdcada3SDoug Rabson */ 225dfdcada3SDoug Rabson bool_t 226dfdcada3SDoug Rabson xdr_callhdr(XDR *xdrs, struct rpc_msg *cmsg) 227dfdcada3SDoug Rabson { 228dfdcada3SDoug Rabson enum msg_type *prm_direction; 229dfdcada3SDoug Rabson 230dfdcada3SDoug Rabson assert(xdrs != NULL); 231dfdcada3SDoug Rabson assert(cmsg != NULL); 232dfdcada3SDoug Rabson 233dfdcada3SDoug Rabson prm_direction = &cmsg->rm_direction; 234dfdcada3SDoug Rabson 235dfdcada3SDoug Rabson cmsg->rm_direction = CALL; 236dfdcada3SDoug Rabson cmsg->rm_call.cb_rpcvers = RPC_MSG_VERSION; 237dfdcada3SDoug Rabson if ( 238dfdcada3SDoug Rabson (xdrs->x_op == XDR_ENCODE) && 239dfdcada3SDoug Rabson xdr_uint32_t(xdrs, &(cmsg->rm_xid)) && 240dfdcada3SDoug Rabson xdr_enum(xdrs, (enum_t *) prm_direction) && 241dfdcada3SDoug Rabson xdr_uint32_t(xdrs, &(cmsg->rm_call.cb_rpcvers)) && 242dfdcada3SDoug Rabson xdr_uint32_t(xdrs, &(cmsg->rm_call.cb_prog)) ) 243dfdcada3SDoug Rabson return (xdr_uint32_t(xdrs, &(cmsg->rm_call.cb_vers))); 244dfdcada3SDoug Rabson return (FALSE); 245dfdcada3SDoug Rabson } 246dfdcada3SDoug Rabson 247dfdcada3SDoug Rabson /* ************************** Client utility routine ************* */ 248dfdcada3SDoug Rabson 249a9148abdSDoug Rabson static enum clnt_stat 250dfdcada3SDoug Rabson accepted(enum accept_stat acpt_stat, struct rpc_err *error) 251dfdcada3SDoug Rabson { 252dfdcada3SDoug Rabson 253dfdcada3SDoug Rabson assert(error != NULL); 254dfdcada3SDoug Rabson 255dfdcada3SDoug Rabson switch (acpt_stat) { 256dfdcada3SDoug Rabson 257dfdcada3SDoug Rabson case PROG_UNAVAIL: 258dfdcada3SDoug Rabson error->re_status = RPC_PROGUNAVAIL; 259a9148abdSDoug Rabson return (RPC_PROGUNAVAIL); 260dfdcada3SDoug Rabson 261dfdcada3SDoug Rabson case PROG_MISMATCH: 262dfdcada3SDoug Rabson error->re_status = RPC_PROGVERSMISMATCH; 263a9148abdSDoug Rabson return (RPC_PROGVERSMISMATCH); 264dfdcada3SDoug Rabson 265dfdcada3SDoug Rabson case PROC_UNAVAIL: 266a9148abdSDoug Rabson return (RPC_PROCUNAVAIL); 267dfdcada3SDoug Rabson 268dfdcada3SDoug Rabson case GARBAGE_ARGS: 269a9148abdSDoug Rabson return (RPC_CANTDECODEARGS); 270dfdcada3SDoug Rabson 271dfdcada3SDoug Rabson case SYSTEM_ERR: 272a9148abdSDoug Rabson return (RPC_SYSTEMERROR); 273dfdcada3SDoug Rabson 274dfdcada3SDoug Rabson case SUCCESS: 275a9148abdSDoug Rabson return (RPC_SUCCESS); 276dfdcada3SDoug Rabson } 277dfdcada3SDoug Rabson /* NOTREACHED */ 278dfdcada3SDoug Rabson /* something's wrong, but we don't know what ... */ 279dfdcada3SDoug Rabson error->re_lb.s1 = (int32_t)MSG_ACCEPTED; 280dfdcada3SDoug Rabson error->re_lb.s2 = (int32_t)acpt_stat; 281a9148abdSDoug Rabson return (RPC_FAILED); 282dfdcada3SDoug Rabson } 283dfdcada3SDoug Rabson 284a9148abdSDoug Rabson static enum clnt_stat 285dfdcada3SDoug Rabson rejected(enum reject_stat rjct_stat, struct rpc_err *error) 286dfdcada3SDoug Rabson { 287dfdcada3SDoug Rabson 288dfdcada3SDoug Rabson assert(error != NULL); 289dfdcada3SDoug Rabson 290dfdcada3SDoug Rabson switch (rjct_stat) { 291dfdcada3SDoug Rabson case RPC_MISMATCH: 292a9148abdSDoug Rabson return (RPC_VERSMISMATCH); 293dfdcada3SDoug Rabson 294dfdcada3SDoug Rabson case AUTH_ERROR: 295a9148abdSDoug Rabson return (RPC_AUTHERROR); 296dfdcada3SDoug Rabson } 297dfdcada3SDoug Rabson /* something's wrong, but we don't know what ... */ 298dfdcada3SDoug Rabson /* NOTREACHED */ 299dfdcada3SDoug Rabson error->re_lb.s1 = (int32_t)MSG_DENIED; 300dfdcada3SDoug Rabson error->re_lb.s2 = (int32_t)rjct_stat; 301a9148abdSDoug Rabson return (RPC_FAILED); 302dfdcada3SDoug Rabson } 303dfdcada3SDoug Rabson 304dfdcada3SDoug Rabson /* 305dfdcada3SDoug Rabson * given a reply message, fills in the error 306dfdcada3SDoug Rabson */ 307a9148abdSDoug Rabson enum clnt_stat 308dfdcada3SDoug Rabson _seterr_reply(struct rpc_msg *msg, struct rpc_err *error) 309dfdcada3SDoug Rabson { 310a9148abdSDoug Rabson enum clnt_stat stat; 311dfdcada3SDoug Rabson 312dfdcada3SDoug Rabson assert(msg != NULL); 313dfdcada3SDoug Rabson assert(error != NULL); 314dfdcada3SDoug Rabson 315dfdcada3SDoug Rabson /* optimized for normal, SUCCESSful case */ 316dfdcada3SDoug Rabson switch (msg->rm_reply.rp_stat) { 317dfdcada3SDoug Rabson 318dfdcada3SDoug Rabson case MSG_ACCEPTED: 319dfdcada3SDoug Rabson if (msg->acpted_rply.ar_stat == SUCCESS) { 320a9148abdSDoug Rabson stat = RPC_SUCCESS; 321a9148abdSDoug Rabson return (stat); 322dfdcada3SDoug Rabson } 323a9148abdSDoug Rabson stat = accepted(msg->acpted_rply.ar_stat, error); 324dfdcada3SDoug Rabson break; 325dfdcada3SDoug Rabson 326dfdcada3SDoug Rabson case MSG_DENIED: 327a9148abdSDoug Rabson stat = rejected(msg->rjcted_rply.rj_stat, error); 328dfdcada3SDoug Rabson break; 329dfdcada3SDoug Rabson 330dfdcada3SDoug Rabson default: 331a9148abdSDoug Rabson stat = RPC_FAILED; 332dfdcada3SDoug Rabson error->re_lb.s1 = (int32_t)(msg->rm_reply.rp_stat); 333dfdcada3SDoug Rabson break; 334dfdcada3SDoug Rabson } 335a9148abdSDoug Rabson error->re_status = stat; 336a9148abdSDoug Rabson 337a9148abdSDoug Rabson switch (stat) { 338dfdcada3SDoug Rabson 339dfdcada3SDoug Rabson case RPC_VERSMISMATCH: 340dfdcada3SDoug Rabson error->re_vers.low = msg->rjcted_rply.rj_vers.low; 341dfdcada3SDoug Rabson error->re_vers.high = msg->rjcted_rply.rj_vers.high; 342dfdcada3SDoug Rabson break; 343dfdcada3SDoug Rabson 344dfdcada3SDoug Rabson case RPC_AUTHERROR: 345dfdcada3SDoug Rabson error->re_why = msg->rjcted_rply.rj_why; 346dfdcada3SDoug Rabson break; 347dfdcada3SDoug Rabson 348dfdcada3SDoug Rabson case RPC_PROGVERSMISMATCH: 349dfdcada3SDoug Rabson error->re_vers.low = msg->acpted_rply.ar_vers.low; 350dfdcada3SDoug Rabson error->re_vers.high = msg->acpted_rply.ar_vers.high; 351dfdcada3SDoug Rabson break; 352dfdcada3SDoug Rabson 353dfdcada3SDoug Rabson case RPC_FAILED: 354dfdcada3SDoug Rabson case RPC_SUCCESS: 355dfdcada3SDoug Rabson case RPC_PROGNOTREGISTERED: 356dfdcada3SDoug Rabson case RPC_PMAPFAILURE: 357dfdcada3SDoug Rabson case RPC_UNKNOWNPROTO: 358dfdcada3SDoug Rabson case RPC_UNKNOWNHOST: 359dfdcada3SDoug Rabson case RPC_SYSTEMERROR: 360dfdcada3SDoug Rabson case RPC_CANTDECODEARGS: 361dfdcada3SDoug Rabson case RPC_PROCUNAVAIL: 362dfdcada3SDoug Rabson case RPC_PROGUNAVAIL: 363dfdcada3SDoug Rabson case RPC_TIMEDOUT: 364dfdcada3SDoug Rabson case RPC_CANTRECV: 365dfdcada3SDoug Rabson case RPC_CANTSEND: 366dfdcada3SDoug Rabson case RPC_CANTDECODERES: 367dfdcada3SDoug Rabson case RPC_CANTENCODEARGS: 368dfdcada3SDoug Rabson default: 369dfdcada3SDoug Rabson break; 370dfdcada3SDoug Rabson } 371a9148abdSDoug Rabson 372a9148abdSDoug Rabson return (stat); 373dfdcada3SDoug Rabson } 374