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