These routines allow C programs to make procedure
calls on other machines across the network.
First, the client calls a procedure to send a
data packet to the server.
Upon receipt of the packet, the server calls a dispatch routine
to perform the requested service, and then sends back a
reply.
Finally, the procedure call returns to the client.
#include <rpc/rpc.h>
void
auth_destroy(auth)
AUTH *auth;
A macro that destroys the authentication information associated with
auth. Destruction usually involves deallocation of private data
structures. The use of
auth is undefined after calling
auth_destroy().
AUTH *
authnone_create()
Create and returns an
RPC authentication handle that passes nonusable authentication
information with each remote procedure call. This is the
default authentication used by
RPC.
Create and return an
RPC authentication handle that contains
authentication information.
The parameter
host is the name of the machine on which the information was
created;
uid is the users user
ID ;
gid is the users current group
ID ;
len and
aup_gids refer to a counted array of groups to which the user belongs.
It is easy to impersonate a user.
AUTH *
authunix_create_default()
Calls
authunix_create() with the appropriate parameters.
Call the remote procedure associated with
prognum,
versnum, and
procnum on the machine,
host. The parameter
in is the address of the procedures argument(s), and
out is the address of where to place the result(s);
inproc is used to encode the procedures parameters, and
outproc is used to decode the procedures results.
This routine returns zero if it succeeds, or the value of
enum clnt_stat cast to an integer if it fails.
The routine
clnt_perrno() is handy for translating failure statuses into messages.
Warning: calling remote procedures with this routine
uses
UDP/IP as a transport; see
clntudp_create() for restrictions.
You do not have control of timeouts or authentication using
this routine.
Like
callrpc(), except the call message is broadcast to all locally
connected broadcast nets. Each time it receives a
response, this routine calls
eachresult(), whose form is:
where
out is the same as
out passed to
clnt_broadcast(), except that the remote procedures output is decoded there;
addr points to the address of the machine that sent the results.
If
eachresult() returns zero,
clnt_broadcast() waits for more replies; otherwise it returns with appropriate
status.
Warning: broadcast sockets are limited in size to the
maximum transfer unit of the data link. For ethernet,
this value is 1500 bytes.
A macro that calls the remote procedure
procnum associated with the client handle,
clnt, which is obtained with an
RPC client creation routine such as
clnt_create(). The parameter
in is the address of the procedures argument(s), and
out is the address of where to place the result(s);
inproc is used to encode the procedures parameters, and
outproc is used to decode the procedures results;
tout is the time allowed for results to come back.
clnt_destroy(clnt)
CLIENT *clnt;
A macro that destroys the clients
RPC handle. Destruction usually involves deallocation
of private data structures, including
clnt itself. Use of
clnt is undefined after calling
clnt_destroy(). If the
RPC library opened the associated socket, it will close it also.
Otherwise, the socket remains open.
Generic client creation routine.
host identifies the name of the remote host where the server
is located.
proto indicates which kind of transport protocol to use. The
currently supported values for this field are udp\(rq
and \(lqtcp\(rq.
Default timeouts are set, but can be modified using
clnt_control().
Warning: Using
UDP has its shortcomings. Since
UDP-based
RPC messages can only hold up to 8 Kbytes of encoded data,
this transport cannot be used for procedures that take
large arguments or return huge results.
A macro used to change or retrieve various information
about a client object.
req indicates the type of operation, and
info is a pointer to the information. For both
UDP and
TCP, the supported values of
req and their argument types and what they do are:
CLSET_TIMEOUT struct timeval set total timeout
CLGET_TIMEOUT struct timeval get total timeout
Note: if you set the timeout using
clnt_control(), the timeout parameter passed to
clnt_call() will be ignored in all future calls.
CLGET_SERVER_ADDR struct sockaddr_in get servers address
The following operations are valid for
UDP only:
CLSET_RETRY_TIMEOUT struct timeval set the retry timeout
CLGET_RETRY_TIMEOUT struct timeval get the retry timeout
The retry timeout is the time that
UDP RPC waits for the server to reply before
retransmitting the request.
A macro that frees any data allocated by the
RPC/XDR system when it decoded the results of an
RPC call. The
parameter
out is the address of the results, and
outproc is the
XDR routine describing the results.
This routine returns one if the results were successfully
freed,
and zero otherwise.
A macro that copies the error structure out of the client
handle
to the structure at address
errp.
void
clnt_pcreateerror(s)
char *s;
Print a message to standard error indicating
why a client
RPC handle could not be created.
The message is prepended with string
s and a colon.
Used when a
clnt_create(),
clntraw_create(),
clnttcp_create(), or
clntudp_create() call fails.
void
clnt_perrno(stat)
enum clnt_stat stat;
Print a message to standard error corresponding
to the condition indicated by
stat. Used after
callrpc().
clnt_perror(clnt, s)
CLIENT *clnt;
char *s;
Print a message to standard error indicating why an
RPC call failed;
clnt is the handle used to do the call.
The message is prepended with string
s and a colon.
Used after
clnt_call().
char *
clnt_spcreateerror
char *s;
Like
clnt_pcreateerror(), except that it returns a string
instead of printing to the standard error.
Bugs: returns pointer to static data that is overwritten
on each call.
char *
clnt_sperrno(stat)
enum clnt_stat stat;
Take the same arguments as
clnt_perrno(), but instead of sending a message to the standard error
indicating why an
RPC call failed, return a pointer to a string which contains
the message. The string ends with a
NEWLINE.
clnt_sperrno() is used instead of
clnt_perrno() if the program does not have a standard error (as a program
running as a server quite likely does not), or if the
programmer
does not want the message to be output with
printf(), or if a message format different than that supported by
clnt_perrno() is to be used.
Note: unlike
clnt_sperror() and
clnt_spcreaterror(),
clnt_sperrno() returns pointer to static data, but the
result will not get overwritten on each call.
This routine creates a toy
RPC client for the remote program
prognum, version
versnum. The transport used to pass messages to the service is
actually a buffer within the processs address space, so the
corresponding
RPC server should live in the same address space; see
svcraw_create(). This allows simulation of
RPC and acquisition of
RPC overheads, such as round trip times, without any
kernel interference. This routine returns
NULL if it fails.
This routine creates an
RPC client for the remote program
prognum, version
versnum; the client uses
TCP/IP as a transport. The remote program is located at Internet
address
*addr. If
addr->sin_port
is zero, then it is set to the actual port that the remote
program is listening on (the remote
portmap service is consulted for this information). The parameter
sockp is a socket; if it is
RPC_ANYSOCK, then this routine opens a new one and sets
sockp. Since
TCP-based
RPC uses buffered
I/O , the user may specify the size of the send and receive buffers
with the parameters
sendsz and
recvsz; values of zero choose suitable defaults.
This routine returns
NULL if it fails.
This routine creates an
RPC client for the remote program
prognum, version
versnum; the client uses use
UDP/IP as a transport. The remote program is located at Internet
address
addr. If
addr->sin_port
is zero, then it is set to actual port that the remote
program is listening on (the remote
portmap service is consulted for this information). The parameter
sockp is a socket; if it is
RPC_ANYSOCK, then this routine opens a new one and sets
sockp. The
UDP transport resends the call message in intervals of
wait time until a response is received or until the call times
out.
The total time for the call to time out is specified by
clnt_call().
Warning: since
UDP-based
RPC messages can only hold up to 8 Kbytes
of encoded data, this transport cannot be used for procedures
that take large arguments or return huge results.
CLIENT *
clntudp_bufcreate(addr, prognum, versnum, wait, sockp, sendsize, recosize)
struct sockaddr_in *addr;
u_long prognum, versnum;
struct timeval wait;
int *sockp;
unsigned int sendsize;
unsigned int recosize;
This routine creates an
RPC client for the remote program
prognum, on
versnum; the client uses use
UDP/IP as a transport. The remote program is located at Internet
address
addr. If
addr->sin_port
is zero, then it is set to actual port that the remote
program is listening on (the remote
portmap service is consulted for this information). The parameter
sockp is a socket; if it is
RPC_ANYSOCK, then this routine opens a new one and sets
sockp. The
UDP transport resends the call message in intervals of
wait time until a response is received or until the call times
out.
The total time for the call to time out is specified by
clnt_call().
This allows the user to specify the maximum packet size for sending and receiving
UDP-based
RPC messages.
Stuff the machines
IP address into
*addr, without consulting the library routines that deal with
/etc/hosts. The port number is always set to
htons(PMAPPORT).
A user interface to the
portmap service, which returns a list of the current
RPC program-to-port mappings
on the host located at
IP address
*addr. This routine can return
NULL . The command
rpcinfo -p uses this routine.
A user interface to the
portmap service, which returns the port number
on which waits a service that supports program number
prognum, version
versnum, and speaks the transport protocol associated with
protocol. The value of
protocol is most likely
IPPROTO_UDP or
IPPROTO_TCP. A return value of zero means that the mapping does not exist
or that
the
RPC system failed to contact the remote
portmap service. In the latter case, the global variable
rpc_createerr() contains the
RPC status.
A user interface to the
portmap service, which instructs
portmap on the host at
IP address
*addr to make an
RPC call on your behalf to a procedure on that host.
The parameter
*portp will be modified to the programs port number if the
procedure
succeeds. The definitions of other parameters are discussed
in
callrpc() and
clnt_call(). This procedure should be used for a \(lqping\(rq and nothing
else.
See also
clnt_broadcast().
A user interface to the
portmap service, which establishes a mapping between the triple
[prognum,versnum,protocol] and
port on the machines
portmap service. The value of
protocol is most likely
IPPROTO_UDP or
IPPROTO_TCP. This routine returns one if it succeeds, zero otherwise.
Automatically done by
svc_register().
A user interface to the
portmap service, which destroys all mapping between the triple
[prognum,versnum,*] and
ports on the machines
portmap service. This routine returns one if it succeeds, zero
otherwise.
Register procedure
procname with the
RPC service package. If a request arrives for program
prognum, version
versnum, and procedure
procnum,
procname is called with a pointer to its parameter(s);
progname should return a pointer to its static result(s);
inproc is used to decode the parameters while
outproc is used to encode the results.
This routine returns zero if the registration succeeded, -1
otherwise.
Warning: remote procedures registered in this form
are accessed using the
UDP/IP transport; see
svcudp_create() for restrictions.
struct rpc_createerr rpc_createerr;
A global variable whose value is set by any
RPC client creation routine
that does not succeed. Use the routine
clnt_pcreateerror() to print the reason why.
svc_destroy(xprt)
SVCXPRT *
xprt;
A macro that destroys the
RPC service transport handle,
xprt. Destruction usually involves deallocation
of private data structures, including
xprt itself. Use of
xprt is undefined after calling this routine.
fd_set svc_fdset;
A global variable reflecting the
RPC service sides
read file descriptor bit mask; it is suitable as a parameter
to the
select() system call. This is only of interest
if a service implementor does not call
svc_run(), but rather does his own asynchronous event processing.
This variable is read-only (do not pass its address to
select()!), yet it may change after calls to
svc_getreqset() or any creation routines.
int svc_fds;
Similar to
svc_fdset, but limited to 32 descriptors. This
interface is obsoleted by
svc_fdset.
A macro that frees any data allocated by the
RPC/XDR system when it decoded the arguments to a service procedure
using
svc_getargs(). This routine returns 1 if the results were successfully
freed,
and zero otherwise.
A macro that decodes the arguments of an
RPC request
associated with the
RPC service transport handle,
xprt. The parameter
in is the address where the arguments will be placed;
inproc is the
XDR routine used to decode the arguments.
This routine returns one if decoding succeeds, and zero
otherwise.
The approved way of getting the network address of the caller
of a procedure associated with the
RPC service transport handle,
xprt.
svc_getreqset(rdfds)
fd_set *rdfds;
This routine is only of interest if a service implementor
does not call
svc_run(), but instead implements custom asynchronous event processing.
It is called when the
select() system call has determined that an
RPC request has arrived on some
RPC
socket(s) ;rdfds is the resultant read file descriptor bit mask.
The routine returns when all sockets associated with the
value of
rdfds have been serviced.
svc_getreq(rdfds)
int rdfds;
Similar to
svc_getreqset(), but limited to 32 descriptors. This interface is obsoleted by
svc_getreqset().
Associates
prognum and
versnum with the service dispatch procedure,
dispatch. If
protocol is zero, the service is not registered with the
portmap service. If
protocol is non-zero, then a mapping of the triple
[prognum,versnum,protocol] to
xprt->xp_port
is established with the local
portmap service (generally
protocol is zero,
IPPROTO_UDP or
IPPROTO_TCP ).
The procedure
dispatch has the following form:
The
svc_register() routine returns one if it succeeds, and zero otherwise.
svc_run()
This routine never returns. It waits for
RPC requests to arrive, and calls the appropriate service
procedure using
svc_getreq() when one arrives. This procedure is usually waiting for a
select() system call to return.
Called by an
RPC services dispatch routine to send the results of a
remote procedure call. The parameter
xprt is the requests associated transport handle;
outproc is the
XDR routine which is used to encode the results; and
out is the address of the results.
This routine returns one if it succeeds, zero otherwise.
Called by a service dispatch routine that refuses to perform
a remote procedure call due to an authentication error.
void
svcerr_decode(xprt)
SVCXPRT *xprt;
Called by a service dispatch routine that cannot successfully
decode its parameters. See also
svc_getargs().
void
svcerr_noproc(xprt)
SVCXPRT *xprt;
Called by a service dispatch routine that does not implement
the procedure number that the caller requests.
void
svcerr_noprog(xprt)
SVCXPRT *xprt;
Called when the desired program is not registered with the
RPC package. Service implementors usually do not need this routine.
void
svcerr_progvers(xprt)
SVCXPRT *xprt;
Called when the desired version of a program is not registered
with the
RPC package. Service implementors usually do not need this routine.
void
svcerr_systemerr(xprt)
SVCXPRT *xprt;
Called by a service dispatch routine when it detects a system
error
not covered by any particular protocol.
For example, if a service can no longer allocate storage,
it may call this routine.
void
svcerr_weakauth(xprt)
SVCXPRT *xprt;
Called by a service dispatch routine that refuses to perform
a remote procedure call due to insufficient
authentication parameters. The routine calls
svcerr_auth(xprt, AUTH_TOOWEAK).
Create a service on top of any open descriptor. Typically,
this
descriptor is a connected socket for a stream protocol such
as
TCP.
sendsize and
recvsize indicate sizes for the send and receive buffers. If they are
zero, a reasonable default is chosen.
SVCXPRT *
svcraw_create()
This routine creates a toy
RPC service transport, to which it returns a pointer. The
transport
is really a buffer within the processs address space,
so the corresponding
RPC client should live in the same
address space;
see
clntraw_create(). This routine allows simulation of
RPC and acquisition of
RPC overheads (such as round trip times), without any kernel
interference.
This routine returns
NULL if it fails.
SVCXPRT *
svctcp_create(sock, send_buf_size, recv_buf_size)
int sock;
u_int send_buf_size, recv_buf_size;
This routine creates a
TCP/IP-based
RPC service transport, to which it returns a pointer.
The transport is associated with the socket
sock, which may be
RPC_ANYSOCK, in which case a new socket is created.
If the socket is not bound to a local
TCP port, then this routine binds it to an arbitrary port. Upon
completion,
xprt->xp_sock
is the transports socket descriptor, and
xprt->xp_port
is the transports port number.
This routine returns
NULL if it fails. Since
TCP-based
RPC uses buffered
I/O , users may specify the size of buffers; values of zero
choose suitable defaults.
SVCXPRT *
svcudp_bufcreate(sock, sendsize, recosize)
int sock;
This routine creates a
UDP/IP-based
RPC service transport, to which it returns a pointer.
The transport is associated with the socket
sock, which may be
RPC_ANYSOCK, in which case a new socket is created.
If the socket is not bound to a local
UDP port, then this routine binds it to an arbitrary port. Upon
completion,
xprt->xp_sock
is the transports socket descriptor, and
xprt->xp_port
is the transports port number.
This routine returns
NULL if it fails.
This allows the user to specify the maximum packet size for sending and
receiving
UDP-based
RPC messages.
SVCXPRT *
svcudp_create(sock)
int sock;
This call is equivalent to
svcudp_bufcreate(sock,SZ,SZ)
for some default size SZ.
Used for describing
UNIX credentials. This routine is useful for users
who wish to generate these credentials without using the
RPC authentication package.
Used for describing
RPC authentication information messages.
This routine is useful for users who wish to generate
RPC-style messages without using the
RPC package.
Used for describing parameters to various
portmap procedures, externally.
This routine is useful for users who wish to generate
these parameters without using the
pmap interface.
Used for describing a list of port mappings, externally.
This routine is useful for users who wish to generate
these parameters without using the
pmap interface.
Used for describing
RPC reply messages.
This routine is useful for users who wish to generate
RPC style messages without using the
RPC package.
void
xprt_register(xprt)
SVCXPRT *xprt;
After
RPC service transport handles are created,
they should register themselves with the
RPC service package.
This routine modifies the global variable
svc_fds(). Service implementors usually do not need this routine.
void
xprt_unregister(xprt)
SVCXPRT *xprt;
Before an
RPC service transport handle is destroyed,
it should unregister itself with the
RPC service package.
This routine modifies the global variable
svc_fds(). Service implementors usually do not need this routine.