DIGITAL TCP/IP Services for OpenVMS
ONC RPC Programming


Previous Contents Index


svc_getcaller

A macro that returns the address of the client that called the service procedure.

Format

#include <rpc/rpc.h>

struct sockaddr_in *svc_getcaller(SVCXPRT *xprt);


Arguments

xprt

A pointer to an RPC server handle created by any of the server handle creation routines.

Description

This routine returns a sockaddr_in structure containing the internet address of the RPC client routine that called the service procedure.

Return Values

struct sockaddr_in A pointer to the socket descriptor.

svc_getreqset

Returns data for each server connection.

Format

#include <rpc/rpc.h>

void svc_getreqset(fd_set *rdfds);


Arguments

rdfds

A pointer to the read file descriptor bit mask modified by the select routine.

Description

The svc_getreqset routine is for servers that implement custom asynchronous event processing or that do not use the svc_run routine. You may only use svc_fdset when the server does not use svc_run.

You are unlikely to call this routine directly, because the svc_run routine calls it. However, there are times when you cannot call svc_run. For example, suppose a program services RPC requests and reads or writes to another socket at the same time. The program cannot call svc_run. It must call select and svc_getreqset.

The server calls svc_getreqset when a call to the select system call determines the server has received one or more RPC requests. The svc_getreqset routine reads in data for each server connection, then calls the server program to handle the data.

The svc_getreqset routine does not return a value. It finishes executing after all sockets associated with the variable rdfds have been serviced.

You may use the global variable svc_fdset with svc_getreqset. The svc_fdset variable is the RPC server's read file descriptor bit mask.

To use svc_fdset:

  1. Copy the global variable svc_fdset into a temporary variable.
  2. Pass the temporary variable to the select routine. The select routine overwrites the variable and returns it.
  3. Pass the temporary variable to the svc_getreqset routine.

Example


#define MAXSOCK 10 
 
     int readfds[ MAXSOCK+1],    /* sockets to select from*/ 
         i, j; 
 
     for(i = 0, j = 0; i << MAXSOCK; i++) 
          if((svc_fdset[i].sockname != 0) && (svc_fdset[i].sockname != -1)) 
               readfds[j++] = svc_fdset[i].sockname; 
     readfds[j] = 0;                 /* list of sockets ends with a zero */ 
     switch(select(0, readfds, 0, 0, 0)) 
     { 
       case -1:      /* an error happened */ 
       case 0:       /* time out */ 
            break; 
       default:      /* 1 or more sockets ready for reading */ 
            errno = 0; 
            svc_getreqset(readfds); 
            if( errno == ENETDOWN || errno == ENOTCONN) 
            sys$exit( SS$_THIRDPARTY); 
     } 
      


Return Values

None  

svc_register

Registers the server program with the Portmapper service.

Format

#include <rpc/rpc.h>

bool_t svc_register(SVCXPRT *xprt, u_long prognum, u_long versnum, void (*dispatch)(), u_long protocol);


Arguments

xprt

A pointer to an RPC server handle created by any of the server handle creation routines.

prognum

The program number associated with the server procedure.

versnum

The version number associated with the server procedure.

dispatch

The address of the service dispatch procedure that the server procedure calls. The procedure dispatch has the following form:


void dispatch(request, xprt) 
struct svc_req *request; 
SVCXPRT *xprt; 

The svc_run and svc_getreqset call the dispatch routine.

protocol

The protocol that the server procedure uses. Values for this parameter are zero, IPPROTO_UDP, or IPPROTO_TCP. If protocol is zero, the service is not registered with the Portmapper service.

Description

Associates prognum and versnum with the service dispatch procedure dispatch. If protocol is non-zero, then a mapping of the triple [prognum, versnum, protocol] to xprt->xp_port is also established with the local Portmapper service.

Return Values

TRUE Indicates success.
FALSE Indicates failure.

svc_run

Waits for incoming RPC requests and calls the svc_getreqset routine to dispatch to the appropriate RPC server program.

Format

#include <rpc/rpc.h>

void svc_run();


Arguments

None


Description

The svc_run routine calls the select routine to wait for RPC requests. When a request arrives, svc_run calls the svc_getreqset routine. Then svc_run calls the select routine again.

The svc_run routine never returns.

You may use the global variable svc_fdset with the svc_run routine. See the svc_getreqset routine for more information on svc_fdset.


Return Values

Never returns  

svc_sendreply

