1/*	$NetBSD: svc.h,v 1.23 2005/12/26 19:01:47 perry Exp $	*/
2
3/*
4 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
5 * unrestricted use provided that this legend is included on all tape
6 * media and as a part of the software program in whole or part.  Users
7 * may copy or modify Sun RPC without charge, but are not authorized
8 * to license or distribute it to anyone else except as part of a product or
9 * program developed by the user.
10 *
11 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
12 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
13 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
14 *
15 * Sun RPC is provided with no support and without any obligation on the
16 * part of Sun Microsystems, Inc. to assist in its use, correction,
17 * modification or enhancement.
18 *
19 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
20 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
21 * OR ANY PART THEREOF.
22 *
23 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
24 * or profits or other special, indirect and consequential damages, even if
25 * Sun has been advised of the possibility of such damages.
26 *
27 * Sun Microsystems, Inc.
28 * 2550 Garcia Avenue
29 * Mountain View, California  94043
30 *
31 *	from: @(#)svc.h 1.35 88/12/17 SMI
32 *	@(#)svc.h      1.27    94/04/25 SMI
33 */
34
35/*
36 * svc.h, Server-side remote procedure call interface.
37 *
38 * Copyright (C) 1986-1993 by Sun Microsystems, Inc.
39 */
40
41#ifndef _RPC_SVC_H_
42#define _RPC_SVC_H_
43#include <sys/cdefs.h>
44
45#include <rpc/rpc_com.h>
46
47/*
48 * This interface must manage two items concerning remote procedure calling:
49 *
50 * 1) An arbitrary number of transport connections upon which rpc requests
51 * are received.  The two most notable transports are TCP and UDP;  they are
52 * created and registered by routines in svc_tcp.c and svc_udp.c, respectively;
53 * they in turn call xprt_register and xprt_unregister.
54 *
55 * 2) An arbitrary number of locally registered services.  Services are
56 * described by the following four data: program number, version number,
57 * "service dispatch" function, a transport handle, and a boolean that
58 * indicates whether or not the exported program should be registered with a
59 * local binder service;  if true the program's number and version and the
60 * port number from the transport handle are registered with the binder.
61 * These data are registered with the rpc svc system via svc_register.
62 *
63 * A service's dispatch function is called whenever an rpc request comes in
64 * on a transport.  The request's program and version numbers must match
65 * those of the registered service.  The dispatch function is passed two
66 * parameters, struct svc_req * and SVCXPRT *, defined below.
67 */
68
69/*
70 *	Service control requests
71 */
72#define SVCGET_VERSQUIET	1
73#define SVCSET_VERSQUIET	2
74#define SVCGET_CONNMAXREC	3
75#define SVCSET_CONNMAXREC	4
76
77
78enum xprt_stat {
79	XPRT_DIED,
80	XPRT_MOREREQS,
81	XPRT_IDLE
82};
83
84/*
85 * Server side transport handle
86 */
87typedef struct __rpc_svcxprt {
88	int		xp_fd;
89	u_short		xp_port;	 /* associated port number */
90	const struct xp_ops {
91		/* receive incomming requests */
92		bool_t	(*xp_recv)(struct __rpc_svcxprt *, struct rpc_msg *);
93		/* get transport status */
94		enum xprt_stat (*xp_stat)(struct __rpc_svcxprt *);
95		/* get arguments */
96		bool_t	(*xp_getargs)(struct __rpc_svcxprt *, xdrproc_t,
97			    caddr_t);
98		/* send reply */
99		bool_t	(*xp_reply)(struct __rpc_svcxprt *, struct rpc_msg *);
100		/* free mem allocated for args */
101		bool_t	(*xp_freeargs)(struct __rpc_svcxprt *, xdrproc_t,
102			    caddr_t);
103		/* destroy this struct */
104		void	(*xp_destroy)(struct __rpc_svcxprt *);
105	} *xp_ops;
106	int		xp_addrlen;	 /* length of remote address */
107	struct sockaddr_in xp_raddr;	 /* rem. addr. (backward ABI compat) */
108	/* XXX - fvdl stick this here for ABI backward compat reasons */
109	const struct xp_ops2 {
110		/* catch-all function */
111		bool_t  (*xp_control)(struct __rpc_svcxprt *, const u_int,
112					   void *);
113	} *xp_ops2;
114	char		*xp_tp;		 /* transport provider device name */
115	char		*xp_netid;	 /* network token */
116	struct netbuf	xp_ltaddr;	 /* local transport address */
117	struct netbuf	xp_rtaddr;	 /* remote transport address */
118	struct opaque_auth xp_verf;	 /* raw response verifier */
119	void		*xp_p1;		 /* private: for use by svc ops */
120	void		*xp_p2;		 /* private: for use by svc ops */
121	void		*xp_p3;		 /* private: for use by svc lib */
122	int		xp_type;	 /* transport type */
123} SVCXPRT;
124
125/*
126 * Service request
127 */
128struct svc_req {
129	uint32_t	rq_prog;	/* service program number */
130	uint32_t	rq_vers;	/* service protocol version */
131	uint32_t	rq_proc;	/* the desired procedure */
132	struct opaque_auth rq_cred;	/* raw creds from the wire */
133	void		*rq_clntcred;	/* read only cooked cred */
134	SVCXPRT		*rq_xprt;	/* associated transport */
135};
136
137/*
138 * Approved way of getting address of caller
139 */
140#define svc_getrpccaller(x) (&(x)->xp_rtaddr)
141
142/*
143 * NetBSD-only definition to get the creds of the caller (AF_LOCAL).
144 */
145#define __svc_getcallercreds(x) ((struct sockcred *)(x)->xp_p2)
146
147/*
148 * Operations defined on an SVCXPRT handle
149 *
150 * SVCXPRT		*xprt;
151 * struct rpc_msg	*msg;
152 * xdrproc_t		 xargs;
153 * caddr_t		 argsp;
154 */
155#define SVC_RECV(xprt, msg)				\
156	(*(xprt)->xp_ops->xp_recv)((xprt), (msg))
157#define svc_recv(xprt, msg)				\
158	(*(xprt)->xp_ops->xp_recv)((xprt), (msg))
159
160#define SVC_STAT(xprt)					\
161	(*(xprt)->xp_ops->xp_stat)(xprt)
162#define svc_stat(xprt)					\
163	(*(xprt)->xp_ops->xp_stat)(xprt)
164
165#define SVC_GETARGS(xprt, xargs, argsp)			\
166	(*(xprt)->xp_ops->xp_getargs)((xprt), ((xdrproc_t)(xargs)), (argsp))
167#define svc_getargs(xprt, xargs, argsp)			\
168	(*(xprt)->xp_ops->xp_getargs)((xprt), ((xdrproc_t)(xargs)), (argsp))
169
170#define SVC_REPLY(xprt, msg)				\
171	(*(xprt)->xp_ops->xp_reply) ((xprt), (msg))
172#define svc_reply(xprt, msg)				\
173	(*(xprt)->xp_ops->xp_reply) ((xprt), (msg))
174
175#define SVC_FREEARGS(xprt, xargs, argsp)		\
176	(*(xprt)->xp_ops->xp_freeargs)((xprt), ((xdrproc_t)(xargs)), (argsp))
177#define svc_freeargs(xprt, xargs, argsp)		\
178	(*(xprt)->xp_ops->xp_freeargs)((xprt), ((xdrproc_t)(xargs)), (argsp))
179
180#define SVC_DESTROY(xprt)				\
181	(*(xprt)->xp_ops->xp_destroy)(xprt)
182#define svc_destroy(xprt)				\
183	(*(xprt)->xp_ops->xp_destroy)(xprt)
184
185#define SVC_CONTROL(xprt, rq, in)			\
186	(*(xprt)->xp_ops2->xp_control)((xprt), (rq), (in))
187
188/*
189 * Service registration
190 *
191 * svc_reg(xprt, prog, vers, dispatch, nconf)
192 *	const SVCXPRT *xprt;
193 *	const rpcprog_t prog;
194 *	const rpcvers_t vers;
195 *	const void (*dispatch)(...);
196 *	const struct netconfig *nconf;
197 */
198
199__BEGIN_DECLS
200extern bool_t	svc_reg(SVCXPRT *, const rpcprog_t, const rpcvers_t,
201			void (*)(struct svc_req *, SVCXPRT *),
202			const struct netconfig *);
203__END_DECLS
204
205/*
206 * Service un-registration
207 *
208 * svc_unreg(prog, vers)
209 *	const rpcprog_t prog;
210 *	const rpcvers_t vers;
211 */
212
213__BEGIN_DECLS
214extern void	svc_unreg(const rpcprog_t, const rpcvers_t);
215__END_DECLS
216
217/*
218 * Transport registration.
219 *
220 * xprt_register(xprt)
221 *	SVCXPRT *xprt;
222 */
223__BEGIN_DECLS
224extern void	xprt_register	(SVCXPRT *);
225__END_DECLS
226
227/*
228 * Transport un-register
229 *
230 * xprt_unregister(xprt)
231 *	SVCXPRT *xprt;
232 */
233__BEGIN_DECLS
234extern void	xprt_unregister	(SVCXPRT *);
235__END_DECLS
236
237
238/*
239 * When the service routine is called, it must first check to see if it
240 * knows about the procedure;  if not, it should call svcerr_noproc
241 * and return.  If so, it should deserialize its arguments via
242 * SVC_GETARGS (defined above).  If the deserialization does not work,
243 * svcerr_decode should be called followed by a return.  Successful
244 * decoding of the arguments should be followed the execution of the
245 * procedure's code and a call to svc_sendreply.
246 *
247 * Also, if the service refuses to execute the procedure due to too-
248 * weak authentication parameters, svcerr_weakauth should be called.
249 * Note: do not confuse access-control failure with weak authentication!
250 *
251 * NB: In pure implementations of rpc, the caller always waits for a reply
252 * msg.  This message is sent when svc_sendreply is called.
253 * Therefore pure service implementations should always call
254 * svc_sendreply even if the function logically returns void;  use
255 * xdr.h - xdr_void for the xdr routine.  HOWEVER, tcp based rpc allows
256 * for the abuse of pure rpc via batched calling or pipelining.  In the
257 * case of a batched call, svc_sendreply should NOT be called since
258 * this would send a return message, which is what batching tries to avoid.
259 * It is the service/protocol writer's responsibility to know which calls are
260 * batched and which are not.  Warning: responding to batch calls may
261 * deadlock the caller and server processes!
262 */
263
264__BEGIN_DECLS
265extern bool_t	svc_sendreply	(SVCXPRT *, xdrproc_t, const char *);
266extern void	svcerr_decode	(SVCXPRT *);
267extern void	svcerr_weakauth	(SVCXPRT *);
268extern void	svcerr_noproc	(SVCXPRT *);
269extern void	svcerr_progvers	(SVCXPRT *, rpcvers_t, rpcvers_t);
270extern void	svcerr_auth	(SVCXPRT *, enum auth_stat);
271extern void	svcerr_noprog	(SVCXPRT *);
272extern void	svcerr_systemerr(SVCXPRT *);
273extern int	rpc_reg(rpcprog_t, rpcvers_t, rpcproc_t,
274			     char *(*)(char *), xdrproc_t, xdrproc_t,
275			     char *);
276__END_DECLS
277
278/*
279 * Lowest level dispatching -OR- who owns this process anyway.
280 * Somebody has to wait for incoming requests and then call the correct
281 * service routine.  The routine svc_run does infinite waiting; i.e.,
282 * svc_run never returns.
283 * Since another (co-existent) package may wish to selectively wait for
284 * incoming calls or other events outside of the rpc architecture, the
285 * routine svc_getreq is provided.  It must be passed readfds, the
286 * "in-place" results of a select system call (see select, section 2).
287 */
288
289/*
290 * Global keeper of rpc service descriptors in use
291 * dynamic; must be inspected before each call to select
292 */
293extern int svc_maxfd;
294#ifdef FD_SETSIZE
295extern fd_set svc_fdset;
296#define svc_fds svc_fdset.fds_bits[0]	/* compatibility */
297#else
298extern int svc_fds;
299#endif /* def FD_SETSIZE */
300
301/*
302 * a small program implemented by the svc_rpc implementation itself;
303 * also see clnt.h for protocol numbers.
304 */
305__BEGIN_DECLS
306extern void rpctest_service(void);
307__END_DECLS
308
309__BEGIN_DECLS
310extern void	svc_getreq	(int);
311extern void	svc_getreqset	(fd_set *);
312extern void	svc_getreq_common	(int);
313struct pollfd;
314extern void	svc_getreq_poll(struct pollfd *, int);
315
316extern void	svc_run		(void);
317extern void	svc_exit	(void);
318__END_DECLS
319
320/*
321 * Socket to use on svcxxx_create call to get default socket
322 */
323#define	RPC_ANYSOCK	-1
324#define RPC_ANYFD	RPC_ANYSOCK
325
326/*
327 * These are the existing service side transport implementations
328 */
329
330__BEGIN_DECLS
331/*
332 * Transport independent svc_create routine.
333 */
334extern int svc_create(void (*)(struct svc_req *, SVCXPRT *),
335			   const rpcprog_t, const rpcvers_t, const char *);
336/*
337 *	void (*dispatch)(...);		-- dispatch routine
338 *	const rpcprog_t prognum;	-- program number
339 *	const rpcvers_t versnum;	-- version number
340 *	const char *nettype;		-- network type
341 */
342
343
344/*
345 * Generic server creation routine. It takes a netconfig structure
346 * instead of a nettype.
347 */
348
349extern SVCXPRT *svc_tp_create(void (*)(struct svc_req *, SVCXPRT *),
350				   const rpcprog_t, const rpcvers_t,
351				   const struct netconfig *);
352/*
353 *	void (*dispatch)(...);		-- dispatch routine
354 *	const rpcprog_t prognum;	-- program number
355 *	const rpcvers_t versnum;	-- version number
356 *	const struct netconfig *nconf;	-- netconfig structure
357 */
358
359
360/*
361 * Generic TLI create routine
362 */
363extern SVCXPRT *svc_tli_create(const int, const struct netconfig *,
364				    const struct t_bind *, const u_int,
365				    const u_int);
366/*
367 *	const int fd;			-- connection end point
368 *	const struct netconfig *nconf;	-- netconfig structure for network
369 *	const struct t_bind *bindaddr;	-- local bind address
370 *	const u_int sendsz;		-- max sendsize
371 *	const u_int recvsz;		-- max recvsize
372 */
373
374/*
375 * Connectionless and connectionful create routines
376 */
377
378extern SVCXPRT *svc_vc_create(const int, const u_int, const u_int);
379/*
380 *	const int fd;			-- open connection end point
381 *	const u_int sendsize;		-- max send size
382 *	const u_int recvsize;		-- max recv size
383 */
384
385extern SVCXPRT *svc_dg_create(const int, const u_int, const u_int);
386/*
387 *	const int fd;			-- open connection
388 *	const u_int sendsize;		-- max send size
389 *	const u_int recvsize;		-- max recv size
390 */
391
392
393/*
394 * the routine takes any *open* connection
395 * descriptor as its first input and is used for open connections.
396 */
397extern SVCXPRT *svc_fd_create(const int, const u_int, const u_int);
398/*
399 *	const int fd;			-- open connection end point
400 *	const u_int sendsize;		-- max send size
401 *	const u_int recvsize;		-- max recv size
402 */
403
404/*
405 * Memory based rpc (for speed check and testing)
406 */
407extern SVCXPRT *svc_raw_create(void);
408
409/*
410 * svc_dg_enable_cache() enables the cache on dg transports.
411 */
412int svc_dg_enablecache(SVCXPRT *, const u_int);
413
414__END_DECLS
415
416
417/* for backward compatibility */
418#include <rpc/svc_soc.h>
419
420#endif /* !_RPC_SVC_H_ */
421