xref: /freebsd/lib/libc/rpc/clnt_raw.c (revision 990647991e51c0f93ad5d9985587a60f322f543a)
199064799SGarrett Wollman /*
299064799SGarrett Wollman  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
399064799SGarrett Wollman  * unrestricted use provided that this legend is included on all tape
499064799SGarrett Wollman  * media and as a part of the software program in whole or part.  Users
599064799SGarrett Wollman  * may copy or modify Sun RPC without charge, but are not authorized
699064799SGarrett Wollman  * to license or distribute it to anyone else except as part of a product or
799064799SGarrett Wollman  * program developed by the user.
899064799SGarrett Wollman  *
999064799SGarrett Wollman  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
1099064799SGarrett Wollman  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
1199064799SGarrett Wollman  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
1299064799SGarrett Wollman  *
1399064799SGarrett Wollman  * Sun RPC is provided with no support and without any obligation on the
1499064799SGarrett Wollman  * part of Sun Microsystems, Inc. to assist in its use, correction,
1599064799SGarrett Wollman  * modification or enhancement.
1699064799SGarrett Wollman  *
1799064799SGarrett Wollman  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
1899064799SGarrett Wollman  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
1999064799SGarrett Wollman  * OR ANY PART THEREOF.
2099064799SGarrett Wollman  *
2199064799SGarrett Wollman  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
2299064799SGarrett Wollman  * or profits or other special, indirect and consequential damages, even if
2399064799SGarrett Wollman  * Sun has been advised of the possibility of such damages.
2499064799SGarrett Wollman  *
2599064799SGarrett Wollman  * Sun Microsystems, Inc.
2699064799SGarrett Wollman  * 2550 Garcia Avenue
2799064799SGarrett Wollman  * Mountain View, California  94043
2899064799SGarrett Wollman  */
2999064799SGarrett Wollman 
3099064799SGarrett Wollman #if defined(LIBC_SCCS) && !defined(lint)
3199064799SGarrett Wollman /*static char *sccsid = "from: @(#)clnt_raw.c 1.22 87/08/11 Copyr 1984 Sun Micro";*/
3299064799SGarrett Wollman /*static char *sccsid = "from: @(#)clnt_raw.c	2.2 88/08/01 4.0 RPCSRC";*/
3399064799SGarrett Wollman static char *rcsid = "$Id: clnt_raw.c,v 1.1 1993/10/27 05:40:22 paul Exp $";
3499064799SGarrett Wollman #endif
3599064799SGarrett Wollman 
3699064799SGarrett Wollman /*
3799064799SGarrett Wollman  * clnt_raw.c
3899064799SGarrett Wollman  *
3999064799SGarrett Wollman  * Copyright (C) 1984, Sun Microsystems, Inc.
4099064799SGarrett Wollman  *
4199064799SGarrett Wollman  * Memory based rpc for simple testing and timing.
4299064799SGarrett Wollman  * Interface to create an rpc client and server in the same process.
4399064799SGarrett Wollman  * This lets us similate rpc and get round trip overhead, without
4499064799SGarrett Wollman  * any interference from the kernal.
4599064799SGarrett Wollman  */
4699064799SGarrett Wollman 
4799064799SGarrett Wollman #include <rpc/rpc.h>
4899064799SGarrett Wollman 
4999064799SGarrett Wollman #define MCALL_MSG_SIZE 24
5099064799SGarrett Wollman 
5199064799SGarrett Wollman /*
5299064799SGarrett Wollman  * This is the "network" we will be moving stuff over.
5399064799SGarrett Wollman  */
5499064799SGarrett Wollman static struct clntraw_private {
5599064799SGarrett Wollman 	CLIENT	client_object;
5699064799SGarrett Wollman 	XDR	xdr_stream;
5799064799SGarrett Wollman 	char	_raw_buf[UDPMSGSIZE];
5899064799SGarrett Wollman 	char	mashl_callmsg[MCALL_MSG_SIZE];
5999064799SGarrett Wollman 	u_int	mcnt;
6099064799SGarrett Wollman } *clntraw_private;
6199064799SGarrett Wollman 
6299064799SGarrett Wollman static enum clnt_stat	clntraw_call();
6399064799SGarrett Wollman static void		clntraw_abort();
6499064799SGarrett Wollman static void		clntraw_geterr();
6599064799SGarrett Wollman static bool_t		clntraw_freeres();
6699064799SGarrett Wollman static bool_t		clntraw_control();
6799064799SGarrett Wollman static void		clntraw_destroy();
6899064799SGarrett Wollman 
6999064799SGarrett Wollman static struct clnt_ops client_ops = {
7099064799SGarrett Wollman 	clntraw_call,
7199064799SGarrett Wollman 	clntraw_abort,
7299064799SGarrett Wollman 	clntraw_geterr,
7399064799SGarrett Wollman 	clntraw_freeres,
7499064799SGarrett Wollman 	clntraw_destroy,
7599064799SGarrett Wollman 	clntraw_control
7699064799SGarrett Wollman };
7799064799SGarrett Wollman 
7899064799SGarrett Wollman void	svc_getreq();
7999064799SGarrett Wollman 
8099064799SGarrett Wollman /*
8199064799SGarrett Wollman  * Create a client handle for memory based rpc.
8299064799SGarrett Wollman  */
8399064799SGarrett Wollman CLIENT *
8499064799SGarrett Wollman clntraw_create(prog, vers)
8599064799SGarrett Wollman 	u_long prog;
8699064799SGarrett Wollman 	u_long vers;
8799064799SGarrett Wollman {
8899064799SGarrett Wollman 	register struct clntraw_private *clp = clntraw_private;
8999064799SGarrett Wollman 	struct rpc_msg call_msg;
9099064799SGarrett Wollman 	XDR *xdrs = &clp->xdr_stream;
9199064799SGarrett Wollman 	CLIENT	*client = &clp->client_object;
9299064799SGarrett Wollman 
9399064799SGarrett Wollman 	if (clp == 0) {
9499064799SGarrett Wollman 		clp = (struct clntraw_private *)calloc(1, sizeof (*clp));
9599064799SGarrett Wollman 		if (clp == 0)
9699064799SGarrett Wollman 			return (0);
9799064799SGarrett Wollman 		clntraw_private = clp;
9899064799SGarrett Wollman 	}
9999064799SGarrett Wollman 	/*
10099064799SGarrett Wollman 	 * pre-serialize the staic part of the call msg and stash it away
10199064799SGarrett Wollman 	 */
10299064799SGarrett Wollman 	call_msg.rm_direction = CALL;
10399064799SGarrett Wollman 	call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION;
10499064799SGarrett Wollman 	call_msg.rm_call.cb_prog = prog;
10599064799SGarrett Wollman 	call_msg.rm_call.cb_vers = vers;
10699064799SGarrett Wollman 	xdrmem_create(xdrs, clp->mashl_callmsg, MCALL_MSG_SIZE, XDR_ENCODE);
10799064799SGarrett Wollman 	if (! xdr_callhdr(xdrs, &call_msg)) {
10899064799SGarrett Wollman 		perror("clnt_raw.c - Fatal header serialization error.");
10999064799SGarrett Wollman 	}
11099064799SGarrett Wollman 	clp->mcnt = XDR_GETPOS(xdrs);
11199064799SGarrett Wollman 	XDR_DESTROY(xdrs);
11299064799SGarrett Wollman 
11399064799SGarrett Wollman 	/*
11499064799SGarrett Wollman 	 * Set xdrmem for client/server shared buffer
11599064799SGarrett Wollman 	 */
11699064799SGarrett Wollman 	xdrmem_create(xdrs, clp->_raw_buf, UDPMSGSIZE, XDR_FREE);
11799064799SGarrett Wollman 
11899064799SGarrett Wollman 	/*
11999064799SGarrett Wollman 	 * create client handle
12099064799SGarrett Wollman 	 */
12199064799SGarrett Wollman 	client->cl_ops = &client_ops;
12299064799SGarrett Wollman 	client->cl_auth = authnone_create();
12399064799SGarrett Wollman 	return (client);
12499064799SGarrett Wollman }
12599064799SGarrett Wollman 
12699064799SGarrett Wollman static enum clnt_stat
12799064799SGarrett Wollman clntraw_call(h, proc, xargs, argsp, xresults, resultsp, timeout)
12899064799SGarrett Wollman 	CLIENT *h;
12999064799SGarrett Wollman 	u_long proc;
13099064799SGarrett Wollman 	xdrproc_t xargs;
13199064799SGarrett Wollman 	caddr_t argsp;
13299064799SGarrett Wollman 	xdrproc_t xresults;
13399064799SGarrett Wollman 	caddr_t resultsp;
13499064799SGarrett Wollman 	struct timeval timeout;
13599064799SGarrett Wollman {
13699064799SGarrett Wollman 	register struct clntraw_private *clp = clntraw_private;
13799064799SGarrett Wollman 	register XDR *xdrs = &clp->xdr_stream;
13899064799SGarrett Wollman 	struct rpc_msg msg;
13999064799SGarrett Wollman 	enum clnt_stat status;
14099064799SGarrett Wollman 	struct rpc_err error;
14199064799SGarrett Wollman 
14299064799SGarrett Wollman 	if (clp == 0)
14399064799SGarrett Wollman 		return (RPC_FAILED);
14499064799SGarrett Wollman call_again:
14599064799SGarrett Wollman 	/*
14699064799SGarrett Wollman 	 * send request
14799064799SGarrett Wollman 	 */
14899064799SGarrett Wollman 	xdrs->x_op = XDR_ENCODE;
14999064799SGarrett Wollman 	XDR_SETPOS(xdrs, 0);
15099064799SGarrett Wollman 	((struct rpc_msg *)clp->mashl_callmsg)->rm_xid ++ ;
15199064799SGarrett Wollman 	if ((! XDR_PUTBYTES(xdrs, clp->mashl_callmsg, clp->mcnt)) ||
15299064799SGarrett Wollman 	    (! XDR_PUTLONG(xdrs, (long *)&proc)) ||
15399064799SGarrett Wollman 	    (! AUTH_MARSHALL(h->cl_auth, xdrs)) ||
15499064799SGarrett Wollman 	    (! (*xargs)(xdrs, argsp))) {
15599064799SGarrett Wollman 		return (RPC_CANTENCODEARGS);
15699064799SGarrett Wollman 	}
15799064799SGarrett Wollman 	(void)XDR_GETPOS(xdrs);  /* called just to cause overhead */
15899064799SGarrett Wollman 
15999064799SGarrett Wollman 	/*
16099064799SGarrett Wollman 	 * We have to call server input routine here because this is
16199064799SGarrett Wollman 	 * all going on in one process. Yuk.
16299064799SGarrett Wollman 	 */
16399064799SGarrett Wollman 	svc_getreq(1);
16499064799SGarrett Wollman 
16599064799SGarrett Wollman 	/*
16699064799SGarrett Wollman 	 * get results
16799064799SGarrett Wollman 	 */
16899064799SGarrett Wollman 	xdrs->x_op = XDR_DECODE;
16999064799SGarrett Wollman 	XDR_SETPOS(xdrs, 0);
17099064799SGarrett Wollman 	msg.acpted_rply.ar_verf = _null_auth;
17199064799SGarrett Wollman 	msg.acpted_rply.ar_results.where = resultsp;
17299064799SGarrett Wollman 	msg.acpted_rply.ar_results.proc = xresults;
17399064799SGarrett Wollman 	if (! xdr_replymsg(xdrs, &msg))
17499064799SGarrett Wollman 		return (RPC_CANTDECODERES);
17599064799SGarrett Wollman 	_seterr_reply(&msg, &error);
17699064799SGarrett Wollman 	status = error.re_status;
17799064799SGarrett Wollman 
17899064799SGarrett Wollman 	if (status == RPC_SUCCESS) {
17999064799SGarrett Wollman 		if (! AUTH_VALIDATE(h->cl_auth, &msg.acpted_rply.ar_verf)) {
18099064799SGarrett Wollman 			status = RPC_AUTHERROR;
18199064799SGarrett Wollman 		}
18299064799SGarrett Wollman 	}  /* end successful completion */
18399064799SGarrett Wollman 	else {
18499064799SGarrett Wollman 		if (AUTH_REFRESH(h->cl_auth))
18599064799SGarrett Wollman 			goto call_again;
18699064799SGarrett Wollman 	}  /* end of unsuccessful completion */
18799064799SGarrett Wollman 
18899064799SGarrett Wollman 	if (status == RPC_SUCCESS) {
18999064799SGarrett Wollman 		if (! AUTH_VALIDATE(h->cl_auth, &msg.acpted_rply.ar_verf)) {
19099064799SGarrett Wollman 			status = RPC_AUTHERROR;
19199064799SGarrett Wollman 		}
19299064799SGarrett Wollman 		if (msg.acpted_rply.ar_verf.oa_base != NULL) {
19399064799SGarrett Wollman 			xdrs->x_op = XDR_FREE;
19499064799SGarrett Wollman 			(void)xdr_opaque_auth(xdrs, &(msg.acpted_rply.ar_verf));
19599064799SGarrett Wollman 		}
19699064799SGarrett Wollman 	}
19799064799SGarrett Wollman 
19899064799SGarrett Wollman 	return (status);
19999064799SGarrett Wollman }
20099064799SGarrett Wollman 
20199064799SGarrett Wollman static void
20299064799SGarrett Wollman clntraw_geterr()
20399064799SGarrett Wollman {
20499064799SGarrett Wollman }
20599064799SGarrett Wollman 
20699064799SGarrett Wollman 
20799064799SGarrett Wollman static bool_t
20899064799SGarrett Wollman clntraw_freeres(cl, xdr_res, res_ptr)
20999064799SGarrett Wollman 	CLIENT *cl;
21099064799SGarrett Wollman 	xdrproc_t xdr_res;
21199064799SGarrett Wollman 	caddr_t res_ptr;
21299064799SGarrett Wollman {
21399064799SGarrett Wollman 	register struct clntraw_private *clp = clntraw_private;
21499064799SGarrett Wollman 	register XDR *xdrs = &clp->xdr_stream;
21599064799SGarrett Wollman 	bool_t rval;
21699064799SGarrett Wollman 
21799064799SGarrett Wollman 	if (clp == 0)
21899064799SGarrett Wollman 	{
21999064799SGarrett Wollman 		rval = (bool_t) RPC_FAILED;
22099064799SGarrett Wollman 		return (rval);
22199064799SGarrett Wollman 	}
22299064799SGarrett Wollman 	xdrs->x_op = XDR_FREE;
22399064799SGarrett Wollman 	return ((*xdr_res)(xdrs, res_ptr));
22499064799SGarrett Wollman }
22599064799SGarrett Wollman 
22699064799SGarrett Wollman static void
22799064799SGarrett Wollman clntraw_abort()
22899064799SGarrett Wollman {
22999064799SGarrett Wollman }
23099064799SGarrett Wollman 
23199064799SGarrett Wollman static bool_t
23299064799SGarrett Wollman clntraw_control()
23399064799SGarrett Wollman {
23499064799SGarrett Wollman 	return (FALSE);
23599064799SGarrett Wollman }
23699064799SGarrett Wollman 
23799064799SGarrett Wollman static void
23899064799SGarrett Wollman clntraw_destroy()
23999064799SGarrett Wollman {
24099064799SGarrett Wollman }
241