Sends the results of a remote procedure call to an RPC client.

Format

#include <rpc/rpc.h>

bool_t svc_sendreply(SVCXPRT *xprt, xdrproc_t outproc, char *out);


Arguments

xprt

A pointer to an RPC server handle created by any of the server handle creation routines.

outproc

The XDR routine used to encode the server procedure's results.

out

A pointer to the server procedure's results.

Description

Called by an ONC RPC service's dispatch routine to send the results of a remote procedure call.

Return Values

TRUE Indicates success.
FALSE Indicates failure.

svc_unregister

Calls the Portmapper to unregister the specified program and version for all protocols. The program and version are removed from the list of active servers.

Format

#include <rpc/rpc.h>

void svc_unregister(u_long prognum, u_long versnum);


Arguments

prognum

The program number associated with the server procedure.

versnum

The version number associated with the server procedure.

Description

Removes all mapping of the double [prognum, versnum] to dispatch routines, and of the triple [prognum, versnum, *] to port number.

Return Values

None  

svcerr_auth

Sends an authentication error to the client.

Format

#include <rpc/rpc.h>

void svcerr_auth(SVCXPRT *xprt, enum auth_stat why);


Arguments

xprt

A pointer to an RPC server handle created by any of the server handle creation routines.

why

The reason for the authentication error.

Description

Called by a service dispatch routine that refuses to perform a remote procedure call due to an authentication error.

Return Values

None  

svcerr_decode

Sends an error code to the client indicating that the server procedure cannot decode the client's arguments.

Format

#include <rpc/rpc.h>

void svcerr_decode(SVCXPRT *xprt);


Arguments

xprt

A pointer to an RPC server handle created by any of the server handle creation routines.

Description

Called by a service dispatch routine that cannot successfully decode its parameters. See also the svc_getargs routine.

Return Values

None  

svcerr_noproc

Sends an error code to the client indicating that the server program does not implement the requested procedure.

Format

#include <rpc/rpc.h>

void svcerr_noproc(SVCXPRT *xprt);


Arguments

xprt

A pointer to an RPC server handle created by any of the server handle creation routines.

Description

Called by a service dispatch routine that does not implement the procedure number that the client requested.

Return Values

None  

svcerr_noprog

Sends an error code to the client indicating that the server program is not registered with the Portmapper.

Format

#include <rpc/rpc.h>

void svcerr_noprog(SVCXPRT *xprt);


Arguments

xprt

A pointer to an RPC server handle created by any of the server handle creation routines.

Description

Called when the desired program is not registered with the ONC RPC package. Generally, the Portmapper informs the client when a server is not registered. Therefore, service implementors usually do not use this routine.

Return Values

None  

svcerr_progvers

Sends an error code to the client indicating that the requested program is registered with the Portmapper but the requested version of the program is not registered.

Format

#include <rpc/rpc.h>

void svcerr_progvers(SVCXPRT *xprt, u_long low_vers, u_long high_vers);


Arguments

xprt

A pointer to an RPC server handle created by any of the server handle creation routines.

low_vers

The lowest version of the requested program that the server supports.

high_vers

The highest version of the requested program that the server supports.

Description

Called when the desired version of a program is not registered with the ONC RPC package. Generally, the Portmapper informs the client when a requested program version is not registered. Therefore, service implementors usually do not use this routine.

Return Values

None  

svcerr_systemerr

Sends an error code to the client indicating that the an error occurred that is not handled by the protocol being used.

Format

#include <rpc/rpc.h>

void svcerr_systemerr(SVCXPRT *xprt);


Arguments

xprt

A pointer to an RPC server handle created by any of the server handle creation routines.

Description

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.

Return Values

None  

svcerr_weakauth

Sends an error code to the client indicating that an authentication error occurred. The authentication information was correct but was insufficient.

Format

#include <rpc/rpc.h>

void svcerr_weakauth(SVCXPRT *xprt);


Arguments

xprt

A pointer to an RPC server handle created by any of the server handle creation routines.

Description

Called by a service dispatch routine that refuses to perform a remote procedure call due to insufficient (but correct) authentication parameters. The routine calls svcerr_auth (xprt, AUTH_TOOWEAK).

Return Values

None  

svcraw_create

Creates a server handle for memory-based ONC RPC for simple testing and timing.

Format

#include <rpc/rpc.h>

SVCXPRT *svcraw_create();


Arguments

None


Description

