Address Management Functions
The TI-RPC library functions interface with either portmap or rpcbind. Because the services of the
programs differ, there are two sets of functions, one for each service.
The following functions work with portmap:
pmap_set
pmap_unset
pmap_getport
pmap_getmaps
pmap_rmtcall
|
The following functions work with rpcbind:
rpcb_set
rpcb_unset
rpcb_getaddr
rpcb_getmaps
rpcb_rmtcall
|
Authentication Functions
The following calls have the same functionality as in previous releases.
They are supported for backward compatibility only.
authdes_create
authunix_create
authunix_create_default
authdes_seccreate
authsys_create
authsys_create_default
|
Other Functions
rpcbind provides a time service, primarily for use
by secure RPC client-server time synchronization, available through the rpcb_gettime() function. pmap_getport() and rpcb_getaddr() can be used to get the port number of a registered
service. rpcb_getaddr() communicates with any server running
version 2, 3, or 4 of rcpbind. pmap_getport()
can only communicate with version 2.
Comparison Examples
The changes in client creation from TS-RPC to TI-RPC are illustrated
in Example 6-1 and Example 6-2. Each
example:
Creates a UDP descriptor
Contacts the remote host's RPC binding process to get the
service's address
Binds the remote service's address to the descriptor
Creates the client handle and set its timeout
Example 6-1 Client Creation in TS-RPC
struct hostent *h;
struct sockaddr_in sin;
int sock = RPC_ANYSOCK;
u_short port;
struct timeval wait;
if ((h = gethostbyname( "host" )) == (struct hostent *) NULL)
{
syslog(LOG_ERR, "gethostbyname failed");
exit(1);
}
sin.sin_addr.s_addr = *(u_int *) hp->h_addr;
if ((port = pmap_getport(&sin, PROGRAM, VERSION, "udp")) == 0) {
syslog (LOG_ERR, "pmap_getport failed");
exit(1);
} else
sin.sin_port = htons(port);
wait.tv_sec = 25;
wait.tv_usec = 0;
clntudp_create(&sin, PROGRAM, VERSION, wait, &sock);
|
The TI-RPC version of client creation, shown in the following example,
assumes that the UDP transport has the netid udp. A netid is not necessarily a well-known
name.
Example 6-2 Client Creation in TI-RPC
struct netconfig *nconf;
struct netconfig *getnetconfigent();
struct t_bind *tbind;
struct timeval wait;
nconf = getnetconfigent("udp");
if (nconf == (struct netconfig *) NULL) {
syslog(LOG_ERR, "getnetconfigent for udp failed");
exit(1);
}
fd = t_open(nconf->nc_device, O_RDWR, (struct t_info *)NULL);
if (fd == -1) {
syslog(LOG_ERR, "t_open failed");
exit(1);
}
tbind = (struct t_bind *) t_alloc(fd, T_BIND, T_ADDR);
if (tbind == (struct t_bind *) NULL) {
syslog(LOG_ERR, "t_bind failed");
exit(1);
}
if (rpcb_getaddr( PROGRAM, VERSION, nconf, &tbind->addr, "host")
== FALSE) {
syslog(LOG_ERR, "rpcb_getaddr failed");
exit(1);
}
cl = clnt_tli_create(fd, nconf, &tbind->addr, PROGRAM, VERSION,
0, 0);
(void) t_free((char *) tbind, T_BIND);
if (cl == (CLIENT *) NULL) {
syslog(LOG_ERR, "clnt_tli_create failed");
exit(1);
}
wait.tv_sec = 25;
wait.tv_usec = 0;
clnt_control(cl, CLSET_TIMEOUT, (char *) &wait);
|
Example 6-3 and Example 6-4 show
the differences between broadcast in TS-RPC and TI-RPC. The older clnt_broadcast() is similar to the newer rpc_broadcast(). The primary difference is in the collectnames()
function: it deletes duplicate addresses and displays the names of hosts that
reply to the broadcast.
Example 6-3 Broadcast in TS-RPC
statstime sw;
extern int collectnames();
clnt_broadcast(RSTATPROG, RSTATVERS_TIME, RSTATPROC_STATS,
xdr_void, NULL, xdr_statstime, &sw, collectnames);
...
collectnames(resultsp, raddrp)
char *resultsp;
struct sockaddr_in *raddrp;
{
u_int addr;
struct entry *entryp, *lim;
struct hostent *hp;
extern int curentry;
/* weed out duplicates */
addr = raddrp->sin_addr.s_addr;
lim = entry + curentry;
for (entryp = entry; entryp < lim; entryp++)
if (addr == entryp->addr)
return (0);
...
/* print the host's name (if possible) or address */
hp = gethostbyaddr(&raddrp->sin_addr.s_addr, sizeof(u_int),
AF_INET);
if( hp == (struct hostent *) NULL)
printf("0x%x", addr);
else
printf("%s", hp->h_name);
}
|