xref: /freebsd/lib/libc/rpc/clnt_raw.c (revision 5f0d67bea7254a25f69230a2dfddaf36b7184337)
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";*/
335f0d67beSAdam David static char *rcsid = "$Id: clnt_raw.c,v 1.3 1995/10/22 14:51:16 phk 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>
484c3af266SPoul-Henning Kamp #include <stdlib.h>
4999064799SGarrett Wollman 
5099064799SGarrett Wollman #define MCALL_MSG_SIZE 24
5199064799SGarrett Wollman 
5299064799SGarrett Wollman /*
5399064799SGarrett Wollman  * This is the "network" we will be moving stuff over.
5499064799SGarrett Wollman  */
5599064799SGarrett Wollman static struct clntraw_private {
5699064799SGarrett Wollman 	CLIENT	client_object;
5799064799SGarrett Wollman 	XDR	xdr_stream;
5899064799SGarrett Wollman 	char	_raw_buf[UDPMSGSIZE];
5999064799SGarrett Wollman 	char	mashl_callmsg[MCALL_MSG_SIZE];
6099064799SGarrett Wollman 	u_int	mcnt;
6199064799SGarrett Wollman } *clntraw_private;
6299064799SGarrett Wollman 
6399064799SGarrett Wollman static enum clnt_stat	clntraw_call();
6499064799SGarrett Wollman static void		clntraw_abort();
6599064799SGarrett Wollman static void		clntraw_geterr();
6699064799SGarrett Wollman static bool_t		clntraw_freeres();
6799064799SGarrett Wollman static bool_t		clntraw_control();
6899064799SGarrett Wollman static void		clntraw_destroy();
6999064799SGarrett Wollman 
7099064799SGarrett Wollman static struct clnt_ops client_ops = {
7199064799SGarrett Wollman 	clntraw_call,
7299064799SGarrett Wollman 	clntraw_abort,
7399064799SGarrett Wollman 	clntraw_geterr,
7499064799SGarrett Wollman 	clntraw_freeres,
7599064799SGarrett Wollman 	clntraw_destroy,
7699064799SGarrett Wollman 	clntraw_control
7799064799SGarrett Wollman };
7899064799SGarrett Wollman 
7999064799SGarrett Wollman void	svc_getreq();
8099064799SGarrett Wollman 
8199064799SGarrett Wollman /*
8299064799SGarrett Wollman  * Create a client handle for memory based rpc.
8399064799SGarrett Wollman  */
8499064799SGarrett Wollman CLIENT *
8599064799SGarrett Wollman clntraw_create(prog, vers)
8699064799SGarrett Wollman 	u_long prog;
8799064799SGarrett Wollman 	u_long vers;
8899064799SGarrett Wollman {
8999064799SGarrett Wollman 	register struct clntraw_private *clp = clntraw_private;
9099064799SGarrett Wollman 	struct rpc_msg call_msg;
9199064799SGarrett Wollman 	XDR *xdrs = &clp->xdr_stream;
9299064799SGarrett Wollman 	CLIENT	*client = &clp->client_object;
9399064799SGarrett Wollman 
9499064799SGarrett Wollman 	if (clp == 0) {
9599064799SGarrett Wollman 		clp = (struct clntraw_private *)calloc(1, sizeof (*clp));
9699064799SGarrett Wollman 		if (clp == 0)
9799064799SGarrett Wollman 			return (0);
9899064799SGarrett Wollman 		clntraw_private = clp;
9999064799SGarrett Wollman 	}
10099064799SGarrett Wollman 	/*
1015f0d67beSAdam David 	 * pre-serialize the static part of the call msg and stash it away
10299064799SGarrett Wollman 	 */
10399064799SGarrett Wollman 	call_msg.rm_direction = CALL;
10499064799SGarrett Wollman 	call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION;
10599064799SGarrett Wollman 	call_msg.rm_call.cb_prog = prog;
10699064799SGarrett Wollman 	call_msg.rm_call.cb_vers = vers;
10799064799SGarrett Wollman 	xdrmem_create(xdrs, clp->mashl_callmsg, MCALL_MSG_SIZE, XDR_ENCODE);
10899064799SGarrett Wollman 	if (! xdr_callhdr(xdrs, &call_msg)) {
10999064799SGarrett Wollman 		perror("clnt_raw.c - Fatal header serialization error.");
11099064799SGarrett Wollman 	}
11199064799SGarrett Wollman 	clp->mcnt = XDR_GETPOS(xdrs);
11299064799SGarrett Wollman 	XDR_DESTROY(xdrs);
11399064799SGarrett Wollman 
11499064799SGarrett Wollman 	/*
11599064799SGarrett Wollman 	 * Set xdrmem for client/server shared buffer
11699064799SGarrett Wollman 	 */
11799064799SGarrett Wollman 	xdrmem_create(xdrs, clp->_raw_buf, UDPMSGSIZE, XDR_FREE);
11899064799SGarrett Wollman 
11999064799SGarrett Wollman 	/*
12099064799SGarrett Wollman 	 * create client handle
12199064799SGarrett Wollman 	 */
12299064799SGarrett Wollman 	client->cl_ops = &client_ops;
12399064799SGarrett Wollman 	client->cl_auth = authnone_create();
12499064799SGarrett Wollman 	return (client);
12599064799SGarrett Wollman }
12699064799SGarrett Wollman 
12799064799SGarrett Wollman static enum clnt_stat
12899064799SGarrett Wollman clntraw_call(h, proc, xargs, argsp, xresults, resultsp, timeout)
12999064799SGarrett Wollman 	CLIENT *h;
13099064799SGarrett Wollman 	u_long proc;
13199064799SGarrett Wollman 	xdrproc_t xargs;
13299064799SGarrett Wollman 	caddr_t argsp;
13399064799SGarrett Wollman 	xdrproc_t xresults;
13499064799SGarrett Wollman 	caddr_t resultsp;
13599064799SGarrett Wollman 	struct timeval timeout;
13699064799SGarrett Wollman {
13799064799SGarrett Wollman 	register struct clntraw_private *clp = clntraw_private;
13899064799SGarrett Wollman 	register XDR *xdrs = &clp->xdr_stream;
13999064799SGarrett Wollman 	struct rpc_msg msg;
14099064799SGarrett Wollman 	enum clnt_stat status;
14199064799SGarrett Wollman 	struct rpc_err error;
14299064799SGarrett Wollman 
14399064799SGarrett Wollman 	if (clp == 0)
14499064799SGarrett Wollman 		return (RPC_FAILED);
14599064799SGarrett Wollman call_again:
14699064799SGarrett Wollman 	/*
14799064799SGarrett Wollman 	 * send request
14899064799SGarrett Wollman 	 */
14999064799SGarrett Wollman 	xdrs->x_op = XDR_ENCODE;
15099064799SGarrett Wollman 	XDR_SETPOS(xdrs, 0);
15199064799SGarrett Wollman 	((struct rpc_msg *)clp->mashl_callmsg)->rm_xid ++ ;
15299064799SGarrett Wollman 	if ((! XDR_PUTBYTES(xdrs, clp->mashl_callmsg, clp->mcnt)) ||
15399064799SGarrett Wollman 	    (! XDR_PUTLONG(xdrs, (long *)&proc)) ||
15499064799SGarrett Wollman 	    (! AUTH_MARSHALL(h->cl_auth, xdrs)) ||
15599064799SGarrett Wollman 	    (! (*xargs)(xdrs, argsp))) {
15699064799SGarrett Wollman 		return (RPC_CANTENCODEARGS);
15799064799SGarrett Wollman 	}
15899064799SGarrett Wollman 	(void)XDR_GETPOS(xdrs);  /* called just to cause overhead */
15999064799SGarrett Wollman 
16099064799SGarrett Wollman 	/*
16199064799SGarrett Wollman 	 * We have to call server input routine here because this is
16299064799SGarrett Wollman 	 * all going on in one process. Yuk.
16399064799SGarrett Wollman 	 */
16499064799SGarrett Wollman 	svc_getreq(1);
16599064799SGarrett Wollman 
16699064799SGarrett Wollman 	/*
16799064799SGarrett Wollman 	 * get results
16899064799SGarrett Wollman 	 */
16999064799SGarrett Wollman 	xdrs->x_op = XDR_DECODE;
17099064799SGarrett Wollman 	XDR_SETPOS(xdrs, 0);
17199064799SGarrett Wollman 	msg.acpted_rply.ar_verf = _null_auth;
17299064799SGarrett Wollman 	msg.acpted_rply.ar_results.where = resultsp;
17399064799SGarrett Wollman 	msg.acpted_rply.ar_results.proc = xresults;
17499064799SGarrett Wollman 	if (! xdr_replymsg(xdrs, &msg))
17599064799SGarrett Wollman 		return (RPC_CANTDECODERES);
17699064799SGarrett Wollman 	_seterr_reply(&msg, &error);
17799064799SGarrett Wollman 	status = error.re_status;
17899064799SGarrett Wollman 
17999064799SGarrett Wollman 	if (status == RPC_SUCCESS) {
18099064799SGarrett Wollman 		if (! AUTH_VALIDATE(h->cl_auth, &msg.acpted_rply.ar_verf)) {
18199064799SGarrett Wollman 			status = RPC_AUTHERROR;
18299064799SGarrett Wollman 		}
18399064799SGarrett Wollman 	}  /* end successful completion */
18499064799SGarrett Wollman 	else {
18599064799SGarrett Wollman 		if (AUTH_REFRESH(h->cl_auth))
18699064799SGarrett Wollman 			goto call_again;
18799064799SGarrett Wollman 	}  /* end of unsuccessful completion */
18899064799SGarrett Wollman 
18999064799SGarrett Wollman 	if (status == RPC_SUCCESS) {
19099064799SGarrett Wollman 		if (! AUTH_VALIDATE(h->cl_auth, &msg.acpted_rply.ar_verf)) {
19199064799SGarrett Wollman 			status = RPC_AUTHERROR;
19299064799SGarrett Wollman 		}
19399064799SGarrett Wollman 		if (msg.acpted_rply.ar_verf.oa_base != NULL) {
19499064799SGarrett Wollman 			xdrs->x_op = XDR_FREE;
19599064799SGarrett Wollman 			(void)xdr_opaque_auth(xdrs, &(msg.acpted_rply.ar_verf));
19699064799SGarrett Wollman 		}
19799064799SGarrett Wollman 	}
19899064799SGarrett Wollman 
19999064799SGarrett Wollman 	return (status);
20099064799SGarrett Wollman }
20199064799SGarrett Wollman 
20299064799SGarrett Wollman static void
20399064799SGarrett Wollman clntraw_geterr()
20499064799SGarrett Wollman {
20599064799SGarrett Wollman }
20699064799SGarrett Wollman 
20799064799SGarrett Wollman 
20899064799SGarrett Wollman static bool_t
20999064799SGarrett Wollman clntraw_freeres(cl, xdr_res, res_ptr)
21099064799SGarrett Wollman 	CLIENT *cl;
21199064799SGarrett Wollman 	xdrproc_t xdr_res;
21299064799SGarrett Wollman 	caddr_t res_ptr;
21399064799SGarrett Wollman {
21499064799SGarrett Wollman 	register struct clntraw_private *clp = clntraw_private;
21599064799SGarrett Wollman 	register XDR *xdrs = &clp->xdr_stream;
21699064799SGarrett Wollman 	bool_t rval;
21799064799SGarrett Wollman 
21899064799SGarrett Wollman 	if (clp == 0)
21999064799SGarrett Wollman 	{
22099064799SGarrett Wollman 		rval = (bool_t) RPC_FAILED;
22199064799SGarrett Wollman 		return (rval);
22299064799SGarrett Wollman 	}
22399064799SGarrett Wollman 	xdrs->x_op = XDR_FREE;
22499064799SGarrett Wollman 	return ((*xdr_res)(xdrs, res_ptr));
22599064799SGarrett Wollman }
22699064799SGarrett Wollman 
22799064799SGarrett Wollman static void
22899064799SGarrett Wollman clntraw_abort()
22999064799SGarrett Wollman {
23099064799SGarrett Wollman }
23199064799SGarrett Wollman 
23299064799SGarrett Wollman static bool_t
23399064799SGarrett Wollman clntraw_control()
23499064799SGarrett Wollman {
23599064799SGarrett Wollman 	return (FALSE);
23699064799SGarrett Wollman }
23799064799SGarrett Wollman 
23899064799SGarrett Wollman static void
23999064799SGarrett Wollman clntraw_destroy()
24099064799SGarrett Wollman {
24199064799SGarrett Wollman }
242