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