Spaces:
Sleeping
Sleeping
/* @(#)svc.h 2.2 88/07/29 4.0 RPCSRC; from 1.20 88/02/08 SMI */ | |
/* | |
* Copyright (c) 2010, Oracle America, Inc. | |
* | |
* All rights reserved. | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions are met: | |
* | |
* * Redistributions of source code must retain the above copyright | |
* notice, this list of conditions and the following disclaimer. | |
* | |
* * Redistributions in binary form must reproduce the above copyright | |
* notice, this list of conditions and the following disclaimer in | |
* the documentation and/or other materials provided with the | |
* distribution. | |
* | |
* * Neither the name of the "Oracle America, Inc." nor the names of | |
* its contributors may be used to endorse or promote products | |
* derived from this software without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS | |
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | |
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED | |
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
*/ | |
/* | |
* svc.h, Server-side remote procedure call interface. | |
*/ | |
GSSRPC__BEGIN_DECLS | |
/* | |
* This interface must manage two items concerning remote procedure calling: | |
* | |
* 1) An arbitrary number of transport connections upon which rpc requests | |
* are received. The two most notable transports are TCP and UDP; they are | |
* created and registered by routines in svc_tcp.c and svc_udp.c, respectively; | |
* they in turn call xprt_register and xprt_unregister. | |
* | |
* 2) An arbitrary number of locally registered services. Services are | |
* described by the following four data: program number, version number, | |
* "service dispatch" function, a transport handle, and a boolean that | |
* indicates whether or not the exported program should be registered with a | |
* local binder service; if true the program's number and version and the | |
* port number from the transport handle are registered with the binder. | |
* These data are registered with the rpc svc system via svc_register. | |
* | |
* A service's dispatch function is called whenever an rpc request comes in | |
* on a transport. The request's program and version numbers must match | |
* those of the registered service. The dispatch function is passed two | |
* parameters, struct svc_req * and SVCXPRT *, defined below. | |
*/ | |
enum xprt_stat { | |
XPRT_DIED, | |
XPRT_MOREREQS, | |
XPRT_IDLE | |
}; | |
/* | |
* Server side transport handle | |
*/ | |
typedef struct SVCXPRT { | |
SOCKET xp_sock; | |
int xp_sock; | |
u_short xp_port; /* associated port number */ | |
struct xp_ops { | |
/* receive incoming requests */ | |
bool_t (*xp_recv)(struct SVCXPRT *, struct rpc_msg *); | |
/* get transport status */ | |
enum xprt_stat (*xp_stat)(struct SVCXPRT *); | |
/* get arguments */ | |
bool_t (*xp_getargs)(struct SVCXPRT *, xdrproc_t, | |
void *); | |
/* send reply */ | |
bool_t (*xp_reply)(struct SVCXPRT *, | |
struct rpc_msg *); | |
/* free mem allocated for args */ | |
bool_t (*xp_freeargs)(struct SVCXPRT *, xdrproc_t, | |
void *); | |
/* destroy this struct */ | |
void (*xp_destroy)(struct SVCXPRT *); | |
} *xp_ops; | |
int xp_addrlen; /* length of remote address */ | |
struct sockaddr_in xp_raddr; /* remote address */ | |
struct opaque_auth xp_verf; /* raw response verifier */ | |
SVCAUTH *xp_auth; /* auth flavor of current req */ | |
void *xp_p1; /* private */ | |
void *xp_p2; /* private */ | |
int xp_laddrlen; /* length of local address */ | |
struct sockaddr_in xp_laddr; /* local address */ | |
} SVCXPRT; | |
/* | |
* Approved way of getting address of caller | |
*/ | |
/* | |
* Operations defined on an SVCXPRT handle | |
* | |
* SVCXPRT *xprt; | |
* struct rpc_msg *msg; | |
* xdrproc_t xargs; | |
* caddr_t argsp; | |
*/ | |
/* | |
* Service request | |
*/ | |
struct svc_req { | |
rpcprog_t rq_prog; /* service program number */ | |
rpcvers_t rq_vers; /* service protocol version */ | |
rpcproc_t rq_proc; /* the desired procedure */ | |
struct opaque_auth rq_cred; /* raw creds from the wire */ | |
void * rq_clntcred; /* read only cooked client cred */ | |
void * rq_svccred; /* read only svc cred/context */ | |
void * rq_clntname; /* read only client name */ | |
SVCXPRT *rq_xprt; /* associated transport */ | |
/* The request's auth flavor *should* be here, but the svc_req */ | |
/* isn't passed around everywhere it is necessary. The */ | |
/* transport *is* passed around, so the auth flavor it stored */ | |
/* there. This means that the transport must be single */ | |
/* threaded, but other parts of SunRPC already require that. */ | |
/*SVCAUTH *rq_auth; associated auth flavor */ | |
}; | |
/* | |
* Service registration | |
* | |
* svc_register(xprt, prog, vers, dispatch, protocol) | |
* SVCXPRT *xprt; | |
* rpcprog_t prog; | |
* rpcvers_t vers; | |
* void (*dispatch)(); | |
* int protocol; like IPPROTO_TCP or _UDP; zero means do not register | |
* | |
* registerrpc(prog, vers, proc, routine, inproc, outproc) | |
* returns 0 upon success, -1 if error. | |
*/ | |
extern bool_t svc_register(SVCXPRT *, rpcprog_t, rpcvers_t, | |
void (*)(struct svc_req *, SVCXPRT *), int); | |
extern int registerrpc(rpcprog_t, rpcvers_t, rpcproc_t, | |
char *(*)(void *), | |
xdrproc_t, xdrproc_t); | |
/* | |
* Service un-registration | |
* | |
* svc_unregister(prog, vers) | |
* rpcprog_t prog; | |
* rpcvers_t vers; | |
*/ | |
extern void svc_unregister(rpcprog_t, rpcvers_t); | |
/* | |
* Transport registration. | |
* | |
* xprt_register(xprt) | |
* SVCXPRT *xprt; | |
*/ | |
extern void xprt_register(SVCXPRT *); | |
/* | |
* Transport un-register | |
* | |
* xprt_unregister(xprt) | |
* SVCXPRT *xprt; | |
*/ | |
extern void xprt_unregister(SVCXPRT *); | |
/* | |
* When the service routine is called, it must first check to see if | |
* it knows about the procedure; if not, it should call svcerr_noproc | |
* and return. If so, it should deserialize its arguments via | |
* SVC_GETARGS or the new SVC_GETARGS_REQ (both defined above). If | |
* the deserialization does not work, svcerr_decode should be called | |
* followed by a return. Successful decoding of the arguments should | |
* be followed the execution of the procedure's code and a call to | |
* svc_sendreply or the new svc_sendreply_req. | |
* | |
* Also, if the service refuses to execute the procedure due to too- | |
* weak authentication parameters, svcerr_weakauth should be called. | |
* Note: do not confuse access-control failure with weak authentication! | |
* | |
* NB: In pure implementations of rpc, the caller always waits for a reply | |
* msg. This message is sent when svc_sendreply is called. | |
* Therefore pure service implementations should always call | |
* svc_sendreply even if the function logically returns void; use | |
* xdr.h - xdr_void for the xdr routine. HOWEVER, tcp based rpc allows | |
* for the abuse of pure rpc via batched calling or pipelining. In the | |
* case of a batched call, svc_sendreply should NOT be called since | |
* this would send a return message, which is what batching tries to avoid. | |
* It is the service/protocol writer's responsibility to know which calls are | |
* batched and which are not. Warning: responding to batch calls may | |
* deadlock the caller and server processes! | |
*/ | |
extern bool_t svc_sendreply(SVCXPRT *, xdrproc_t, caddr_t); | |
extern void svcerr_decode(SVCXPRT *); | |
extern void svcerr_weakauth(SVCXPRT *); | |
extern void svcerr_noproc(SVCXPRT *); | |
extern void svcerr_progvers(SVCXPRT *, rpcvers_t, rpcvers_t); | |
extern void svcerr_auth(SVCXPRT *, enum auth_stat); | |
extern void svcerr_noprog(SVCXPRT *); | |
extern void svcerr_systemerr(SVCXPRT *); | |
/* | |
* Lowest level dispatching -OR- who owns this process anyway. | |
* Somebody has to wait for incoming requests and then call the correct | |
* service routine. The routine svc_run does infinite waiting; i.e., | |
* svc_run never returns. | |
* Since another (co-existant) package may wish to selectively wait for | |
* incoming calls or other events outside of the rpc architecture, the | |
* routine svc_getreq is provided. It must be passed readfds, the | |
* "in-place" results of a select system call (see select, section 2). | |
*/ | |
/* | |
* Global keeper of rpc service descriptors in use | |
* dynamic; must be inspected before each call to select | |
*/ | |
extern int svc_maxfd; | |
extern fd_set svc_fdset; | |
/* RENAMED */ | |
extern int svc_fds; | |
extern int svc_maxfd; | |
extern void svc_getreq(int); | |
extern void svc_getreqset(fd_set *);/* takes fdset instead of int */ | |
extern void svc_getreqset(int *); | |
extern void svc_run(void); /* never returns */ | |
/* | |
* Socket to use on svcxxx_create call to get default socket | |
*/ | |
/* | |
* These are the existing service side transport implementations | |
*/ | |
/* | |
* Memory based rpc for testing and timing. | |
*/ | |
extern SVCXPRT *svcraw_create(void); | |
/* | |
* Udp based rpc. | |
*/ | |
extern SVCXPRT *svcudp_create(int); | |
extern SVCXPRT *svcudp_bufcreate(int, u_int, u_int); | |
extern int svcudp_enablecache(SVCXPRT *, uint32_t); | |
/* | |
* Tcp based rpc. | |
*/ | |
extern SVCXPRT *svctcp_create(int, u_int, u_int); | |
/* | |
* Like svtcp_create(), except the routine takes any *open* UNIX file | |
* descriptor as its first input. | |
*/ | |
extern SVCXPRT *svcfd_create(int, u_int, u_int); | |
/* XXX add auth_gsapi_log_*? */ | |
GSSRPC__END_DECLS | |