Annotation of 43BSDReno/lib/librpc/rpc_prot.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.