Annotation of 43BSD/contrib/sunrpc/clnt_raw.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[] = "@(#)clnt_raw.c 1.4 85/03/17 Copyr 1984 Sun Micro";
                     31: #endif
                     32: 
                     33: /*
                     34:  * clnt_raw.c
                     35:  *
                     36:  * Copyright (C) 1984, Sun Microsystems, Inc.
                     37:  *
                     38:  * Memory based rpc for simple testing and timing.
                     39:  * Interface to create an rpc client and server in the same process.
                     40:  * This lets us similate rpc and get round trip overhead, without
                     41:  * any interference from the kernal.
                     42:  */
                     43: 
                     44: #include "types.h"
                     45: #include <sys/time.h>
                     46: #include <netinet/in.h>
                     47: #include "xdr.h"
                     48: #include "auth.h"
                     49: #include "clnt.h"
                     50: #include "rpc_msg.h"
                     51: 
                     52: #define NULL ((caddr_t)0)
                     53: #define MCALL_MSG_SIZE 24
                     54: 
                     55: /*
                     56:  * This is the "network" we will be moving stuff over.
                     57:  */
                     58: char _raw_buf[UDPMSGSIZE];
                     59: 
                     60: static char    mashl_callmsg[MCALL_MSG_SIZE];
                     61: static u_int   mcnt;
                     62: 
                     63: static enum clnt_stat  clntraw_call();
                     64: static void            clntraw_abort();
                     65: static void            clntraw_geterr();
                     66: static bool_t          clntraw_freeres();
                     67: static void            clntraw_destroy();
                     68: 
                     69: static struct clnt_ops client_ops = {
                     70:        clntraw_call,
                     71:        clntraw_abort,
                     72:        clntraw_geterr,
                     73:        clntraw_freeres,
                     74:        clntraw_destroy
                     75: };
                     76: 
                     77: static CLIENT  client_object;
                     78: static CLIENT  *client = &client_object;
                     79: static XDR     xdr_stream;
                     80: 
                     81: void   svc_getreq();
                     82: 
                     83: /*
                     84:  * Create a client handle for memory based rpc.
                     85:  */
                     86: CLIENT *
                     87: clntraw_create(prog, vers)
                     88:        u_long prog;
                     89:        u_long vers;
                     90: {
                     91:        struct rpc_msg call_msg;
                     92:        XDR *xdrs = &xdr_stream;
                     93: 
                     94:        /*
                     95:         * pre-serialize the staic part of the call msg and stash it away
                     96:         */
                     97:        call_msg.rm_direction = CALL;
                     98:        call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION;
                     99:        call_msg.rm_call.cb_prog = prog;
                    100:        call_msg.rm_call.cb_vers = vers;
                    101:        xdrmem_create(xdrs, mashl_callmsg, MCALL_MSG_SIZE, XDR_ENCODE); 
                    102:        if (! xdr_callhdr(xdrs, &call_msg)) {
                    103:                perror("clnt_raw.c - Fatal header serialization error.");
                    104:        }
                    105:        mcnt = XDR_GETPOS(xdrs);
                    106:        XDR_DESTROY(xdrs);
                    107: 
                    108:        /*
                    109:         * Set xdrmem for client/server shared buffer
                    110:         */
                    111:        xdrmem_create(xdrs, _raw_buf, UDPMSGSIZE, XDR_FREE);
                    112: 
                    113:        /*
                    114:         * create client handle
                    115:         */
                    116:        client->cl_ops = &client_ops;
                    117:        client->cl_auth = authnone_create();
                    118:        return (client);
                    119: }
                    120: 
                    121: static enum clnt_stat 
                    122: clntraw_call(h, proc, xargs, argsp, xresults, resultsp, timeout)
                    123:        CLIENT *h;
                    124:        u_long proc;
                    125:        xdrproc_t xargs;
                    126:        caddr_t argsp;
                    127:        xdrproc_t xresults;
                    128:        caddr_t resultsp;
                    129:        struct timeval timeout;
                    130: {
                    131:        register XDR *xdrs = &xdr_stream;
                    132:        struct rpc_msg msg;
                    133:        enum clnt_stat status;
                    134:        struct rpc_err error;
                    135: 
                    136: call_again:
                    137:        /*
                    138:         * send request
                    139:         */
                    140:        xdrs->x_op = XDR_ENCODE;
                    141:        XDR_SETPOS(xdrs, 0);
                    142:        ((struct rpc_msg *)mashl_callmsg)->rm_xid ++ ;
                    143:        if ((! XDR_PUTBYTES(xdrs, mashl_callmsg, mcnt)) ||
                    144:            (! XDR_PUTLONG(xdrs, (long *)&proc)) ||
                    145:            (! AUTH_MARSHALL(h->cl_auth, xdrs)) ||
                    146:            (! (*xargs)(xdrs, argsp))) {
                    147:                return (RPC_CANTENCODEARGS);
                    148:        }
                    149:        (void)XDR_GETPOS(xdrs);  /* called just to cause overhead */
                    150: 
                    151:        /*
                    152:         * We have to call server input routine here because this is
                    153:         * all going on in one process. Yuk.
                    154:         */
                    155:        svc_getreq(1);
                    156: 
                    157:        /*
                    158:         * get results
                    159:         */
                    160:        xdrs->x_op = XDR_DECODE;
                    161:        XDR_SETPOS(xdrs, 0);
                    162:        msg.acpted_rply.ar_verf = _null_auth;
                    163:        msg.acpted_rply.ar_results.where = resultsp;
                    164:        msg.acpted_rply.ar_results.proc = xresults;
                    165:        if (! xdr_replymsg(xdrs, &msg))
                    166:                return (RPC_CANTDECODERES);
                    167:        _seterr_reply(&msg, &error);
                    168:        status = error.re_status;
                    169: 
                    170:        if (status == RPC_SUCCESS) {
                    171:                if (! AUTH_VALIDATE(h->cl_auth, &msg.acpted_rply.ar_verf)) {
                    172:                        status = RPC_AUTHERROR;
                    173:                }
                    174:        }  /* end successful completion */
                    175:        else {
                    176:                if (AUTH_REFRESH(h->cl_auth))
                    177:                        goto call_again;
                    178:        }  /* end of unsuccessful completion */
                    179: 
                    180:        if (status == RPC_SUCCESS) {
                    181:                if (! AUTH_VALIDATE(h->cl_auth, &msg.acpted_rply.ar_verf)) {
                    182:                        status = RPC_AUTHERROR;
                    183:                }
                    184:                if (msg.acpted_rply.ar_verf.oa_base != NULL) {
                    185:                        xdrs->x_op = XDR_FREE;
                    186:                        (void)xdr_opaque_auth(xdrs, &(msg.acpted_rply.ar_verf));
                    187:                }
                    188:        }
                    189: 
                    190:        return (status);
                    191: }
                    192: 
                    193: static void
                    194: clntraw_geterr()
                    195: {
                    196: }
                    197: 
                    198: 
                    199: static bool_t
                    200: clntraw_freeres(cl, xdr_res, res_ptr)
                    201:        CLIENT *cl;
                    202:        xdrproc_t xdr_res;
                    203:        caddr_t res_ptr;
                    204: {
                    205:        register XDR *xdrs = &xdr_stream;
                    206: 
                    207:        xdrs->x_op = XDR_FREE;
                    208:        return ((*xdr_res)(xdrs, res_ptr));
                    209: }
                    210: 
                    211: static void
                    212: clntraw_abort()
                    213: {
                    214: }
                    215: 
                    216: static void
                    217: clntraw_destroy()
                    218: {
                    219: }

unix.superglobalmegacorp.com

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