Creates a in-program ONC RPC service transport, to which it returns a pointer. The transport is really a buffer within the process's address space, so the corresponding client should live in the same address space; see the clntraw_create routine. The svcraw_create and clntraw_create routines allow simulation and acquisition of ONC RPC overheads (such as round-trip times), without any kernel interference.

Return Values

SVCXPRT * A pointer to an RPC server handle for the in-memory transport.
NULL Indicates failure.

svcfd_create

Creates an RPC server handle using the specified open file descriptor.

Format

#include <rpc/rpc.h>

SVCXPRT *svcfd_create(int fd, u_int sendsize, u_int recvsize);


Arguments

fd

The number of an open file descriptor.

sendsize

The size of the send buffer. If you specify 0, the routine chooses a suitable default.

recvsize

The size of the receive buffer. If you specify 0, the routine chooses a suitable default.

Description

Creates an RPC server handle using the specified TCP socket, to which it returns a pointer. The server should call the svcfd_create routine after it accepts an incoming TCP connection.

Return Values

SVCXPRT * A pointer to the server handle.
NULL Indicates failure.

svctcp_create

Creates an ONC RPC server handle for a TCP/IP connection.

Format

#include <rpc/rpc.h>

SVCXPRT *svctcp_create(int sock, u_int sendsize, u_int recvsize);


Arguments

sock

The socket with which the connection is associated. If sock is RPC_ANYSOCK, then this routine opens a new socket and sets sock. If the socket is not bound to a local TCP port, then this routine binds it to an arbitrary port.

sendsize

The size of the send buffer. If you specify 0, the routine chooses a suitable default.

recvsize

The size of the receive buffer. If you specify 0, the routine chooses a suitable default.

Description

Creates an RPC server handle using the TCP/IP transport, to which it returns a pointer. Upon completion, xprt->xp_sock is the transport's socket descriptor, and xprt->xp_port is the transport's port number. The service is automatically registered as a transporter (thereby including its socket in svc_fds such that its socket descriptor is included in all RPC select system calls).

Return Values

SVCXPRT * A pointer to the server handle.
NULL Indicates failure.

svcudp_bufcreate

Creates an ONC RPC server handle for a buffered I/O UDP connection.

Format

#include <rpc/rpc.h>

SVCXPRT *svcudp_bufcreate(int sock, u_int sendsize, u_int recvsize);


Arguments

sock

The socket with which the connection is associated. If sock is RPC_ANYSOCK, then this routine opens a new socket and sets sock.

sendsize

The size of the send buffer. If you specify 0, the routine chooses a suitable default.

recvsize

The size of the receive buffer. If you specify 0, the routine chooses a suitable default.

Description

Creates an RPC server handle using the UDP transport, to which it returns a pointer. Upon completion, xprt->xp_sock is the transport's socket descriptor, and xprt->xp_port is the transport's port number. The service is automatically registered as a transporter (thereby including its socket in svc_fds such that its socket descriptor is included in all RPC select system calls).

Return Values

SVCXPRT * A pointer to the server handle.
NULL Indicates failure.

svcudp_create

Creates an ONC RPC server handle for a non-buffered I/O UDP connection.

Format

#include <rpc/rpc.h>

SVCXPRT *svcudp_create(int sock);


Arguments

sock

The socket with which the connection is associated. If sock is RPC_ANYSOCK, then this routine opens a new socket and sets sock.

Description

Creates an RPC server handle using the UDP transport, to which it returns a pointer. Upon completion, xprt->xp_sock is the transport's socket descriptor, and xprt->xp_port is the transport's port number. The service is automatically registered as a transporter (thereby including its socket in svc_fds such that its socket descriptor is included in all RPC select system calls).

Note

Since UDP/IP-based ONC 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.

Return Values

SVCXPRT * A pointer to the server handle.
NULL Indicates failure.

xprt_register

Adds a socket associated with an RPC server handle to the list of registered sockets.

Format

#include <rpc/rpc.h>

void xprt_register(SVCXPRT *xprt);


Arguments

xprt

A pointer to an RPC server handle created by any of the server handle creation routines.

Description

Activation of a transport handle involves setting the most appropriate bit for the socket associated with xprt in the svc_fds mask. When svc_run() is invoked, activity on the transport handle is eligible to be processed by the server.

The svc_register routine calls this routine; therefore, you are unlikely to use this routine directly.


Return Values

None  


Previous Next Contents Index